14
14
namespace SoLoud
15
15
{
16
16
std::mutex buffer_lock_mutex;
17
+ std::mutex check_buffer_mutex;
17
18
18
19
BufferStreamInstance::BufferStreamInstance (BufferStream *aParent)
19
20
{
@@ -36,9 +37,10 @@ namespace SoLoud
36
37
// Calculate mStreamPosition based on mOffset
37
38
mStreamPosition = mOffset / (float )(mSamplerate * mChannels );
38
39
40
+
39
41
// This is not nice to do in the audio callback, but I didn't
40
42
// find a better way to get lenght and pause the sound and the
41
- // `chakeBuffering ` function is fast enough.
43
+ // `checkBuffering ` function is fast enough.
42
44
if (!mParent ->mIsBuffering ) {
43
45
mParent ->mThePlayer ->soloud .unlockAudioMutex_internal ();
44
46
mParent ->checkBuffering (0 );
@@ -118,6 +120,10 @@ namespace SoLoud
118
120
119
121
result BufferStreamInstance::seek (double aSeconds, float *mScratch , unsigned int mScratchSize )
120
122
{
123
+ if (aSeconds <= 0.0 ) {
124
+ rewind ();
125
+ return SO_NO_ERROR;
126
+ }
121
127
if (mParent ->mBuffer .bufferingType == BufferingType::RELEASED) {
122
128
// Seeking not supported in RELEASED mode since data is discarded
123
129
// TODO: Support seeking forward in RELEASED mode
@@ -151,10 +157,6 @@ namespace SoLoud
151
157
152
158
result BufferStreamInstance::rewind ()
153
159
{
154
- if (mParent ->mBuffer .bufferingType == BufferingType::RELEASED) {
155
- // Rewinding not supported in RELEASED mode since data is discarded
156
- return INVALID_PARAMETER;
157
- }
158
160
mOffset = 0 ;
159
161
mStreamPosition = 0 .0f ;
160
162
return 0 ;
@@ -255,6 +257,13 @@ namespace SoLoud
255
257
mBuffer .clear ();
256
258
mSampleCount = 0 ;
257
259
mBytesReceived = 0 ;
260
+ mUncompressedBytesReceived = 0 ;
261
+
262
+ for (int i = 0 ; i < mParent ->handle .size (); i++)
263
+ {
264
+ mThePlayer ->soloud .seek (mParent ->handle [i].handle , 0 .0f );
265
+ mParent ->handle [i].bufferingTime = 0 .0f ;
266
+ }
258
267
}
259
268
260
269
void BufferStream::setDataIsEnded ()
@@ -335,7 +344,8 @@ namespace SoLoud
335
344
buffer.erase (buffer.begin (), buffer.begin () + bufferDataToAdd);
336
345
}
337
346
338
- checkBuffering (bytesWritten);
347
+ if (mIsBuffering )
348
+ checkBuffering (bytesWritten);
339
349
mUncompressedBytesReceived += bytesWritten;
340
350
341
351
mSampleCount += bytesWritten / mPCMformat .bytesPerSample ;
@@ -355,17 +365,24 @@ namespace SoLoud
355
365
// / if needed after adding [afterAddingBytesCount] bytes.
356
366
void BufferStream::checkBuffering (unsigned int afterAddingBytesCount)
357
367
{
368
+ std::lock_guard<std::mutex> lock (check_buffer_mutex);
369
+
358
370
// If a handle reaches the end and data is not ended, we have to wait for it has enough data
359
371
// to reach [TIME_FOR_BUFFERING] and restart playing it.
360
372
SoLoud::time currBufferTime = getLength ();
361
373
SoLoud::time addedDataTime = (afterAddingBytesCount / mPCMformat .bytesPerSample ) / (mBaseSamplerate * mChannels );
374
+ SoLoud::time bufferLength = (double )mBuffer .getFloatsBufferSize () / (mBaseSamplerate * mChannels );
362
375
363
376
for (int i = 0 ; i < mParent ->handle .size (); i++)
364
377
{
365
378
SoLoud::handle handle = mParent ->handle [i].handle ;
366
- SoLoud::time pos = mBuffer .bufferingType == BufferingType::RELEASED ? getStreamTimeConsumed () : mThePlayer ->getPosition (handle);
379
+ SoLoud::time pos = mBuffer .bufferingType == BufferingType::RELEASED ? getStreamTimeConsumed () : mThePlayer ->getPosition (handle);
380
+ // SoLoud::time pos = mThePlayer->getPosition(handle);
367
381
bool isPaused = mThePlayer ->getPause (handle);
368
382
383
+ printf (" checkBuffering -- bufferLength: %lf, currBufferTime: %lf\n " ,
384
+ bufferLength, currBufferTime);
385
+
369
386
// This handle needs to wait for [TIME_FOR_BUFFERING]. Pause it.
370
387
if (pos >= currBufferTime + addedDataTime && !isPaused)
371
388
{
@@ -375,8 +392,7 @@ namespace SoLoud
375
392
callOnBufferingCallback (true , handle, currBufferTime);
376
393
} else
377
394
// This handle has reached [TIME_FOR_BUFFERING]. Unpause it.
378
- if (currBufferTime + addedDataTime - mParent ->handle [i].bufferingTime >= mBufferingTimeNeeds &&
379
- isPaused)
395
+ if (currBufferTime + addedDataTime - mParent ->handle [i].bufferingTime >= mBufferingTimeNeeds && isPaused)
380
396
{
381
397
mThePlayer ->setPause (handle, false );
382
398
isPaused = false ;
@@ -387,6 +403,7 @@ namespace SoLoud
387
403
if (dataIsEnded && isPaused)
388
404
{
389
405
mThePlayer ->setPause (handle, false );
406
+ isPaused = false ;
390
407
mParent ->handle [i].bufferingTime = MAX_DOUBLE;
391
408
callOnBufferingCallback (false , handle, currBufferTime);
392
409
}
@@ -438,6 +455,7 @@ namespace SoLoud
438
455
// / Get the time consumed by this stream of type RELEASED
439
456
SoLoud::time BufferStream::getStreamTimeConsumed ()
440
457
{
441
- return (mBytesConsumed / mPCMformat .bytesPerSample ) / (mBaseSamplerate * mPCMformat .channels );
458
+ // printf("getStreamTimeConsumed %f\n", (mBytesConsumed / mPCMformat.bytesPerSample) / (mBaseSamplerate * mPCMformat.channels));
459
+ return (double )(mBytesConsumed / mPCMformat .bytesPerSample ) / (mBaseSamplerate * mPCMformat .channels );
442
460
}
443
461
};
0 commit comments