@@ -222,7 +222,15 @@ BOOL IsFormatSupported (IMMDevice* pDevice, WORD nChannels, DWORD nSampleRate, A
222222 waveFormat.Format .cbSize = sizeof (WAVEFORMATEXTENSIBLE) - sizeof (WAVEFORMATEX);
223223 waveFormat.Samples .wValidBitsPerSample = waveFormat.Format .wBitsPerSample ;
224224 waveFormat.dwChannelMask = dwChannelMask;
225- waveFormat.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
225+ // test native support for 32-bit float first
226+ waveFormat.SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT;
227+
228+ hr = pAudioClient->IsFormatSupported (shareMode, (WAVEFORMATEX*)&waveFormat, NULL );
229+ if (hr == S_OK)
230+ return TRUE ;
231+
232+ // then try integer formats, first 32-bit int
233+ waveFormat.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
226234
227235 hr = pAudioClient->IsFormatSupported (shareMode, (WAVEFORMATEX*)&waveFormat, NULL );
228236 if (hr == S_OK)
@@ -354,9 +362,18 @@ BOOL FindStreamFormat(IMMDevice * pDevice, int nChannels,int nSampleRate, int& n
354362 waveFormat.Format .cbSize = sizeof (WAVEFORMATEXTENSIBLE)-sizeof (WAVEFORMATEX);
355363 waveFormat.Samples .wValidBitsPerSample =waveFormat.Format .wBitsPerSample ;
356364 waveFormat.dwChannelMask = dwChannelMask;
357- waveFormat.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
365+ // test for native support for 32-bit float first
366+ waveFormat.SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT;
358367
359368 pAudioClient = getAudioClient (pDevice,(WAVEFORMATEX*)&waveFormat, nbufferSize);
369+
370+ if (pAudioClient)
371+ goto Finish;
372+
373+ // then try integer formats, first 32-bit int
374+ waveFormat.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
375+
376+ pAudioClient = getAudioClient (pDevice, (WAVEFORMATEX*)&waveFormat, nbufferSize);
360377
361378 if (pAudioClient)
362379 goto Finish;
@@ -418,17 +435,20 @@ STDMETHODIMP ASIO2WASAPI::NonDelegatingQueryInterface (REFIID riid, void ** ppv)
418435
419436ASIOSampleType ASIO2WASAPI::getASIOSampleType () const
420437{
438+ if (m_waveFormat.SubFormat == KSDATAFORMAT_SUBTYPE_IEEE_FLOAT) return ASIOSTFloat32LSB;
439+
421440 switch (m_waveFormat.Format .wBitsPerSample )
422441 {
423442 case 16 : return ASIOSTInt16LSB;
424443 case 24 : return ASIOSTInt24LSB;
425- case 32 :
426- switch (m_waveFormat.Samples .wValidBitsPerSample )
444+ case 32 : return ASIOSTInt32LSB;
445+ /* switch (m_waveFormat.Samples.wValidBitsPerSample)
427446 {
428447 case 32: return ASIOSTInt32LSB;
429448 case 24: return ASIOSTInt32LSB; //falco: In case of 24-bit data Windows simply chops the last 8 bits. No special alignment needed. ASIOSTInt32LSB24 is simply wrong.
430449 default: return ASIOSTLastEntry ;
431450 }
451+ */
432452 default : return ASIOSTLastEntry;
433453 }
434454}
@@ -636,7 +656,7 @@ BOOL CALLBACK ASIO2WASAPI::ControlPanelProc(HWND hwndDlg,
636656 }
637657
638658 wchar_t tmpBuff[8 ] = { 0 };
639- for (UINT i = 2 ; i < 40 ; i = i + 2 )
659+ for (UINT i = 2 ; i < 32 ; i += 2 )
640660 {
641661 if (IsFormatSupported (pDevice, i, 48000 , AUDCLNT_SHAREMODE_EXCLUSIVE))
642662 {
0 commit comments