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