void *FileReaderThread::DiskReaderEntry (void *inRefCon) { FileReaderThread *This = (FileReaderThread *)inRefCon; This->ReadNextChunk(); #if DEBUG printf ("finished with reading file\n"); #endif return 0; }
static void *FileReaderThread_DiskReaderEntry (void *inRefCon) { FileReaderThread *frt = (FileReaderThread *)inRefCon; frt->ReadNextChunk(frt); #if DEBUG printf ("finished with reading file\n"); #endif return 0; }
void AudioFileReaderThread::AfterRender () { if (mNumTimesAskedSinceFinished > 0) { bool didLock = false; if (sReaderThread.GetGuard().Try (didLock)) { mParent.DoNotification (kAudioFilePlay_FileIsFinished); if (didLock) sReaderThread.GetGuard().Unlock(); } } if (mLockUnsuccessful) mLockUnsuccessful = !sReaderThread.TryNextRead (this); }
OSStatus AudioFileReaderThread::GetFileData (void** inOutData, UInt32 *inOutDataSize, UInt32 *outPacketCount, AudioStreamPacketDescription **outPacketDescriptions) { if (mFinishedReadingData) { ++mNumTimesAskedSinceFinished; *inOutDataSize = 0; *inOutData = 0; return noErr; } if (mReadFromFirstBuffer == mWriteToFirstBuffer) { #if DEBUG printf ("* * * * * * * Can't keep up with reading file:%ld\n", mParent.GetBusNumber()); #endif mParent.DoNotification (kAudioFilePlayErr_FilePlayUnderrun); *inOutDataSize = 0; *inOutData = 0; } else { *inOutDataSize = mCurrentByteCountInBuffer; *inOutData = mReadFromFirstBuffer ? mFileBuffer : (mFileBuffer + (mChunkSizeInPackets * mMaxPacketSize)); *outPacketCount = mCurrentPacketCountInBuffer; *outPacketDescriptions = mReadFromFirstBuffer ? mPacketDescriptions : (mPacketDescriptions + mChunkSizeInPackets); } mLockUnsuccessful = !sReaderThread.TryNextRead (this); mReadFromFirstBuffer = !mReadFromFirstBuffer; return noErr; }
void AudioFileReaderThread::Disconnect () { if (mIsEngaged) { sReaderThread.RemoveReader (this); mIsEngaged = false; } }
void AudioFileReaderThread::DoConnect () { if (!mIsEngaged) { mFinishedReadingData = false; mNumTimesAskedSinceFinished = -1; mLockUnsuccessful = false; UInt32 dataChunkSize = 0; mCurrentPacketCountInBuffer = mChunkSizeInPackets; #if LOG_DATA_FLOW fprintf(stdout, "***** DoConnect - AFReadPackets from (pkts/offset) %ld/%qd\n", mCurrentPacketCountInBuffer, mReadPacketPosition); #endif OSStatus result = AudioFileReadPackets ( mAudioFileID, false, &dataChunkSize, mPacketDescriptions, mReadPacketPosition, &mCurrentPacketCountInBuffer, mFileBuffer); THROW_RESULT("AudioFileReadPackets") mCurrentByteCountInBuffer = dataChunkSize; mReadPacketPosition = mCurrentPacketCountInBuffer; mWriteToFirstBuffer = false; mReadFromFirstBuffer = true; sReaderThread.AddReader(); mIsEngaged = true; } else throw static_cast<OSStatus>(-1); //thread has already been started }