2

質問は非常に単純に聞こえますが、トラック 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 秒) 続きます。

4

1 に答える 1

0

metadata_updatedが呼び出されない限り、呼び出されませんsp_session_process_events()。コードが 300 秒間停止する理由は、ログイン後にsp_session_process_events()次の呼び出しタイムアウトが 300 秒に設定されるためです。ステップ 3 の後、独自の通知メイン スレッドを強制することができ、これにより問題が解決されます。残念ながら、この時点で libspotify が通知メイン スレッドを送信しない理由はわかりません。ここで私たちは両方とも何かが欠けていると思います。

于 2013-12-21T03:25:21.803 に答える