Actualmente solo admite 8 y 16 bits
Fuentes:
- Androide código fuente (Línea 60)
- Artículo (Formato de datos de PCM sección)
Pregunta
Estoy tratando de decodificar un archivo FLAC con formato de muestra de 24 bits usando OpenSl ES en Android. Originalmente, tenía mi SLDataFormat_PCM
Para el SLDataSink
Configuración como esta.
_pcm.formatType = SL_DATAFORMAT_PCM;
_pcm.numChannels = 2;
_pcm.samplesPerSec = SL_SAMPLINGRATE_44_1;
_pcm.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;
_pcm.containerSize = SL_PCMSAMPLEFORMAT_FIXED_16;
_pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
_pcm.endianness = SL_BYTEORDER_LITTLEENDIAN;
Esto funciona bien para básicamente cualquier formato de datos. Por suerte el samplesPerSec
no es respetado (no quiero volver a muestrear).
Ahora quiero admitir la profundidad completa de un archivo FLAC con muestras de 24 bits. Al usar este formato, aparentemente realiza una conversión un poco profunda, porque una vez que carga el archivo y luego verifique el ANDROID_KEY_PCMFORMAT_BITSPERSAMPLE
Información, es 16.
Cuando puse bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_24;
o SL_PCMSAMPLEFORMAT_FIXED_32
, luego opensl es lo rechaza
E/libOpenSLES(22706): pAudioSnk: bitsPerSample=32
W/libOpenSLES(22706): Leaving Engine::CreateAudioPlayer (SL_RESULT_CONTENT_UNSUPPORTED)
¿Alguna idea de cómo esto debe funcionar? ¿Android está actualmente restringido a 16 bits int únicamente? También aceptaría un flotador de 32 bits, pero no supongo que eso tampoco funcionará.
Solución
Actualmente solo admite 8 y 16 bits
Fuentes: