fixed BSoundPlayer::Stop() bugs exposed by CL-Amp

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3413 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
beveloper
2003-06-03 21:02:38 +00:00
parent 303c294d21
commit a0703a47ce
4 changed files with 35 additions and 5 deletions
+2 -3
View File
@@ -110,8 +110,7 @@ BMediaEventLooper::Stop(bigtime_t performance_time,
if (immediate) { if (immediate) {
// always be sure to add to the front of the queue so we can make sure it is // always be sure to add to the front of the queue so we can make sure it is
// handled before any buffers are sent! // handled before any buffers are sent!
performance_time = fEventQueue.FirstEventTime(); performance_time = 0;
performance_time = (performance_time == B_INFINITE_TIMEOUT) ? 0 : performance_time - 1;
} }
fEventQueue.AddEvent(media_timed_event(performance_time, BTimedEventQueue::B_STOP)); fEventQueue.AddEvent(media_timed_event(performance_time, BTimedEventQueue::B_STOP));
} }
@@ -372,7 +371,7 @@ void
BMediaEventLooper::SetRunState(run_state state) BMediaEventLooper::SetRunState(run_state state)
{ {
CALLED(); CALLED();
// don't allow run state changes while quitting, // don't allow run state changes while quitting,
// also needed for correct terminating of the ControlLoop() // also needed for correct terminating of the ControlLoop()
if (fRunState == B_QUITTING && state != B_TERMINATED) if (fRunState == B_QUITTING && state != B_TERMINATED)
+12
View File
@@ -68,6 +68,18 @@ _SoundPlayNode::~_SoundPlayNode()
Quit(); Quit();
} }
bool
_SoundPlayNode::IsPlaying()
{
return RunState() == B_STARTED;
}
bigtime_t
_SoundPlayNode::Latency()
{
return EventLatency();
}
media_multi_audio_format media_multi_audio_format
_SoundPlayNode::Format() const _SoundPlayNode::Format() const
+3
View File
@@ -22,6 +22,9 @@ public:
_SoundPlayNode(const char *name, const media_multi_audio_format *format, BSoundPlayer *player); _SoundPlayNode(const char *name, const media_multi_audio_format *format, BSoundPlayer *player);
~_SoundPlayNode(); ~_SoundPlayNode();
bool IsPlaying();
bigtime_t Latency();
/*************************/ /*************************/
/* begin from BMediaNode */ /* begin from BMediaNode */
public: public:
+18 -2
View File
@@ -145,7 +145,7 @@ BSoundPlayer::Start()
if (!_m_node) if (!_m_node)
return B_ERROR; return B_ERROR;
BMediaRoster *roster = BMediaRoster::Roster(); BMediaRoster *roster = BMediaRoster::Roster();
if (!roster) { if (!roster) {
TRACE("BSoundPlayer::Start: Couldn't get BMediaRoster\n"); TRACE("BSoundPlayer::Start: Couldn't get BMediaRoster\n");
@@ -171,6 +171,10 @@ BSoundPlayer::Stop(bool block,
if (!_m_node) if (!_m_node)
return; return;
// XXX flush is ignored
TRACE("BSoundPlayer::Stop: block %d, flush %d\n", (int)block, (int)flush);
BMediaRoster *roster = BMediaRoster::Roster(); BMediaRoster *roster = BMediaRoster::Roster();
if (!roster) { if (!roster) {
@@ -179,7 +183,18 @@ BSoundPlayer::Stop(bool block,
} }
roster->StopNode(_m_node->Node(), 0, true); roster->StopNode(_m_node->Node(), 0, true);
if (block) {
// wait until the node is stopped
int maxtrys;
for (maxtrys = 250; _m_node->IsPlaying() && maxtrys != 0; maxtrys--)
snooze(2000);
DEBUG_ONLY(if (maxtrys == 0) printf("BSoundPlayer::Stop: waiting for node stop failed\n"));
// wait until all buffers on the way to the physical output have been played
snooze(_m_node->Latency() + 2000);
}
} }
BSoundPlayer::BufferPlayerFunc BSoundPlayer::BufferPlayerFunc
@@ -634,6 +649,7 @@ BSoundPlayer::PlayBuffer(void *buffer,
const media_raw_audio_format &format) const media_raw_audio_format &format)
{ {
// CALLED(); // CALLED();
_m_lock.Lock(); _m_lock.Lock();
if (_PlayBuffer) if (_PlayBuffer)
(*_PlayBuffer)(_m_cookie,buffer,size,format); (*_PlayBuffer)(_m_cookie,buffer,size,format);