Я пытался создать аудиоплеер с помощью API OpenSL ES для Android. Тем не менее, я получаю сообщение об ошибке, когда пытаюсь запустить свой код, который сигнализирует, что я ввел неверный параметр для CreateAudioPlayer()
:
05-16 12:16:40.593: ERROR/libOpenSLES(2020): channelMask=0x100 numChannels=1
05-16 12:16:40.593: ERROR/AudioProcessor_Native(2020): Invalid parameter found
05-16 12:16:40.593: ERROR/AudioProcessor_Native(2020): Unable to create player object
Однако я не смог найти ни одного плохого или неверного параметра. Я проверил любой из них и не нашел в Интернете ничего, что указывало бы на то, что моя комбинация недействительна. Код выглядит так:
JNIEXPORT jboolean JNICALL Java_org_test_opensl_AudioProcessor_initPlayer(JNIEnv* env, jobject thiz){
SLresult result;
// Configure Buffer Queue.
SLDataLocator_AndroidSimpleBufferQueue bufferQueue;
bufferQueue.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE;
bufferQueue.numBuffers = MAX_BUFFERS;
// Configure data format.
SLDataFormat_PCM pcm;
pcm.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;
pcm.channelMask = SL_SPEAKER_BACK_CENTER;
pcm.containerSize = 16;
pcm.endianness = SL_BYTEORDER_LITTLEENDIAN;
pcm.formatType = SL_DATAFORMAT_PCM;
pcm.numChannels = 1;
pcm.samplesPerSec = SL_SAMPLINGRATE_8;
// Configure Audio Source.
SLDataSource source;
source.pFormat = &pcm;
source.pLocator = &bufferQueue;
// Configure output mix.
SLDataLocator_OutputMix outputMix;
outputMix.locatorType = SL_DATALOCATOR_OUTPUTMIX;
outputMix.outputMix = outputMixObject;
// Configure Audio sink.
SLDataSink sink;
sink.pFormat = NULL;
sink.pLocator = &outputMix;
// Create Audio player.
const SLInterfaceID ids[1] = {SL_IID_ANDROIDSIMPLEBUFFERQUEUE};
const SLboolean req[1] = {SL_BOOLEAN_TRUE};
result = (*engineInstance)->CreateAudioPlayer(engineInstance, &playerObject, &source,
&sink, 1, ids, req);
if(checkError(result, "Unable to create player object") == -1){
return JNI_FALSE;
}
// Realize Audio player.
result = (*playerObject)->Realize(playerObject, SL_BOOLEAN_FALSE);
if(checkError(result, "Unable to realize player object") == -1){
return JNI_FALSE;
}
// Get the Audio player interface.
result = (*playerObject)->GetInterface(playerObject, SL_IID_PLAY, &playerInstance);
if(checkError(result, "Unable to get player interface") == -1){
return JNI_FALSE;
}
// Get the Player Buffer Queue interface.
result = (*playerObject)->GetInterface(playerObject, SL_IID_BUFFERQUEUE,
&playerBufferQueue);
if(checkError(result, "Unable to get player buffer interface") == -1){
return JNI_FALSE;
}
// Set the player's state to playing.
result = (*playerInstance)->SetPlayState(playerInstance, SL_PLAYSTATE_PLAYING);
if(checkError(result, "Unable to set player's state to playing") == -1){
return JNI_FALSE;
}
return JNI_TRUE;
}
Где checkError()
- метод проверки ошибок, определяемый пользователем.
У кого-нибудь есть идеи, почему это не получится? Как я уже сказал, все параметры выглядят для меня корректными, и я проверил наличие недопустимых комбинаций в объектах источника, выходного микса или приемника, которых не было ...