Andrew Eikum : wineandroid: Support 32-bit float audio format.
Alexandre Julliard
julliard at winehq.org
Fri Oct 6 14:58:53 CDT 2017
Module: wine
Branch: master
Commit: b4c0b77b03d6588efe6ad800e4659e3f017d81bf
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b4c0b77b03d6588efe6ad800e4659e3f017d81bf
Author: Andrew Eikum <aeikum at codeweavers.com>
Date: Fri Oct 6 11:20:37 2017 -0500
wineandroid: Support 32-bit float audio format.
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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;
}
More information about the wine-cvs
mailing list