我目前正在嘗試更改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);
...
}
我認爲SLDataSource
和SLDataLocator_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()
命令掛起該線程並且代碼不再響應。