1e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk/* 2e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * Copyright 2016 The Android Open Source Project 3e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * 4e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * Licensed under the Apache License, Version 2.0 (the "License"); 5e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * you may not use this file except in compliance with the License. 6e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * You may obtain a copy of the License at 7e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * 8e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * http://www.apache.org/licenses/LICENSE-2.0 9e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * 10e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * Unless required by applicable law or agreed to in writing, software 11e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * distributed under the License is distributed on an "AS IS" BASIS, 12e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * See the License for the specific language governing permissions and 14e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * limitations under the License. 15e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk */ 16e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 17dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk#ifndef LEGACY_AUDIO_STREAM_TRACK_H 18dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk#define LEGACY_AUDIO_STREAM_TRACK_H 19e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 20e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk#include <math.h> 211d32e9f8e5ba52d69c6319270c8a63a995d2c4f2Eric Laurent#include <media/TrackPlayerBase.h> 225ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#include <aaudio/AAudio.h> 23e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 24e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk#include "AudioStreamBuilder.h" 25e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk#include "AudioStream.h" 26e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk#include "legacy/AAudioLegacy.h" 27e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk#include "legacy/AudioStreamLegacy.h" 28e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk#include "utility/FixedBlockReader.h" 29e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 305ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burknamespace aaudio { 31e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 32e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk/** 33e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * Internal stream that uses the legacy AudioTrack path. 34e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk */ 351d32e9f8e5ba52d69c6319270c8a63a995d2c4f2Eric Laurentclass AudioStreamTrack : public AudioStreamLegacy, public android::TrackPlayerBase { 36e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burkpublic: 37e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk AudioStreamTrack(); 38e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 39e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk virtual ~AudioStreamTrack(); 40e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 41e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 42e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk aaudio_result_t open(const AudioStreamBuilder & builder) override; 43e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk aaudio_result_t close() override; 44e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 45e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk aaudio_result_t requestStart() override; 46e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk aaudio_result_t requestPause() override; 47e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk aaudio_result_t requestFlush() override; 48e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk aaudio_result_t requestStop() override; 49e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 50e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk aaudio_result_t getTimestamp(clockid_t clockId, 513316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk int64_t *framePosition, 5235e80f34a9649752fceafa53e2094cd8eda50a0aPhil Burk int64_t *timeNanoseconds) override; 53e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 54e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk aaudio_result_t write(const void *buffer, 553316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk int32_t numFrames, 563316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk int64_t timeoutNanoseconds) override; 573316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk 58e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk aaudio_result_t setBufferSize(int32_t requestedFrames) override; 59e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk int32_t getBufferSize() const override; 60e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk int32_t getBufferCapacity() const override; 61e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk int32_t getFramesPerBurst()const override; 62e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk int32_t getXRunCount() const override; 63e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk 64e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk int64_t getFramesRead() override; 65e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 6687c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk aaudio_direction_t getDirection() const override { 6787c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk return AAUDIO_DIRECTION_OUTPUT; 6887c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk } 6987c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk 70e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk aaudio_result_t updateStateWhileWaiting() override; 71e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 72e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk // This is public so it can be called from the C callback function. 73e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk void processCallback(int event, void *info) override; 74e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 754c5129b410884ec0400cbe65fce56d0ade12d11bPhil Burk int64_t incrementClientFrameCounter(int32_t frames) override { 764c5129b410884ec0400cbe65fce56d0ade12d11bPhil Burk return incrementFramesWritten(frames); 774c5129b410884ec0400cbe65fce56d0ade12d11bPhil Burk } 784c5129b410884ec0400cbe65fce56d0ade12d11bPhil Burk 79e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burkprivate: 80e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk 81e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk // adapts between variable sized blocks and fixed size blocks 82e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk FixedBlockReader mFixedBlockReader; 83e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk 84e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk // TODO add 64-bit position reporting to AudioRecord and use it. 853316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk aaudio_wrapping_frames_t mPositionWhenStarting = 0; 863316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk aaudio_wrapping_frames_t mPositionWhenPausing = 0; 87e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk}; 88e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 895ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk} /* namespace aaudio */ 90e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 91dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk#endif /* LEGACY_AUDIO_STREAM_TRACK_H */ 92