SInt64 DZAudioQueuePlayer::seek(float time) { // Cannot seek if parameters not available or parser/queue not ready. if (this->_format.mSampleRate <= 0 || this->_format.mFramesPerPacket <= 0) { return -1; } if (this->_parser == NULL || this->_queue == NULL || this->_status == DZAudioQueuePlayerStatus_NotReady || this->_status == DZAudioQueuePlayerStatus_Error) { return -1; } // Get audio data offset. SInt64 dataOffset = 0; UInt32 propertySize = sizeof(dataOffset); if (dzDebugError(AudioFileStreamGetProperty(this->_parser, kAudioFileStreamProperty_DataOffset, &propertySize, &dataOffset), "Fail to get stream data offset.")) { return -1; } // Reset audio queue to clear the current queue buffer. if (dzDebugError(AudioQueueReset(this->_queue), "Fail to reset audio queue.")) { return -1; } // Get audio queue current time. AudioTimeStamp timeStamp; if (this->_status == DZAudioQueuePlayerStatus_ReadyToStart) { timeStamp.mSampleTime = 0; } else if (dzDebugError(AudioQueueGetCurrentTime(this->_queue, NULL, &(timeStamp), NULL), "Fail to get audio queue current time.")) { return -1; } // Calculate packet offset and so the byte offset. SInt64 packetOffset = round(time * this->_format.mSampleRate / this->_format.mFramesPerPacket); SInt64 byteOffset = 0; UInt32 ioFlag = 0; if (dzDebugError(AudioFileStreamSeek(this->_parser, packetOffset, &byteOffset, &ioFlag), "Fail to seek in audio file stream.")) { return -1; } this->_timeAmendment = time - timeStamp.mSampleTime / this->_format.mSampleRate; return byteOffset + dataOffset; }
void audio_reset(audio_player_t *player) { state_t *state = (state_t *) player->internal_state; state->playing = false; AudioQueueReset(state->queue); }