OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/audio/win/core_audio_util_win.h" | 5 #include "media/audio/win/core_audio_util_win.h" |
6 | 6 |
7 #include <Audioclient.h> | 7 #include <Audioclient.h> |
8 #include <Functiondiscoverykeys_devpkey.h> | 8 #include <Functiondiscoverykeys_devpkey.h> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
542 | 542 |
543 // Get access to the IAudioRenderClient interface. This interface | 543 // Get access to the IAudioRenderClient interface. This interface |
544 // enables us to write output data to a rendering endpoint buffer. | 544 // enables us to write output data to a rendering endpoint buffer. |
545 ScopedComPtr<IAudioRenderClient> audio_render_client; | 545 ScopedComPtr<IAudioRenderClient> audio_render_client; |
546 HRESULT hr = client->GetService(__uuidof(IAudioRenderClient), | 546 HRESULT hr = client->GetService(__uuidof(IAudioRenderClient), |
547 audio_render_client.ReceiveVoid()); | 547 audio_render_client.ReceiveVoid()); |
548 if (FAILED(hr)) { | 548 if (FAILED(hr)) { |
549 DVLOG(1) << "IAudioClient::GetService: " << std::hex << hr; | 549 DVLOG(1) << "IAudioClient::GetService: " << std::hex << hr; |
550 return ScopedComPtr<IAudioRenderClient>(); | 550 return ScopedComPtr<IAudioRenderClient>(); |
551 } | 551 } |
552 | |
553 // TODO(henrika): verify that this scheme is the same for shared mode and | |
554 // exclusive mode streams. | |
555 | |
556 // Avoid start-up glitches by filling up the endpoint buffer with "silence" | |
557 // before starting the stream. | |
558 UINT32 endpoint_buffer_size = 0; | |
559 hr = client->GetBufferSize(&endpoint_buffer_size); | |
560 DVLOG_IF(1, FAILED(hr)) << "IAudioClient::GetBufferSize: " << std::hex << hr; | |
561 | |
562 BYTE* data = NULL; | |
563 hr = audio_render_client->GetBuffer(endpoint_buffer_size, &data); | |
564 DVLOG_IF(1, FAILED(hr)) << "IAudioRenderClient::GetBuffer: " | |
565 << std::hex << hr; | |
566 if (SUCCEEDED(hr)) { | |
567 // Using the AUDCLNT_BUFFERFLAGS_SILENT flag eliminates the need to | |
568 // explicitly write silence data to the rendering buffer. | |
569 hr = audio_render_client->ReleaseBuffer(endpoint_buffer_size, | |
570 AUDCLNT_BUFFERFLAGS_SILENT); | |
571 DVLOG_IF(1, FAILED(hr)) << "IAudioRenderClient::ReleaseBuffer: " | |
572 << std::hex << hr; | |
573 } | |
574 | |
575 // Sanity check: verify that the endpoint buffer is filled with silence. | |
576 UINT32 num_queued_frames = 0; | |
577 client->GetCurrentPadding(&num_queued_frames); | |
578 DCHECK(num_queued_frames == endpoint_buffer_size); | |
579 | |
580 return audio_render_client; | 552 return audio_render_client; |
581 } | 553 } |
582 | 554 |
583 ScopedComPtr<IAudioCaptureClient> CoreAudioUtil::CreateCaptureClient( | 555 ScopedComPtr<IAudioCaptureClient> CoreAudioUtil::CreateCaptureClient( |
584 IAudioClient* client) { | 556 IAudioClient* client) { |
585 DCHECK(CoreAudioUtil::IsSupported()); | 557 DCHECK(CoreAudioUtil::IsSupported()); |
586 | 558 |
587 // Get access to the IAudioCaptureClient interface. This interface | 559 // Get access to the IAudioCaptureClient interface. This interface |
588 // enables us to read input data from a capturing endpoint buffer. | 560 // enables us to read input data from a capturing endpoint buffer. |
589 ScopedComPtr<IAudioCaptureClient> audio_capture_client; | 561 ScopedComPtr<IAudioCaptureClient> audio_capture_client; |
590 HRESULT hr = client->GetService(__uuidof(IAudioCaptureClient), | 562 HRESULT hr = client->GetService(__uuidof(IAudioCaptureClient), |
591 audio_capture_client.ReceiveVoid()); | 563 audio_capture_client.ReceiveVoid()); |
592 if (FAILED(hr)) { | 564 if (FAILED(hr)) { |
593 DVLOG(1) << "IAudioClient::GetService: " << std::hex << hr; | 565 DVLOG(1) << "IAudioClient::GetService: " << std::hex << hr; |
594 return ScopedComPtr<IAudioCaptureClient>(); | 566 return ScopedComPtr<IAudioCaptureClient>(); |
595 } | 567 } |
596 return audio_capture_client; | 568 return audio_capture_client; |
597 } | 569 } |
598 | 570 |
599 } // namespace media | 571 } // namespace media |
OLD | NEW |