blob: 289afa1c8540847d24fbf839ee9c73059163b3b5 [file] [log] [blame]
Mikhail Naganovf429c032023-01-07 00:24:50 +00001/*
2 * Copyright (C) 2023 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Mikhail Naganove48e5732023-03-06 18:48:02 -080017#include <cmath>
18
Mikhail Naganovf429c032023-01-07 00:24:50 +000019#define LOG_TAG "AHAL_Stream"
20#include <android-base/logging.h>
Mikhail Naganove48e5732023-03-06 18:48:02 -080021#include <audio_utils/clock.h>
Mikhail Naganovf429c032023-01-07 00:24:50 +000022
23#include "core-impl/Module.h"
24#include "core-impl/StreamStub.h"
25
26using aidl::android::hardware::audio::common::SinkMetadata;
27using aidl::android::hardware::audio::common::SourceMetadata;
jiabin253bd322023-01-25 23:57:31 +000028using aidl::android::media::audio::common::AudioDevice;
Mikhail Naganovf429c032023-01-07 00:24:50 +000029using aidl::android::media::audio::common::AudioOffloadInfo;
Mikhail Naganov6725ef52023-02-09 17:52:50 -080030using aidl::android::media::audio::common::MicrophoneInfo;
Mikhail Naganovf429c032023-01-07 00:24:50 +000031
32namespace aidl::android::hardware::audio::core {
33
Mikhail Naganovefe980b2023-06-21 15:20:31 -070034StreamStub::StreamStub(const Metadata& metadata, StreamContext&& context)
35 : StreamCommonImpl(metadata, std::move(context)),
36 mFrameSizeBytes(context.getFrameSize()),
Mikhail Naganove48e5732023-03-06 18:48:02 -080037 mSampleRate(context.getSampleRate()),
38 mIsAsynchronous(!!context.getAsyncCallback()),
Mikhail Naganovefe980b2023-06-21 15:20:31 -070039 mIsInput(isInput(metadata)) {}
Mikhail Naganovf429c032023-01-07 00:24:50 +000040
Mikhail Naganovefe980b2023-06-21 15:20:31 -070041::android::status_t StreamStub::init() {
Mikhail Naganove48e5732023-03-06 18:48:02 -080042 usleep(500);
Mikhail Naganovf429c032023-01-07 00:24:50 +000043 return ::android::OK;
44}
45
Mikhail Naganovefe980b2023-06-21 15:20:31 -070046::android::status_t StreamStub::drain(StreamDescriptor::DrainMode) {
Mikhail Naganove48e5732023-03-06 18:48:02 -080047 usleep(500);
Mikhail Naganovf429c032023-01-07 00:24:50 +000048 return ::android::OK;
49}
50
Mikhail Naganovefe980b2023-06-21 15:20:31 -070051::android::status_t StreamStub::flush() {
Mikhail Naganove48e5732023-03-06 18:48:02 -080052 usleep(500);
Mikhail Naganovf429c032023-01-07 00:24:50 +000053 return ::android::OK;
54}
55
Mikhail Naganovefe980b2023-06-21 15:20:31 -070056::android::status_t StreamStub::pause() {
Mikhail Naganove48e5732023-03-06 18:48:02 -080057 usleep(500);
Mikhail Naganovf429c032023-01-07 00:24:50 +000058 return ::android::OK;
59}
60
Mikhail Naganovefe980b2023-06-21 15:20:31 -070061::android::status_t StreamStub::transfer(void* buffer, size_t frameCount, size_t* actualFrameCount,
Mikhail Naganovf429c032023-01-07 00:24:50 +000062 int32_t* latencyMs) {
Mikhail Naganove48e5732023-03-06 18:48:02 -080063 static constexpr float kMicrosPerSecond = MICROS_PER_SECOND;
64 static constexpr float kScaleFactor = .8f;
65 if (mIsAsynchronous) {
66 usleep(500);
67 } else {
68 const size_t delayUs = static_cast<size_t>(
69 std::roundf(kScaleFactor * frameCount * kMicrosPerSecond / mSampleRate));
70 usleep(delayUs);
71 }
Mikhail Naganovf429c032023-01-07 00:24:50 +000072 if (mIsInput) {
73 uint8_t* byteBuffer = static_cast<uint8_t*>(buffer);
74 for (size_t i = 0; i < frameCount * mFrameSizeBytes; ++i) {
75 byteBuffer[i] = std::rand() % 255;
76 }
77 }
78 *actualFrameCount = frameCount;
79 *latencyMs = Module::kLatencyMs;
80 return ::android::OK;
81}
82
Mikhail Naganovefe980b2023-06-21 15:20:31 -070083::android::status_t StreamStub::standby() {
Mikhail Naganove48e5732023-03-06 18:48:02 -080084 usleep(500);
Mikhail Naganovf429c032023-01-07 00:24:50 +000085 return ::android::OK;
86}
87
Mikhail Naganovefe980b2023-06-21 15:20:31 -070088void StreamStub::shutdown() {}
jiabin253bd322023-01-25 23:57:31 +000089
Mikhail Naganovf429c032023-01-07 00:24:50 +000090// static
91ndk::ScopedAStatus StreamInStub::createInstance(const SinkMetadata& sinkMetadata,
92 StreamContext&& context,
93 const std::vector<MicrophoneInfo>& microphones,
94 std::shared_ptr<StreamIn>* result) {
95 std::shared_ptr<StreamIn> stream =
96 ndk::SharedRefBase::make<StreamInStub>(sinkMetadata, std::move(context), microphones);
Mikhail Naganovefe980b2023-06-21 15:20:31 -070097 if (auto status = stream->initInstance(stream); !status.isOk()) {
Mikhail Naganovf429c032023-01-07 00:24:50 +000098 return status;
99 }
100 *result = std::move(stream);
101 return ndk::ScopedAStatus::ok();
102}
103
104StreamInStub::StreamInStub(const SinkMetadata& sinkMetadata, StreamContext&& context,
105 const std::vector<MicrophoneInfo>& microphones)
Mikhail Naganovefe980b2023-06-21 15:20:31 -0700106 : StreamStub(sinkMetadata, std::move(context)), StreamIn(microphones) {}
Mikhail Naganovf429c032023-01-07 00:24:50 +0000107
108// static
109ndk::ScopedAStatus StreamOutStub::createInstance(const SourceMetadata& sourceMetadata,
110 StreamContext&& context,
111 const std::optional<AudioOffloadInfo>& offloadInfo,
112 std::shared_ptr<StreamOut>* result) {
113 std::shared_ptr<StreamOut> stream = ndk::SharedRefBase::make<StreamOutStub>(
114 sourceMetadata, std::move(context), offloadInfo);
Mikhail Naganovefe980b2023-06-21 15:20:31 -0700115 if (auto status = stream->initInstance(stream); !status.isOk()) {
Mikhail Naganovf429c032023-01-07 00:24:50 +0000116 return status;
117 }
118 *result = std::move(stream);
119 return ndk::ScopedAStatus::ok();
120}
121
122StreamOutStub::StreamOutStub(const SourceMetadata& sourceMetadata, StreamContext&& context,
123 const std::optional<AudioOffloadInfo>& offloadInfo)
Mikhail Naganovefe980b2023-06-21 15:20:31 -0700124 : StreamStub(sourceMetadata, std::move(context)), StreamOut(offloadInfo) {}
Mikhail Naganovf429c032023-01-07 00:24:50 +0000125
126} // namespace aidl::android::hardware::audio::core