Skip to content

Commit

Permalink
Date: Sun, 4 Jan 2004 23:48:19 +0100
Browse files Browse the repository at this point in the history
From: Max Horn
Subject: Re: Again Audio CD patch

Am 04.01.2004 um 22:38 schrieb Sam Lantinga:

>
> Okay, I fixed the buffering problems by simply using a 4 second buffer
> instead of a 1 second buffer.  However, using your code I can't play an
> entire CD - the playback stops after the first song.
>
Found the problem: FSReadFork returns eofErr when the file is finished.
However, we check its return value for errors, and if anything but
noErr occurs, the reader thread aborts its current iteration. That is
bad, because it aborts before it can ever set the flag which tells that
the file is over (also, any remaining data which FSRead did return is
lost - so you'd not hear about to 4 seconds from the end of the file.

Furthermore, the computed data size was 8 bytes to high (I forgot to
account for the fact that the size of an (A)IFF chunk always contains
the chunk header & size fields, too). This is enough to make it work.
However, the end condition is rather fragile, so I tuned some other
things to be pessimistic (check for <= 0 instead of == 0, when eofErr
is encountered enforce mReadFilePosition == mFileLength). You never
know...

The attached patch fixes the issue for me.
  • Loading branch information
slouken committed Jan 5, 2004
1 parent 0780836 commit 1cb6d97
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 10 deletions.
2 changes: 1 addition & 1 deletion src/cdrom/macosx/AudioFilePlayer.cpp
Expand Up @@ -352,7 +352,7 @@ void AudioFilePlayer::OpenFile (const FSRef *inRef, SInt64& outFileDataSize)
THROW_RESULT("AudioFilePlayer::OpenFile(): FSSetForkPosition")

// Data size
outFileDataSize = chunk.ckSize - ssndData.offset;
outFileDataSize = chunk.ckSize - ssndData.offset - 8;

// File format
mFileDescription.mSampleRate = 44100;
Expand Down
16 changes: 7 additions & 9 deletions src/cdrom/macosx/AudioFileReaderThread.cpp
Expand Up @@ -241,22 +241,17 @@ void FileReaderThread::ReadNextChunk ()
dataChunkSize = theItem->mChunkSize;

// this is the exit condition for the thread
if (dataChunkSize == 0) {
if (dataChunkSize <= 0) {
theItem->mFinishedReadingData = true;
continue;
}
// construct pointer
char* writePtr = const_cast<char*>(theItem->GetFileBuffer() +
(theItem->mWriteToFirstBuffer ? 0 : theItem->mChunkSize));

/*
printf ("AudioFileReadBytes: theItem=%.8X fileID=%.8X pos=%.8X sz=%.8X flen=%.8X ptr=%.8X\n",
(unsigned int)theItem, (unsigned int)theItem->GetFileID(),
(unsigned int)theItem->mReadFilePosition, (unsigned int)dataChunkSize,
(unsigned int)theItem->mFileLength, (unsigned int)writePtr);
*/
// read data
result = theItem->Read(writePtr, &dataChunkSize);
if (result) {
if (result != noErr && result != eofErr) {
theItem->GetParent().DoNotification(result);
continue;
}
Expand All @@ -271,7 +266,10 @@ void FileReaderThread::ReadNextChunk ()

theItem->mWriteToFirstBuffer = !theItem->mWriteToFirstBuffer; // switch buffers

theItem->mReadFilePosition += dataChunkSize; // increment count
if (result == eofErr)
theItem->mReadFilePosition = theItem->mFileLength;
else
theItem->mReadFilePosition += dataChunkSize; // increment count
}
}

Expand Down

0 comments on commit 1cb6d97

Please sign in to comment.