質問は非常に単純に聞こえますが、トラック uri が正しいかどうかを確認する方法が見つかりませんでした。
たとえば、特定の有効なトラック uri spotify:track:5Z7ygHQo02SUrFmcgpwsKW でトラックを再生する通常の手順は次のとおりです。
1) sp_link_create_from_string(const char *$track_uri) で sp_link* を取得
2) sp_link_as_track(sp_link*) で sp_track* を取得する
3) sp_track_add_ref(sp_track*)
4) sp_track_error() が SP_ERROR_OK、または SP_ERROR_IS_LOADING を返すが、metadata_updated を返す場合
SP_ERROR_OK の次に sp_session_player_load と sp_session_player_play を実行して、トラックをロードして再生します。
5) sp_track_release() および sp_session_player_unload() がトラックの最後にある場合。
正しい uri で再生しようとすると、sp_track_error() は SP_ERROR_IS_LOADING を返します。
metadata_updated が呼び出されることはなく、もちろんプログラムはハングします。多くの uri を確認しました
同じ結果が得られます。
何かを見逃したり、API を誤解したりしましたか?
これがメイン ループです。
pthread_mutex_lock(&g_notify_mutex);
for(;;)
{
if (next_timeout == 0)
{
while(!g_notify_do && !g_playback_done)
{
pthread_cond_wait(&g_notify_cond, &g_notify_mutex);
}
}
else
{
struct timespec ts;
#if _POSIX_TIMERS > 0
clock_gettime(CLOCK_REALTIME, &ts);
#else
struct timeval tv;
gettimeofday(&tv, NULL);
TIMEVAL_TO_TIMESPEC(&tv, &ts);
#endif
printf("%d\n",next_timeout);
if((ts.tv_nsec+(next_timeout % 1000) * 1000000)>=1000000000)
{
ts.tv_nsec += (next_timeout % 1000) * 1000000-1000000000;
ts.tv_sec += next_timeout / 1000+1;
}
else
{
ts.tv_sec += next_timeout / 1000;
ts.tv_nsec += (next_timeout % 1000) * 1000000;
}
pthread_cond_timedwait(&g_notify_cond, &g_notify_mutex, &ts);
}
g_notify_do = 0;
pthread_mutex_unlock(&g_notify_mutex);
g_currenttrack= sp_link_as_track(sp_link_create_from_string(spotify:track:1NrJYpdAi7uosDRPmSYrsG));
sp_track_add_ref(g_currenttrack);
if (sp_track_error( g_currenttrack) == SP_ERROR_OK) {
sp_session_player_load(g_sess, g_currenttrack);
sp_session_player_play(g_sess, 1);
}
do
{
sp_session_process_events(g_sess, &next_timeout);
}
while (next_timeout == 0);
pthread_mutex_lock(&g_notify_mutex);
}
メイン ループによって metadata_update が呼び出されることがわかりましたが、トラックが作成されると、このループは長時間 (約 290 秒) 続きます。