// this is called by the audio queue when it has finished decoding our data. // The buffer is now free to be reused. void Audio_Queue::audioQueueOutputCallback(void *inClientData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer) { Audio_Queue *audioQueue = static_cast<Audio_Queue*>(inClientData); unsigned int bufIndex = audioQueue->findQueueBuffer(inBuffer); AQ_TRACE("signaling buffer free for inuse %i....\n", bufIndex); // signal waiting thread that the buffer is free. pthread_mutex_lock(audioQueue->m_bufferInUseMutex); audioQueue->m_bufferInUse[bufIndex] = false; pthread_cond_signal(audioQueue->m_bufferFreeCondition); pthread_mutex_unlock(audioQueue->m_bufferInUseMutex); AQ_TRACE("signal sent!\n"); }
// this is called by the audio queue when it has finished decoding our data. // The buffer is now free to be reused. void Audio_Queue::audioQueueOutputCallback(void *inClientData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer) { Audio_Queue *audioQueue = static_cast<Audio_Queue*>(inClientData); unsigned int bufIndex = audioQueue->findQueueBuffer(inBuffer); assert(audioQueue->m_bufferInUse[bufIndex]); audioQueue->m_bufferInUse[bufIndex] = false; audioQueue->m_buffersUsed--; if (audioQueue->m_buffersUsed == 0 && !audioQueue->m_queuedHead && audioQueue->m_delegate) { audioQueue->m_delegate->audioQueueBuffersEmpty(); } else if (audioQueue->m_waitingOnBuffer) { audioQueue->m_waitingOnBuffer = false; audioQueue->enqueueCachedData(); } }
void Audio_Queue::audioQueueIsRunningCallback(void *inClientData, AudioQueueRef inAQ, AudioQueuePropertyID inID) { Audio_Queue *audioQueue = static_cast<Audio_Queue*>(inClientData); UInt32 running; UInt32 size; OSStatus err = AudioQueueGetProperty(inAQ, kAudioQueueProperty_IsRunning, &running, &size); if (err) { AQ_TRACE("error in kAudioQueueProperty_IsRunning"); audioQueue->setState(IDLE); audioQueue->m_lastError = err; return; } if (running) { audioQueue->setState(RUNNING); } else { audioQueue->setState(IDLE); } }
void Audio_Queue::audioQueueIsRunningCallback(void *inClientData, AudioQueueRef inAQ, AudioQueuePropertyID inID) { Audio_Queue *audioQueue = static_cast<Audio_Queue*>(inClientData); AQ_TRACE("%s: enter\n", __PRETTY_FUNCTION__); UInt32 running; UInt32 output = sizeof(running); OSStatus err = AudioQueueGetProperty(inAQ, kAudioQueueProperty_IsRunning, &running, &output); if (err) { AQ_TRACE("%s: error in kAudioQueueProperty_IsRunning\n", __PRETTY_FUNCTION__); return; } if (running) { AQ_TRACE("audio queue running!\n"); audioQueue->setState(RUNNING); } else { audioQueue->setState(IDLE); } }