Atualmente, ele suporta apenas 8 e 16 bits
Fontes:
- Android Código fonte (Linha 60)
- Artigo (Formato de dados PCM seção)
Pergunta
Estou tentando decodificar um arquivo FLAC com formato de amostra de 24 bits usando openl es no Android. Originalmente, eu tinha meu SLDataFormat_PCM
para o SLDataSink
Configuração assim.
_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;
Isso está funcionando bem para basicamente qualquer formato de dados. Felizmente o samplesPerSec
não é respeitado (não quero reamostragem).
Agora, quero suportar a profundidade completa de um arquivo FLAC com amostras de 24 bits. Ao usar este formato, ele aparentemente executa uma conversão em profundidade, porque uma vez carrego o arquivo e verifique o ANDROID_KEY_PCMFORMAT_BITSPERSAMPLE
Informações, são 16.
Quando eu coloquei bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_24;
ou SL_PCMSAMPLEFORMAT_FIXED_32
, então abre es rejeita
E/libOpenSLES(22706): pAudioSnk: bitsPerSample=32
W/libOpenSLES(22706): Leaving Engine::CreateAudioPlayer (SL_RESULT_CONTENT_UNSUPPORTED)
Alguma ideia de como isso deve funcionar? O Android está atualmente restrito a apenas 16 bits int? Eu também aceitaria flutuação de 32 bits, mas acho que também não funcionaria.
Solução
Atualmente, ele suporta apenas 8 e 16 bits
Fontes: