2016-06-02 16 views
1

OpenSc 컨텍스트를 만들고 사운드를 재생할 수 있도록 관리했습니다.
하지만 여전히 문제가 있습니다. 내 플레이어 samplesPerSec44.100 Hz으로 설정했지만 실제로는 ~ 70.000 Hz에서 실행됩니다. 어떻게 그 문제를 해결할 수 있을까요?Android에서 OpenSL이 더 높은 속도로 재생됩니다.

잘 나는 내가 (Source Code에서 전체) 한 일을 보여 드리겠습니다 : 나는 OpenSL를 초기화하고 내 SLAndroidSimpleBufferQueueItf에 버퍼를 대기열에 시작 해요 PolyOpenSLInterface.cpp에서

. 나는 다음과 같은 방법을 플레이어를 만들 :

내 등록 된 콜백 (나는 이미 사용 된 버퍼를 가지고 그것으로 다음 샘플을 작성하고 다시 버퍼를 대기열) 다음과 같습니다
SLDataLocator_AndroidSimpleBufferQueue lDataLocatorIn; 
lDataLocatorIn.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE; 
lDataLocatorIn.numBuffers = 1; 

SLDataFormat_PCM lDataFormat; 
lDataFormat.formatType = SL_DATAFORMAT_PCM; 
lDataFormat.numChannels = POLY_NUM_CHANNELS; 
lDataFormat.samplesPerSec = SL_SAMPLINGRATE_44_1; //sampling rate 44.100Hz 
lDataFormat.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16; 
lDataFormat.containerSize = SL_PCMSAMPLEFORMAT_FIXED_16; 
if(POLY_NUM_CHANNELS > 1){ 
    lDataFormat.channelMask = SL_SPEAKER_FRONT_RIGHT | SL_SPEAKER_FRONT_LEFT; 
} else { 
    lDataFormat.channelMask = SL_SPEAKER_FRONT_CENTER; 
} 
lDataFormat.endianness = SL_BYTEORDER_LITTLEENDIAN; 

SLDataSource lDataSource; 
lDataSource.pLocator = &lDataLocatorIn; 
lDataSource.pFormat = &lDataFormat; 

SLDataLocator_OutputMix lDataLocatorOut; 
lDataLocatorOut.locatorType = SL_DATALOCATOR_OUTPUTMIX; 
lDataLocatorOut.outputMix = mOutputMixObj; 

SLDataSink lDataSink; 
lDataSink.pLocator = &lDataLocatorOut; 
lDataSink.pFormat = NULL; 

const SLuint32 lSoundPlayerIIDCount = 2; 
const SLInterfaceID lSoundPlayerIIDs[] = { SL_IID_PLAY, SL_IID_ANDROIDSIMPLEBUFFERQUEUE }; 
const SLboolean lSoundPlayerReqs[] = { SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE }; 

lRes = (*mEngine)->CreateAudioPlayer(mEngine, &mPlayerObj, &lDataSource, &lDataSink, lSoundPlayerIIDCount, lSoundPlayerIIDs, lSoundPlayerReqs); 
lRes = (*mPlayerObj)->Realize(mPlayerObj, SL_BOOLEAN_FALSE); 

:

void OpenSLAudioInterface::queueCallback(SLAndroidSimpleBufferQueueItf caller, void* pContext){ 
    OpenSLAudioInterface *audioInterface = (OpenSLAudioInterface*) pContext; 
    if(audioInterface->buffer && audioInterface->getMixer()) { 
     int16_t *out = (int16_t*)audioInterface->buffer; 
     audioInterface->getMixer()->mixIntoBuffer(out, POLY_FRAMES_PER_BUFFER); 
     (*(audioInterface->mPlayerQueue))->Enqueue(audioInterface->mPlayerQueue, out, sizeof(int16_t)*POLY_FRAMES_PER_BUFFER*POLY_NUM_CHANNELS); 
    } 
} 

그래서 누구나 설명 할 수 있습니다, 왜 소리가 ~2 times faster 재생해야하며 왜 내가 버퍼를 채우기 위해 혼합해야하는 샘플 ~2의 요소로 44.100Hz를 초과해야합니까?
순환 버퍼를 사용해야합니까 (여기에서 제가 사용하고있는 것은 OpenSL에서 여전히 사용하고 있습니까?)?

모든 제안과 도움에 미리 감사드립니다.

+0

'lDataFormat.samplesPerSec = SL_SAMPLINGRATE_48; '샘플링 속도는 48kHz이지만 오디오를 44.1kHz로 재생하려고한다고 말씀하셨습니다. 그리고 또 다른 것은'lDataFormat.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16; '입니다. 이것은 16 비트 샘플 PCM 오디오 데이터입니다. 그러나 대부분의 경우 일반적으로'SL_PCMSAMPLEFORMAT_FIXED_8'이 있습니다. –

+0

아 .. 프로젝트 기본 설정을 준수하기 위해 44.1로 조정 했으므로 질문을 편집했습니다. int16_t는 16 비트를 사용해서는 안됩니까? (비록 내가 8bit로 테스트 해 보겠다.) – fodinabor

+0

@ReazMurshed nope 8bit 나사 소리가 굉장히 위로 올라간다 .... 16bit 여야한다. – fodinabor

답변

0

그래서이 문제를 해결했습니다.
실제로 OpenSL을 두 번 초기화 했으므로 하나의 소스에서 두 개의 동시 버퍼 대기열에 쓰기가 시작되었습니다. 이로 인해 제대로 재생되지 않는 프레임의 절반이 발생합니다.