Advertisement
Guest User

mythogen

a guest
Feb 4th, 2010
668
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. static void HandleOutputBuffer(void* userInfo,
  2.                                AudioQueueRef queue,
  3.                                AudioQueueBufferRef buffer) {
  4.     NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
  5.     TapeRecorder* recorder = (TapeRecorder*)userInfo;
  6.     if(![recorder isPlaying]) {
  7.         return;
  8.     }
  9.     NSData* samples = [[recorder tape] getSamplesOfCount:[recorder mBufferByteSize]/2 atSampleOffset:[recorder mCurrentPacket]];
  10.     if(samples != nil) {
  11.         [samples getBytes:buffer->mAudioData length:[samples length]];
  12.         buffer->mAudioDataByteSize = [samples length];
  13.         OSStatus stat = AudioQueueEnqueueBuffer(queue, buffer, 0, NULL);
  14.         //[recorder ReportAudioError:stat];
  15.         [recorder setMCurrentPacket:[recorder mCurrentPacket]+[samples length]/2];
  16.         if([samples length] < [recorder mBufferByteSize]) {
  17.             AudioQueueStop(queue, false);
  18.         }
  19.     }
  20.     else {
  21.         AudioQueueStop(queue, false);
  22.         //error
  23.     }
  24.     [pool release];
  25. }
  26.  
  27. - (void)startPlaying {
  28.     if(playingAvailable) {
  29.         NSError* error;
  30.         [session setCategory:AVAudioSessionCategoryPlayback error:nil];
  31.         [session setActive:YES error:&error];
  32.         if(error) {
  33.             NSLog([error description]);
  34.         }
  35.        
  36.         mBufferByteSize = 11025*2; //one second buffer size
  37.        
  38.         mStreamDescription.mBitsPerChannel = 16;
  39.         mStreamDescription.mSampleRate = SAMPLE_RATE;
  40.         mStreamDescription.mChannelsPerFrame = 1;
  41.         mStreamDescription.mFormatID = kAudioFormatLinearPCM;
  42.         mStreamDescription.mFramesPerPacket = 1;
  43.         mStreamDescription.mBytesPerFrame = mStreamDescription.mBytesPerPacket = 2;
  44.         mStreamDescription.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsBigEndian | kLinearPCMFormatFlagIsPacked;
  45.        
  46.         OSStatus stat = AudioQueueNewOutput(&mStreamDescription, HandleOutputBuffer, self, NULL, kCFRunLoopCommonModes, 0, &mQueue);
  47.         [self ReportAudioError:stat];
  48.         if(mCurrentPacket > .99*[tape totalSamples]) {
  49.             mCurrentPacket = 0; //reset to start
  50.             self.timeIndexInSeconds = 0;
  51.         }
  52.         self.state = RecorderStatePlaying;
  53.        
  54.         for(int i = 0; i < NUM_BUFFERS; i++) {
  55.             AudioQueueAllocateBuffer(mQueue, mBufferByteSize, &mPlaybackBuffers[i]);
  56.             HandleOutputBuffer(self, mQueue, mPlaybackBuffers[i]);
  57.         }
  58.         AudioQueueAddPropertyListener(mQueue, kAudioQueueProperty_IsRunning, QueuePropertyListener, self);
  59.         AudioQueueStart(mQueue, NULL);
  60.         timer = [[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerFired:) userInfo:@"play" repeats:YES] retain];
  61.     }
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement