diff --git a/api_wasapi_windows.go b/api_wasapi_windows.go index b5a051a..afb4d29 100644 --- a/api_wasapi_windows.go +++ b/api_wasapi_windows.go @@ -41,16 +41,17 @@ var ( ) const ( - _AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM = 0x80000000 - _AUDCLNT_STREAMFLAGS_EVENTCALLBACK = 0x00040000 - _AUDCLNT_STREAMFLAGS_NOPERSIST = 0x00080000 - _COINIT_APARTMENTTHREADED = 0x2 - _COINIT_MULTITHREADED = 0 - _REFTIMES_PER_SEC = 10000000 - _SPEAKER_FRONT_CENTER = 0x4 - _SPEAKER_FRONT_LEFT = 0x1 - _SPEAKER_FRONT_RIGHT = 0x2 - _WAVE_FORMAT_EXTENSIBLE = 0xfffe + _AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM = 0x80000000 + _AUDCLNT_STREAMFLAGS_EVENTCALLBACK = 0x00040000 + _AUDCLNT_STREAMFLAGS_NOPERSIST = 0x00080000 + _AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY = 0x08000000 + _COINIT_APARTMENTTHREADED = 0x2 + _COINIT_MULTITHREADED = 0 + _REFTIMES_PER_SEC = 10000000 + _SPEAKER_FRONT_CENTER = 0x4 + _SPEAKER_FRONT_LEFT = 0x1 + _SPEAKER_FRONT_RIGHT = 0x2 + _WAVE_FORMAT_EXTENSIBLE = 0xfffe ) var ( diff --git a/driver_wasapi_windows.go b/driver_wasapi_windows.go index bfe4a3e..f33612d 100644 --- a/driver_wasapi_windows.go +++ b/driver_wasapi_windows.go @@ -278,8 +278,11 @@ func (c *wasapiContext) startOnCOMThread() (ferr error) { // Even if the sample rate and/or the number of channels are not supported by the audio driver, // AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM should convert the sample rate automatically (#215). + // AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY used together with + // AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM tells WASAPI to use a high-quality + // resampler. Without it, 44100 source played on a 48000 device sounds bad. if err := c.client.Initialize(_AUDCLNT_SHAREMODE_SHARED, - _AUDCLNT_STREAMFLAGS_EVENTCALLBACK|_AUDCLNT_STREAMFLAGS_NOPERSIST|_AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM, + _AUDCLNT_STREAMFLAGS_EVENTCALLBACK|_AUDCLNT_STREAMFLAGS_NOPERSIST|_AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM|_AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY, bufferSizeIn100ns, 0, f, nil); err != nil { return err }