AudioStreamInternal.h revision e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3
1204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk/* 2204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * Copyright (C) 2016 The Android Open Source Project 3204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * 4204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * Licensed under the Apache License, Version 2.0 (the "License"); 5204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * you may not use this file except in compliance with the License. 6204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * You may obtain a copy of the License at 7204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * 8204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * http://www.apache.org/licenses/LICENSE-2.0 9204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * 10204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * Unless required by applicable law or agreed to in writing, software 11204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * distributed under the License is distributed on an "AS IS" BASIS, 12204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * See the License for the specific language governing permissions and 14204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * limitations under the License. 15204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk */ 16204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 175ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#ifndef AAUDIO_AUDIOSTREAMINTERNAL_H 185ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#define AAUDIO_AUDIOSTREAMINTERNAL_H 19204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 20204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include <stdint.h> 215ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#include <aaudio/AAudio.h> 22204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 235ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#include "binding/IAAudioService.h" 24204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "binding/AudioEndpointParcelable.h" 25204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "client/IsochronousClockModel.h" 26204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "client/AudioEndpoint.h" 27204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "core/AudioStream.h" 28204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 29204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkusing android::sp; 305ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burkusing android::IAAudioService; 31204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 325ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burknamespace aaudio { 33204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 345ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk// A stream that talks to the AAudioService or directly to a HAL. 35204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkclass AudioStreamInternal : public AudioStream { 36204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 37204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkpublic: 38204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk AudioStreamInternal(); 39204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk virtual ~AudioStreamInternal(); 40204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 41204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk // =========== Begin ABSTRACT methods =========================== 425ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk virtual aaudio_result_t requestStart() override; 43204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 445ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk virtual aaudio_result_t requestPause() override; 45204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 465ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk virtual aaudio_result_t requestFlush() override; 47204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 485ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk virtual aaudio_result_t requestStop() override; 49204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 505ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk // TODO use aaudio_clockid_t all the way down to AudioClock 515ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk virtual aaudio_result_t getTimestamp(clockid_t clockId, 523316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk int64_t *framePosition, 533316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk int64_t *timeNanoseconds) override; 54204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 55204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 56e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk virtual aaudio_result_t updateStateWhileWaiting() override; 57204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk // =========== End ABSTRACT methods =========================== 58204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 595ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk virtual aaudio_result_t open(const AudioStreamBuilder &builder) override; 60204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 615ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk virtual aaudio_result_t close() override; 62204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 635ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk virtual aaudio_result_t write(const void *buffer, 64204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk int32_t numFrames, 653316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk int64_t timeoutNanoseconds) override; 66204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 673316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk virtual aaudio_result_t setBufferSize(int32_t requestedFrames) override; 68204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 693316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk virtual int32_t getBufferSize() const override; 70204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 713316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk virtual int32_t getBufferCapacity() const override; 72204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 733316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk virtual int32_t getFramesPerBurst() const override; 74204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 753316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk virtual int64_t getFramesRead() override; 76204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 77204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk virtual int32_t getXRunCount() const override { 78204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return mXRunCount; 79204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 80204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 815ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk virtual aaudio_result_t registerThread() override; 82204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 835ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk virtual aaudio_result_t unregisterThread() override; 84204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 85e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk // Called internally from 'C' 86e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk void *callbackLoop(); 87e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk 88204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkprotected: 89204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 905ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk aaudio_result_t processCommands(); 91204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 92e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk aaudio_result_t requestPauseInternal(); 93e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk 94e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk aaudio_result_t stopCallback(); 95e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk 96204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk/** 97204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * Low level write that will not block. It will just write as much as it can. 98204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * 99204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * It passed back a recommended time to wake up if wakeTimePtr is not NULL. 100204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * 101204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * @return the number of frames written or a negative error code. 102204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk */ 1035ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk virtual aaudio_result_t writeNow(const void *buffer, 104204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk int32_t numFrames, 1053316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk int64_t currentTimeNanos, 1063316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk int64_t *wakeTimePtr); 107204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 108204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk void onFlushFromServer(); 109204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 1105ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk aaudio_result_t onEventFromServer(AAudioServiceMessage *message); 111204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 1125ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk aaudio_result_t onTimestampFromServer(AAudioServiceMessage *message); 113204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 114e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk // Calculate timeout for an operation involving framesPerOperation. 115e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk int64_t calculateReasonableTimeout(int32_t framesPerOperation); 116e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk 117204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkprivate: 118204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk IsochronousClockModel mClockModel; 119204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk AudioEndpoint mAudioEndpoint; 1203316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk aaudio_handle_t mServiceStreamHandle; 121204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk EndpointDescriptor mEndpointDescriptor; 122e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk uint8_t *mCallbackBuffer = nullptr; 123e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk int32_t mCallbackFrames = 0; 124e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk 125204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk // Offset from underlying frame position. 1263316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk int64_t mFramesOffsetFromService = 0; 1273316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk int64_t mLastFramesRead = 0; 1283316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk int32_t mFramesPerBurst; 129204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk int32_t mXRunCount = 0; 1303316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk void processTimestamp(uint64_t position, int64_t time); 131204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk}; 132204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 1335ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk} /* namespace aaudio */ 134204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 1355ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#endif //AAUDIO_AUDIOSTREAMINTERNAL_H 136