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:
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user