最近、私はすでにこの質問に似た解決策を求めました:
「待機」オプションを使用して mcisendstring で再生している mp3 ファイルを一時停止/停止する方法はありますか?
トラックが実行されている現在の秒に応じてスライダーが移動し、現在のトラックが再生された後に次のトラックに移動する機能を使用しながら、人々が継続的にサウンドを再生できるようにする機能をオーディオプレーヤーに実装したいと考えています。以上
(リンクで読むことができるように)それをやろうとした後
mciSendString("play mp3 wait", NULL, 0, NULL);
トラックが終了するまで一時停止または停止できないという問題が原因で失敗しました。現在、別の方法で実装しようとしています。現在、トラックの再生を開始すると、カウンターを開始する別のスレッドも開始します。カウンターはトラックの長さを秒単位で取得し、時間をカウントダウンしています。また、カウンターを一時停止/再開するためのミューテックスも提供しています。MusicCycle が単純に制御されずにループするのを止めるために、スレッドに参加し、その終了を待っています。
void Music::MusicCycle(std::wstring trackPath)
{
while (true)
{
OpenMP3(trackPath);
mciSendString("play mp3", NULL, 0, NULL);
m_counterThread = boost::thread(boost::bind(&Counter::StartCount, m_counter, <length of track in seconds>));
m_counterThread.join();
//... Get new track here
}
}
このメソッド全体もスレッドで作成されることに注意してください。
m_cycleThread = boost::thread(boost::bind(&Music::MusicCycle, this, trackPath));
MusicCycle 関数によって開始されたスレッドは次のようになります。
void Counter::StartCount(int seconds)
{
boost::mutex::scoped_lock lock(m_mutex);
for (int i = 0; i < seconds; i++)
{
while (m_counterLock)
{
m_condVar.wait(lock);
}
boost::this_thread::sleep(boost::posix_time::seconds(1));
}
}
また、対応する mciSendString 関数も呼び出す Pause/Resume メソッドを使用して、ここでミューテックスをロック/ロック解除する別の機能を追加しました。
mciSendString("resume mp3", NULL, 0, NULL);
mciSendString("pause mp3", NULL, 0, NULL);
ここで一時停止を呼び出すと、mciSendString はトラックを一時停止し、カウンターをロックして、カウントダウンを続けないようにします。
ただし、問題は、まだ機能しないことです。mciSendString で待機オプションを使用せずに解決策を考えようと努力したにもかかわらず、一時停止は音楽の再生にまったく影響しません。
何かアドバイス?
編集:これは実際にスレッドが原因で発生していることがわかりました。私はかなりの時間 C# を使用してきましたが、Invokes を使用してスレッドの問題を回避できます。もしかしたら、ここでも可能ですか?
EDIT2:少し読んだところ、PostMessage WinAPI呼び出しを介して別のスレッドのメッセージキューにメソッドを投稿するオプションがあるようです。これは可能性がありますか?はいの場合、誰かが良い例を提供できますか? 少し読んだけど、いまいちよくわからない
C++にもこのようなものはありますか?