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