Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static void HandleOutputBuffer(void* userInfo,
- AudioQueueRef queue,
- AudioQueueBufferRef buffer) {
- NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
- TapeRecorder* recorder = (TapeRecorder*)userInfo;
- if(![recorder isPlaying]) {
- return;
- }
- NSData* samples = [[recorder tape] getSamplesOfCount:[recorder mBufferByteSize]/2 atSampleOffset:[recorder mCurrentPacket]];
- if(samples != nil) {
- [samples getBytes:buffer->mAudioData length:[samples length]];
- buffer->mAudioDataByteSize = [samples length];
- OSStatus stat = AudioQueueEnqueueBuffer(queue, buffer, 0, NULL);
- //[recorder ReportAudioError:stat];
- [recorder setMCurrentPacket:[recorder mCurrentPacket]+[samples length]/2];
- if([samples length] < [recorder mBufferByteSize]) {
- AudioQueueStop(queue, false);
- }
- }
- else {
- AudioQueueStop(queue, false);
- //error
- }
- [pool release];
- }
- - (void)startPlaying {
- if(playingAvailable) {
- NSError* error;
- [session setCategory:AVAudioSessionCategoryPlayback error:nil];
- [session setActive:YES error:&error];
- if(error) {
- NSLog([error description]);
- }
- mBufferByteSize = 11025*2; //one second buffer size
- mStreamDescription.mBitsPerChannel = 16;
- mStreamDescription.mSampleRate = SAMPLE_RATE;
- mStreamDescription.mChannelsPerFrame = 1;
- mStreamDescription.mFormatID = kAudioFormatLinearPCM;
- mStreamDescription.mFramesPerPacket = 1;
- mStreamDescription.mBytesPerFrame = mStreamDescription.mBytesPerPacket = 2;
- mStreamDescription.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsBigEndian | kLinearPCMFormatFlagIsPacked;
- OSStatus stat = AudioQueueNewOutput(&mStreamDescription, HandleOutputBuffer, self, NULL, kCFRunLoopCommonModes, 0, &mQueue);
- [self ReportAudioError:stat];
- if(mCurrentPacket > .99*[tape totalSamples]) {
- mCurrentPacket = 0; //reset to start
- self.timeIndexInSeconds = 0;
- }
- self.state = RecorderStatePlaying;
- for(int i = 0; i < NUM_BUFFERS; i++) {
- AudioQueueAllocateBuffer(mQueue, mBufferByteSize, &mPlaybackBuffers[i]);
- HandleOutputBuffer(self, mQueue, mPlaybackBuffers[i]);
- }
- AudioQueueAddPropertyListener(mQueue, kAudioQueueProperty_IsRunning, QueuePropertyListener, self);
- AudioQueueStart(mQueue, NULL);
- timer = [[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerFired:) userInfo:@"play" repeats:YES] retain];
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement