blob: 0ed935785a5d534d13b86388aad77a7deae9d71f [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
17#define LOG_TAG "AHAL_Stream"
18#include <android-base/logging.h>
19
20#include "core-impl/Module.h"
21#include "core-impl/StreamStub.h"
22
23using aidl::android::hardware::audio::common::SinkMetadata;
24using aidl::android::hardware::audio::common::SourceMetadata;
jiabin253bd322023-01-25 23:57:31 +000025using aidl::android::media::audio::common::AudioDevice;
Mikhail Naganovf429c032023-01-07 00:24:50 +000026using aidl::android::media::audio::common::AudioOffloadInfo;
Mikhail Naganov6725ef52023-02-09 17:52:50 -080027using aidl::android::media::audio::common::MicrophoneInfo;
Mikhail Naganovf429c032023-01-07 00:24:50 +000028
29namespace aidl::android::hardware::audio::core {
30
31DriverStub::DriverStub(const StreamContext& context, bool isInput)
32 : mFrameSizeBytes(context.getFrameSize()), mIsInput(isInput) {}
33
34::android::status_t DriverStub::init() {
35 usleep(1000);
36 return ::android::OK;
37}
38
39::android::status_t DriverStub::drain(StreamDescriptor::DrainMode) {
40 usleep(1000);
41 return ::android::OK;
42}
43
44::android::status_t DriverStub::flush() {
45 usleep(1000);
46 return ::android::OK;
47}
48
49::android::status_t DriverStub::pause() {
50 usleep(1000);
51 return ::android::OK;
52}
53
54::android::status_t DriverStub::transfer(void* buffer, size_t frameCount, size_t* actualFrameCount,
55 int32_t* latencyMs) {
56 usleep(3000);
57 if (mIsInput) {
58 uint8_t* byteBuffer = static_cast<uint8_t*>(buffer);
59 for (size_t i = 0; i < frameCount * mFrameSizeBytes; ++i) {
60 byteBuffer[i] = std::rand() % 255;
61 }
62 }
63 *actualFrameCount = frameCount;
64 *latencyMs = Module::kLatencyMs;
65 return ::android::OK;
66}
67
68::android::status_t DriverStub::standby() {
69 usleep(1000);
70 return ::android::OK;
71}
72
jiabin253bd322023-01-25 23:57:31 +000073::android::status_t DriverStub::setConnectedDevices(
74 const std::vector<AudioDevice>& connectedDevices __unused) {
75 return ::android::OK;
76}
77
Mikhail Naganovf429c032023-01-07 00:24:50 +000078// static
79ndk::ScopedAStatus StreamInStub::createInstance(const SinkMetadata& sinkMetadata,
80 StreamContext&& context,
81 const std::vector<MicrophoneInfo>& microphones,
82 std::shared_ptr<StreamIn>* result) {
83 std::shared_ptr<StreamIn> stream =
84 ndk::SharedRefBase::make<StreamInStub>(sinkMetadata, std::move(context), microphones);
85 if (auto status = initInstance(stream); !status.isOk()) {
86 return status;
87 }
88 *result = std::move(stream);
89 return ndk::ScopedAStatus::ok();
90}
91
92StreamInStub::StreamInStub(const SinkMetadata& sinkMetadata, StreamContext&& context,
93 const std::vector<MicrophoneInfo>& microphones)
94 : StreamIn(
95 sinkMetadata, std::move(context),
96 [](const StreamContext& ctx) -> DriverInterface* {
97 return new DriverStub(ctx, true /*isInput*/);
98 },
99 [](const StreamContext& ctx, DriverInterface* driver) -> StreamWorkerInterface* {
100 // The default worker implementation is used.
101 return new StreamInWorker(ctx, driver);
102 },
103 microphones) {}
104
105// static
106ndk::ScopedAStatus StreamOutStub::createInstance(const SourceMetadata& sourceMetadata,
107 StreamContext&& context,
108 const std::optional<AudioOffloadInfo>& offloadInfo,
109 std::shared_ptr<StreamOut>* result) {
110 std::shared_ptr<StreamOut> stream = ndk::SharedRefBase::make<StreamOutStub>(
111 sourceMetadata, std::move(context), offloadInfo);
112 if (auto status = initInstance(stream); !status.isOk()) {
113 return status;
114 }
115 *result = std::move(stream);
116 return ndk::ScopedAStatus::ok();
117}
118
119StreamOutStub::StreamOutStub(const SourceMetadata& sourceMetadata, StreamContext&& context,
120 const std::optional<AudioOffloadInfo>& offloadInfo)
121 : StreamOut(
122 sourceMetadata, std::move(context),
123 [](const StreamContext& ctx) -> DriverInterface* {
124 return new DriverStub(ctx, false /*isInput*/);
125 },
126 [](const StreamContext& ctx, DriverInterface* driver) -> StreamWorkerInterface* {
127 // The default worker implementation is used.
128 return new StreamOutWorker(ctx, driver);
129 },
130 offloadInfo) {}
131
132} // namespace aidl::android::hardware::audio::core