2014-07-17 23 views
0

我目前正在嘗試更改audioplayer的uri而不破壞已實現的SLPlayItf對象。OpenSL改變URI而不重新創建SLPlayItf

我有這樣的代碼:

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爲指針。如果我只是改變它,新的網址將被設置。

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

即使我可以看到URI指向新的字符數組,音頻播放器仍然在播放舊的。

有沒有人有任何關於如何取代audioplayer目前的網址而不破壞它的任何想法?

PS:在更改URL之前,我將SL_PLAYER_STOPPED發送給緩衝區和播放器對象。同時清除緩衝區。但是這並沒有解決問題。

PSS:你會問我爲什麼不摧毀舊的聽音器並創建一個新的。那麼答案就是,樣板對於銷燬和創建都太大了。加上摧毀/創造需要太多時間爲我的口味。我更喜歡重新使用當前創建的對象。而且,當我創建第二臺音頻播放器時,我無法銷燬第一臺。原生Destroy()命令掛起該線程並且代碼不再響應。

回答

0

我已經挖IEngine.c文件opensl和來源,我發現這個代碼:

// 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的音頻源。

相關問題