static OSStatus OutputIOProc(AudioDeviceID          inDevice,
			       const AudioTimeStamp*  /*inNow*/,
			       const AudioBufferList* /*inputData*/,
			       const AudioTimeStamp*  /*inInputTime*/,
			       AudioBufferList*	      outputData,
			       const AudioTimeStamp*  /*inOutputTime*/,
			       void*                  inClientData)
  {
    Impl* impl = reinterpret_cast<Impl*>(inClientData);
	
    switch (impl->m_outputProcState)
      {
      case kStarting:
	impl->m_outputProcState = kRunning;
	break;
      case kStopRequested:
	AudioDeviceStop(inDevice, OutputIOProc);
	impl->m_outputProcState = kOff;
	return noErr;
      default:
	break;
      }

    /*
    char buf[512] = {0};
    sprintf(buf, "Received %i bytes of audio data\n",
	    inputData->mBuffers[0].mDataByteSize);
	    impl->m_logger(2, buf);*/

    impl->read(reinterpret_cast<unsigned char*>(outputData->mBuffers[0].mData),
	       outputData->mBuffers[0].mDataByteSize / impl->m_format.mBytesPerFrame);


    return noErr;
  }