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#ifndef ANDROID_AAUDIO_AUDIO_STREAM_INTERNAL_CAPTURE_H
1787c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk#define ANDROID_AAUDIO_AUDIO_STREAM_INTERNAL_CAPTURE_H
1887c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk
1987c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk#include <stdint.h>
2087c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk#include <aaudio/AAudio.h>
2187c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk
2287c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk#include "binding/AAudioServiceInterface.h"
2387c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk#include "client/AudioStreamInternal.h"
2487c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk
2587c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burkusing android::sp;
2687c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burkusing android::IAAudioService;
2787c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk
2887c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burknamespace aaudio {
2987c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk
3087c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burkclass AudioStreamInternalCapture : public AudioStreamInternal {
3187c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burkpublic:
3287c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk    AudioStreamInternalCapture(AAudioServiceInterface  &serviceInterface, bool inService = false);
3387c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk    virtual ~AudioStreamInternalCapture();
3487c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk
3587c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk    aaudio_result_t read(void *buffer,
3687c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk                         int32_t numFrames,
3787c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk                         int64_t timeoutNanoseconds) override;
3887c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk
3987c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk    int64_t getFramesRead() override;
4087c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk    int64_t getFramesWritten() override;
4187c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk
4287c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk    void *callbackLoop() override;
4387c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk
4487c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk    aaudio_direction_t getDirection() const override {
4587c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk        return AAUDIO_DIRECTION_INPUT;
4687c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk    }
4787c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burkprotected:
4887c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk
4987c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk/**
5087c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * Low level data processing that will not block. It will just read or write as much as it can.
5187c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk *
5287c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * It passes back a recommended time to wake up if wakeTimePtr is not NULL.
5387c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk *
5487c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk * @return the number of frames processed or a negative error code.
5587c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk */
5687c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk    aaudio_result_t processDataNow(void *buffer,
5787c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk                                   int32_t numFrames,
5887c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk                                   int64_t currentTimeNanos,
5987c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk                                   int64_t *wakeTimePtr) override;
6087c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk
6187c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burkprivate:
6287c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk    /*
6387c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk     * Asynchronous read with data conversion.
6487c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk     * @param buffer
6587c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk     * @param numFrames
6687c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk     * @return frames written or negative error
6787c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk     */
6887c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk    aaudio_result_t readNowWithConversion(void *buffer, int32_t numFrames);
6987c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk
7087c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk    int64_t       mLastFramesWritten = 0; // used to prevent retrograde motion
7187c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk};
7287c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk
7387c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk} /* namespace aaudio */
7487c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk
7587c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk#endif //ANDROID_AAUDIO_AUDIO_STREAM_INTERNAL_CAPTURE_H
76