2

libspotfiyの周りにC#ラッパーを書いていますが、トラックの再生に問題があります。私の知る限り、セッションで初めてトラックのストリーミングを開始したいときは、

sp_session_player_load(sessionHandle, trackHandle)
sp_session_player_play(sessionHandle, true);

これは私がやっていることであり、それはうまく機能します。問題は私が何か他のものをプレイしたいときに始まります。トラックがまだ再生されている状態で、新しいトラックを再生するにはどうすればよいですか?電話する必要があります

sp_session_player_play(sessionHandle, false);
sp_session_player_unload(sessionHandle);

その後、ロード/プレイの新しいラウンドを呼び出す前に?これを行うと、アンロードを呼び出したり、falseの引数を指定してplayを呼び出したりすると、プログラムがハングすることがよくあります。get_audio_buffer_statsコールバックを使用しています。適切なスレッド同期が設定されているので、APIを間違って歌っていないかと思いますか?

4

2 に答える 2

4

これは、公式のMacおよびiOSライブラリが行うこととまったく同じであり、正常に機能します。

初めてプレイするとき:

sp_session_player_load(sessionHandle, trackHandle)
sp_session_player_play(sessionHandle, true);

もう一度プレイするとき:

sp_session_player_play(sessionHandle, false);
sp_session_player_unload(sessionHandle);
sp_session_player_load(sessionHandle, trackHandle)
sp_session_player_play(sessionHandle, true);

ただし、確認できることがいくつかあります。

  • 私が見た中で最も一般的なハングは、プログラムがnotify_main_threadコールバックを実装する方法によるものです。これを取得したらsp_session_process_events、メインスレッドでブロックされない方法で呼び出しをスケジュールする必要があります。つまり、notify_main_thread実装はsp_session_process_events他のスレッドで呼び出される前に戻る必要があります。

  • get_audio_buffer_stats実装を取り出してみてください。このMac/iOSライブラリはこれをまったく実装していません-必須ではありません。

これだけでは不十分な場合は、ハングのスタックトレースを取得してみてください。デバッガーでそれをキャッチした場合、一時停止を押すだけで十分なことがよくあります。

于 2012-11-05T10:48:22.693 に答える
0

私のコードは、notify_main_threadコールバックに反応して、別のスレッドにシグナルを送信するだけなので、完全に非ブロッキングです。

私は物事を解決したようですが、それでも少し戸惑いが残っています。私は確かにget_audio_buffer_statsコールバックを削除しました。ただし、役立つように思われたのは、sp_session_player_unloadを呼び出す前に、music_deliveryコールバックで何も実行しないようにすることでした。

music_deliveryコールバックで行ったすべてのことをロックし、同じロックでsp_session_player_unloadを保護しました。したがって、sp_session_player_unloadの実行中に、libspotify内の別のスレッドがmusic_deliveryコールバックをトリガーし、sp_session_player_unloadが完了するのを当然待機する必要があるようです。これによりデッドロックが発生する可能性があるようです。

music_deliveryコールバックと他のlibspotify関数(つまりsp_session_player_unload)が同じミューテックスで保護されるようにすることで、正しいことをしていると思いましたか?おそらく、music_delivery内で行うべき正しいことは、ロックを取得する試みが失敗した場合にサンプルが取得されなかったことを報告して、すぐに戻ることですか?(そして、これは、process_eventsスレッドの外部で行われるすべてのコールバックに当てはまりますか?)

于 2012-11-05T17:50:32.067 に答える