2014-07-17 3 views
0

실현 된 SLPlayItf 개체를 파괴하지 않고 오디오 플레이어의 URI를 변경하려고합니다.SLPlayItf를 다시 만들지 않고 OpenSL을 변경하는 URI

나는 코드에서이 같은있어 :

static SLDataSource audioSrcOne; 
static SLDataLocator_URI locUriOne; 

void initialize_player_with_streamOne() 
{ 
    ... 

    locUriOne.locatorType   = SL_DATALOCATOR_URI; 
    locUriOne.URI     = (SLchar *) streamOne->utf8; 

    SLDataFormat_MIME format_mime = { SL_DATAFORMAT_MIME, NULL, SL_CONTAINERTYPE_UNSPECIFIED }; 
    audioSrcOne.pLocator   = (void *)&locUriOne; 
    audioSrcOne.pFormat   = (void *)&format_mime; 

    ... 

    result = (*engine->engineEngine)->CreateAudioPlayer(engine->engineEngine, &(streamOne->playerObject), &audioSrcOne, &audioSnkOne, 3, idm, reqm); 
    assert(SL_RESULT_SUCCESS == result); 

    ... 
} 

나는 SLDataSourceSLDataLocator_URI 포인터로 OpenSL 보내졌다 생각했다. 간단히 변경하면 새 URL이 설정됩니다.

LOGV("STREAM ONE RESET - Configuring audio source %s", streamOne->utf8); 
locUriOne.URI = (SLchar *) streamOne->utf8; 
LOGV("STREAM ONE RESET - %s", locUriOne.URI); 

URI가 새로운 문자 배열을 가리키고있는 것을 볼 수 있지만 오디오 플레이어는 여전히 이전 것을 재생하고 있습니다.

누군가 오디오 플레이어를 손상시키지 않고 현재 URL을 바꾸는 방법에 대해 알고 있습니까?

PS : URL을 변경하기 전에 SL_PLAYER_STOPPED를 버퍼와 플레이어 개체 모두에 보냈습니다. 또한 버퍼 지우기. 그러나 이것은 문제를 해결하지 못했습니다.

PSS : 왜 내가 이전 오디오 플레이어를 파괴하고 새로운 오디오 플레이어를 만들지 묻겠습니다. 음 그 대답은, 상투적 인 표현은 파괴와 창조 모두에있어서 너무 크다. 게다가 파괴/생성은 내 취향에 너무 많은 시간이 걸립니다. 나는 현재 생성 된 객체를 다시 사용하는 것을 선호한다. 또한 두 번째 오디오 플레이어를 만들 때 첫 번째 오디오 플레이어를 파괴 할 수 없습니다. 네이티브 Destroy() 명령이 스레드를 중단시키고 코드가 더 이상 응답하지 않습니다.

답변

0
내가 opensl과 IEngine.c 파일에 소스를 파고 봤는데

,이 코드 발견 :

// Check the source and sink parameters against generic constraints, 
    // and make a local copy of all parameters in case other application threads 
    // change memory concurrently. 

    result = checkDataSource("pAudioSrc", pAudioSrc, &thiz->mDataSource, 
      DATALOCATOR_MASK_URI | DATALOCATOR_MASK_ADDRESS | 
      DATALOCATOR_MASK_BUFFERQUEUE 
#ifdef ANDROID 
      | DATALOCATOR_MASK_ANDROIDFD | DATALOCATOR_MASK_ANDROIDSIMPLEBUFFERQUEUE 
      | DATALOCATOR_MASK_ANDROIDBUFFERQUEUE 
#endif 
      , DATAFORMAT_MASK_MIME | DATAFORMAT_MASK_PCM); 

    if (SL_RESULT_SUCCESS != result) { 
     break; 
    } 


    ... ... 


    // It would be unsafe to ever refer to the application pointers again 
    pAudioSrc = NULL; 
    pAudioSnk = NULL; 

을 코드가 말한대로, 오디오 소스를 복사 한 후 수신 포인터는 null로 설정됩니다 스레드 안전을 위해 따라서 SLPlayItf의 오디오 소스를 즉시 변경하는 것은 불가능합니다.