Невозможно создать аудиоплеер через OpenSL ES - PullRequest
0 голосов
/ 16 мая 2011

Я пытался создать аудиоплеер с помощью 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() - метод проверки ошибок, определяемый пользователем.

У кого-нибудь есть идеи, почему это не получится? Как я уже сказал, все параметры выглядят для меня корректными, и я проверил наличие недопустимых комбинаций в объектах источника, выходного микса или приемника, которых не было ...

Ответы [ 2 ]

4 голосов
/ 03 апреля 2012

Это не порядок, в котором вы устанавливаете поля, ни значение для containerSize, которое имело значение.Я чувствую, что ваша проблема была решена путем установки правильного значения для channelMask.

pcm.channelMask = SL_SPEAKER_FRONT_CENTER; 

вместо

pcm.channelMask = SL_SPEAKER_BACK_CENTER;
0 голосов
/ 16 мая 2011

Я исправил это не по хорошей, достаточной документации, а по счастливой случайности. Оказывается, что мои свойства PCM в объекте SLDataFormat_PCM были не в правильном порядке ....

Когда я изменил его на:

// Configure data format.
SLDataFormat_PCM pcm;
pcm.formatType = SL_DATAFORMAT_PCM;
pcm.numChannels = 1;
pcm.samplesPerSec = SL_SAMPLINGRATE_8;
pcm.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;
pcm.containerSize = SL_PCMSAMPLEFORMAT_FIXED_16;
pcm.channelMask = SL_SPEAKER_FRONT_CENTER;
pcm.endianness = SL_BYTEORDER_LITTLEENDIAN;

это создаст AudioPlayer без заминки ...

Я не знаю, почему это произошло, хотя, может быть, это потому, что это структура, которая должна быть задана в правильной последовательности? Я не знаю ... Я не могу себе это представить, хотя ... Если только это не карта памяти для одной или нескольких переменных, в которой я могу представить ....

В любом случае, я исправил это ... вздох

...