void	*FileReaderThread::DiskReaderEntry (void *inRefCon)
{
	FileReaderThread *This = (FileReaderThread *)inRefCon;
	This->ReadNextChunk();
	#if DEBUG
	printf ("finished with reading file\n");
	#endif
	
	return 0;
}
Пример #2
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
}