Module: wine Branch: master Commit: b4c0b77b03d6588efe6ad800e4659e3f017d81bf URL: http://source.winehq.org/git/wine.git/?a=commit;h=b4c0b77b03d6588efe6ad800e4...
Author: Andrew Eikum aeikum@codeweavers.com Date: Fri Oct 6 11:20:37 2017 -0500
wineandroid: Support 32-bit float audio format.
Signed-off-by: Andrew Eikum aeikum@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/wineandroid.drv/build.gradle.in | 2 +- dlls/wineandroid.drv/mmdevdrv.c | 36 ++++++++++++++++++++++-------------- 2 files changed, 23 insertions(+), 15 deletions(-)
diff --git a/dlls/wineandroid.drv/build.gradle.in b/dlls/wineandroid.drv/build.gradle.in index 53633b7..4bd98b9 100644 --- a/dlls/wineandroid.drv/build.gradle.in +++ b/dlls/wineandroid.drv/build.gradle.in @@ -58,7 +58,7 @@ tasks.whenTaskAdded { t ->
android { - compileSdkVersion 17 + compileSdkVersion 21 buildToolsVersion "25.0.3"
defaultConfig diff --git a/dlls/wineandroid.drv/mmdevdrv.c b/dlls/wineandroid.drv/mmdevdrv.c index c138fb8..8f428a8 100644 --- a/dlls/wineandroid.drv/mmdevdrv.c +++ b/dlls/wineandroid.drv/mmdevdrv.c @@ -649,23 +649,36 @@ static HRESULT get_audio_session(const GUID *sessionguid,
static HRESULT waveformat_to_pcm(ACImpl *This, const WAVEFORMATEX *fmt, SLAndroidDataFormat_PCM_EX *pcm) { - /* only support non-float PCM */ - if(fmt->wFormatTag != WAVE_FORMAT_PCM && - !(fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE && - IsEqualGUID(&((WAVEFORMATEXTENSIBLE*)fmt)->SubFormat, &KSDATAFORMAT_SUBTYPE_PCM))) - return AUDCLNT_E_UNSUPPORTED_FORMAT; - - /* TODO: does android only support 16-bit PCM? */ - if(fmt->nSamplesPerSec < 8000 || fmt->nSamplesPerSec > 48000) return AUDCLNT_E_UNSUPPORTED_FORMAT;
pcm->formatType = SL_ANDROID_DATAFORMAT_PCM_EX; - pcm->numChannels = fmt->nChannels; + pcm->sampleRate = fmt->nSamplesPerSec * 1000; /* sampleRate is in milli-Hz */ pcm->bitsPerSample = fmt->wBitsPerSample; pcm->containerSize = fmt->wBitsPerSample; + + if(fmt->wFormatTag == WAVE_FORMAT_PCM || + (fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE && + IsEqualGUID(&((WAVEFORMATEXTENSIBLE*)fmt)->SubFormat, &KSDATAFORMAT_SUBTYPE_PCM))){ + if(pcm->bitsPerSample == 8) + pcm->representation = SL_ANDROID_PCM_REPRESENTATION_UNSIGNED_INT; + else if(pcm->bitsPerSample == 16) + pcm->representation = SL_ANDROID_PCM_REPRESENTATION_SIGNED_INT; + else + return AUDCLNT_E_UNSUPPORTED_FORMAT; + }else if(fmt->wFormatTag == WAVE_FORMAT_IEEE_FLOAT || + (fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE && + IsEqualGUID(&((WAVEFORMATEXTENSIBLE*)fmt)->SubFormat, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT))){ + if(pcm->bitsPerSample == 32) + pcm->representation = SL_ANDROID_PCM_REPRESENTATION_FLOAT; + else + return AUDCLNT_E_UNSUPPORTED_FORMAT; + }else + return AUDCLNT_E_UNSUPPORTED_FORMAT; + /* only up to stereo */ + pcm->numChannels = fmt->nChannels; if(pcm->numChannels == 1) pcm->channelMask = SL_SPEAKER_FRONT_CENTER; else if(This->dataflow == eRender && pcm->numChannels == 2) @@ -675,11 +688,6 @@ static HRESULT waveformat_to_pcm(ACImpl *This, const WAVEFORMATEX *fmt, SLAndroi
pcm->endianness = SL_BYTEORDER_LITTLEENDIAN;
- if(pcm->bitsPerSample == 8) - pcm->representation = SL_ANDROID_PCM_REPRESENTATION_UNSIGNED_INT; - else - pcm->representation = SL_ANDROID_PCM_REPRESENTATION_SIGNED_INT; - return S_OK; }