Fixed sound streams sometimes being stuck after looping once
git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/trunk@1387 4e206d99-4929-0410-ac5d-dfc041789085
This commit is contained in:
parent
f96a3864bc
commit
ec2fe136f9
@ -253,14 +253,7 @@ void SoundStream::Run()
|
|||||||
if (!RequestStop)
|
if (!RequestStop)
|
||||||
{
|
{
|
||||||
if (FillAndPushBuffer(BufferNum))
|
if (FillAndPushBuffer(BufferNum))
|
||||||
{
|
RequestStop = true;
|
||||||
// User requested to stop: check if we must loop or really stop
|
|
||||||
if (!myLoop || !OnStart())
|
|
||||||
{
|
|
||||||
// Not looping or restart failed: request stop
|
|
||||||
RequestStop = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -293,11 +286,26 @@ bool SoundStream::FillAndPushBuffer(unsigned int BufferNum)
|
|||||||
Chunk Data = {NULL, 0};
|
Chunk Data = {NULL, 0};
|
||||||
if (!OnGetData(Data))
|
if (!OnGetData(Data))
|
||||||
{
|
{
|
||||||
|
// Mark the buffer as the last one (so that we know when to reset the playing position)
|
||||||
myEndBuffers[BufferNum] = true;
|
myEndBuffers[BufferNum] = true;
|
||||||
RequestStop = true;
|
|
||||||
|
// Check if the stream must loop or stop
|
||||||
|
if (myLoop && OnStart())
|
||||||
|
{
|
||||||
|
// If we succeeded to restart and we previously had no data, try to fill the buffer once again
|
||||||
|
if (!Data.Samples || (Data.NbSamples == 0))
|
||||||
|
{
|
||||||
|
return FillAndPushBuffer(BufferNum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Not looping or restart failed: request stop
|
||||||
|
RequestStop = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create and fill the buffer, and push it to the queue
|
// Fill the buffer if some data was returned
|
||||||
if (Data.Samples && Data.NbSamples)
|
if (Data.Samples && Data.NbSamples)
|
||||||
{
|
{
|
||||||
unsigned int Buffer = myBuffers[BufferNum];
|
unsigned int Buffer = myBuffers[BufferNum];
|
||||||
@ -324,10 +332,7 @@ bool SoundStream::FillQueue()
|
|||||||
for (int i = 0; (i < BuffersCount) && !RequestStop; ++i)
|
for (int i = 0; (i < BuffersCount) && !RequestStop; ++i)
|
||||||
{
|
{
|
||||||
if (FillAndPushBuffer(i))
|
if (FillAndPushBuffer(i))
|
||||||
{
|
RequestStop = true;
|
||||||
if (!myLoop || !OnStart())
|
|
||||||
RequestStop = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return RequestStop;
|
return RequestStop;
|
||||||
|
@ -133,20 +133,20 @@ Socket::Status SocketTCP::Connect(unsigned short Port, const IPAddress& HostAddr
|
|||||||
|
|
||||||
// Wait for something to write on our socket (which means that the connection request has returned)
|
// Wait for something to write on our socket (which means that the connection request has returned)
|
||||||
if (select(static_cast<int>(mySocket + 1), NULL, &Selector, NULL, &Time) > 0)
|
if (select(static_cast<int>(mySocket + 1), NULL, &Selector, NULL, &Time) > 0)
|
||||||
{
|
{
|
||||||
// At this point the connection may have been either accepted or refused.
|
// At this point the connection may have been either accepted or refused.
|
||||||
// To know whether it's a success or a failure, we try to retrieve the name of the connected peer
|
// To know whether it's a success or a failure, we try to retrieve the name of the connected peer
|
||||||
SocketHelper::LengthType Size = sizeof(SockAddr);
|
SocketHelper::LengthType Size = sizeof(SockAddr);
|
||||||
if (getpeername(mySocket, reinterpret_cast<sockaddr*>(&SockAddr), &Size) != -1)
|
if (getpeername(mySocket, reinterpret_cast<sockaddr*>(&SockAddr), &Size) != -1)
|
||||||
{
|
{
|
||||||
// Connection accepted
|
// Connection accepted
|
||||||
Status = Socket::Done;
|
Status = Socket::Done;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Connection failed
|
// Connection failed
|
||||||
Status = SocketHelper::GetErrorStatus();
|
Status = SocketHelper::GetErrorStatus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user