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;
}
Beispiel #2
0
void audio_reset(audio_player_t *player) {
	state_t *state = (state_t *) player->internal_state;
	state->playing = false;
	AudioQueueReset(state->queue);
}