Index: media/audio/win/audio_low_latency_output_win.h |
diff --git a/media/audio/win/audio_low_latency_output_win.h b/media/audio/win/audio_low_latency_output_win.h |
index 2c217ccf976b1e3023ad71fd68f53e3abfd57ce1..73251003e7a7239e31d1dd1da256852c47f06702 100644 |
--- a/media/audio/win/audio_low_latency_output_win.h |
+++ b/media/audio/win/audio_low_latency_output_win.h |
@@ -182,9 +182,19 @@ class MEDIA_EXPORT WASAPIAudioOutputStream |
virtual void SetVolume(double volume) OVERRIDE; |
virtual void GetVolume(double* volume) OVERRIDE; |
- // Retrieves the stream format that the audio engine uses for its internal |
- // processing/mixing of shared-mode streams. |
- // This method should not be used in combination with exclusive-mode streams. |
+ // Retrieves the number of channels the audio engine uses for its internal |
+ // processing/mixing of shared-mode streams for the default endpoint device. |
+ static int HardwareChannelCount(); |
+ |
+ // Retrieves the channel layout the audio engine uses for its internal |
+ // processing/mixing of shared-mode streams for the default endpoint device. |
+ // Note that we convert an internal channel layout mask (see ChannelMask()) |
+ // into a Chrome-specific channel layout enumerator in this method, hence |
+ // the match might not be perfect. |
+ static ChannelLayout HardwareChannelLayout(); |
+ |
+ // Retrieves the sample rate the audio engine uses for its internal |
+ // processing/mixing of shared-mode streams for the default endpoint device. |
static int HardwareSampleRate(ERole device_role); |
// Returns AUDCLNT_SHAREMODE_EXCLUSIVE if --enable-exclusive-mode is used |
@@ -237,6 +247,10 @@ class MEDIA_EXPORT WASAPIAudioOutputStream |
bool DesiredFormatIsSupported(); |
HRESULT InitializeAudioEngine(); |
+ // Retrieves the stream format that the audio engine uses for its internal |
+ // processing/mixing of shared-mode streams. |
+ static HRESULT GetMixFormat(ERole device_role, WAVEFORMATEX** device_format); |
scherkus (not reviewing)
2012/08/01 00:14:05
any reason static private methods need to be here?
henrika (OOO until Aug 14)
2012/08/01 16:11:09
Great input, thanks. I actually did use private me
scherkus (not reviewing)
2012/08/02 00:41:57
Above the function.
|
+ |
// Called when the device will be opened in shared mode and use the |
// internal audio engine's mix format. |
HRESULT SharedModeInitialization(); |
@@ -255,7 +269,32 @@ class MEDIA_EXPORT WASAPIAudioOutputStream |
// new default audio device. |
bool RestartRenderingUsingNewDefaultDevice(); |
+ // Retrieves an integer mask which corresponds to the channel layout the |
+ // audio engine uses for its internal processing/mixing of shared-mode |
+ // streams. This mask indicates which channels are present in the multi- |
+ // channel stream. The least significant bit corresponds with the Front Left |
+ // speaker, the next least significant bit corresponds to the Front Right |
+ // speaker, and so on, continuing in the order defined in KsMedia.h. |
+ // See http://msdn.microsoft.com/en-us/library/windows/hardware/ff537083(v=vs.85).aspx |
+ // for more details. |
+ static uint32 ChannelConfig(); |
tommi (sloooow) - chröme
2012/07/31 21:39:30
Maybe we could define our own type for channel con
henrika (OOO until Aug 14)
2012/08/01 16:11:09
Added typedef ChannelConfigMask in media. Got conf
|
+ |
+ // Converts Microsoft's channel configuration to Chrome's ChannelLayout. |
+ // This mapping is not perfect but the best we can do given the current |
+ // ChannelLayout enumerator and the Windows-specific speaker configurations |
+ // defined in ksmedia.h. Don't assume that the channel ordering in |
+ // ChannelLayout is exactly the same as the Windows specific configuration. |
+ // As an example: KSAUDIO_SPEAKER_7POINT1_SURROUND is mapped to |
+ // CHANNEL_LAYOUT_7_1 but the positions of Back L, Back R and Side L, Side R |
+ // speakers are different in these two definitions. |
+ static ChannelLayout ChannelConfigToChromeChannelLayout(uint32 layout); |
+ |
AUDCLNT_SHAREMODE share_mode() const { return share_mode_; } |
+ int endpoint_channel_count() const { return endpoint_channel_count_; } |
scherkus (not reviewing)
2012/08/01 00:14:05
huh? these are all private methods -- why the acce
henrika (OOO until Aug 14)
2012/08/01 16:11:09
Got it. Will clean up.
|
+ uint32 endpoint_channel_config() const { return endpoint_channel_config_; } |
+ int client_channel_count() const { |
+ return client_audio_parameters_.channels(); |
+ } |
// Initializes the COM library for use by the calling thread and sets the |
// thread's concurrency model to multi-threaded. |
@@ -267,17 +306,21 @@ class MEDIA_EXPORT WASAPIAudioOutputStream |
// Our creator, the audio manager needs to be notified when we close. |
AudioManagerWin* manager_; |
+ AudioParameters client_audio_parameters_; |
tommi (sloooow) - chröme
2012/07/31 21:39:30
are there any other audio parameters that this cla
henrika (OOO until Aug 14)
2012/08/01 16:11:09
I store this one to keep track of the parameters s
|
+ |
// Rendering is driven by this thread (which has no message loop). |
// All OnMoreData() callbacks will be called from this thread. |
base::DelegateSimpleThread* render_thread_; |
// Contains the desired audio format which is set up at construction. |
- WAVEFORMATEX format_; |
+ // Extended PCM waveform format structure based on WAVEFORMATEXTENSIBLE. |
+ // Use this for multiple channel and hi-resolution PCM data. |
+ WAVEFORMATPCMEX format_; |
// Copy of the audio format which we know the audio engine supports. |
// It is recommended to ensure that the sample rate in |format_| is identical |
// to the sample rate in |audio_engine_mix_format_|. |
- base::win::ScopedCoMem<WAVEFORMATEX> audio_engine_mix_format_; |
+ base::win::ScopedCoMem<WAVEFORMATPCMEX> audio_engine_mix_format_; |
bool opened_; |
bool started_; |
@@ -316,6 +359,18 @@ class MEDIA_EXPORT WASAPIAudioOutputStream |
// where AUDCLNT_SHAREMODE_SHARED is the default. |
AUDCLNT_SHAREMODE share_mode_; |
+ // Contains the number of channels the audio engine uses for its internal |
+ // processing/mixing of shared-mode streams for the default endpoint device. |
+ const int endpoint_channel_count_; |
+ |
+ // Contains the channel configuration the audio engine uses for its internal |
+ // processing/mixing of shared-mode streams for the default endpoint |
+ // device. |
+ const uint32 endpoint_channel_config_; |
+ |
+ // TODO(henrika): add comments.... |
+ int channel_factor_; |
+ |
// Counts the number of audio frames written to the endpoint buffer. |
UINT64 num_written_frames_; |