187c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk/* 287c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * Copyright (C) 2017 The Android Open Source Project 387c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * 487c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * Licensed under the Apache License, Version 2.0 (the "License"); 587c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * you may not use this file except in compliance with the License. 687c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * You may obtain a copy of the License at 787c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * 887c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * http://www.apache.org/licenses/LICENSE-2.0 987c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * 1087c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * Unless required by applicable law or agreed to in writing, software 1187c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * distributed under the License is distributed on an "AS IS" BASIS, 1287c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1387c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * See the License for the specific language governing permissions and 1487c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * limitations under the License. 1587c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk */ 1687c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk 1787c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk#ifndef ANDROID_AAUDIO_AUDIO_STREAM_INTERNAL_PLAY_H 1887c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk#define ANDROID_AAUDIO_AUDIO_STREAM_INTERNAL_PLAY_H 1987c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk 2087c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk#include <stdint.h> 2187c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk#include <aaudio/AAudio.h> 2287c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk 2387c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk#include "binding/AAudioServiceInterface.h" 2487c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk#include "client/AudioStreamInternal.h" 2587c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk 2687c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burkusing android::sp; 2787c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burkusing android::IAAudioService; 2887c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk 2987c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burknamespace aaudio { 3087c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk 3187c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burkclass AudioStreamInternalPlay : public AudioStreamInternal { 3287c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burkpublic: 3387c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk AudioStreamInternalPlay(AAudioServiceInterface &serviceInterface, bool inService = false); 3487c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk virtual ~AudioStreamInternalPlay(); 3587c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk 3687c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk aaudio_result_t write(const void *buffer, 3787c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk int32_t numFrames, 3887c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk int64_t timeoutNanoseconds) override; 3987c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk 4087c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk int64_t getFramesRead() override; 4187c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk int64_t getFramesWritten() override; 4287c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk 4387c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk void *callbackLoop() override; 4487c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk 4587c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk aaudio_direction_t getDirection() const override { 4687c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk return AAUDIO_DIRECTION_OUTPUT; 4787c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk } 4887c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk 4987c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burkprotected: 5087c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk/** 5187c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * Low level write that will not block. It will just write as much as it can. 5287c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * 5387c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * It passed back a recommended time to wake up if wakeTimePtr is not NULL. 5487c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * 5587c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * @return the number of frames written or a negative error code. 5687c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk */ 5787c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk aaudio_result_t processDataNow(void *buffer, 5887c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk int32_t numFrames, 5987c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk int64_t currentTimeNanos, 6087c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk int64_t *wakeTimePtr) override; 6187c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burkprivate: 6287c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk /* 6387c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * Asynchronous write with data conversion. 6487c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * @param buffer 6587c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * @param numFrames 6687c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * @return fdrames written or negative error 6787c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk */ 6887c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk aaudio_result_t writeNowWithConversion(const void *buffer, 6987c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk int32_t numFrames); 7087c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk 7187c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk int64_t mLastFramesRead = 0; // used to prevent retrograde motion 7287c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk}; 7387c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk 7487c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk} /* namespace aaudio */ 7587c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk 7687c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk#endif //ANDROID_AAUDIO_AUDIO_STREAM_INTERNAL_PLAY_H 77