blob: a49af964e8a463d653352f1015d6c4b110eaed08 [file] [log] [blame]
Ram Mohanba55d5a2022-01-11 20:23:44 +05301/*
2 * Copyright (C) 2021 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_NDEBUG 0
18
19#include <gtest/gtest.h>
20
21#include "audio_test_utils.h"
22
23using namespace android;
24
25TEST(AudioTrackTest, TestPlayTrack) {
Atneya Naireb576172022-04-21 18:24:01 -040026 const auto ap = sp<AudioPlayback>::make(44100 /* sampleRate */, AUDIO_FORMAT_PCM_16_BIT,
27 AUDIO_CHANNEL_OUT_STEREO, AUDIO_OUTPUT_FLAG_NONE,
28 AUDIO_SESSION_NONE, AudioTrack::TRANSFER_OBTAIN);
Ram Mohanba55d5a2022-01-11 20:23:44 +053029 ASSERT_NE(nullptr, ap);
30 ASSERT_EQ(OK, ap->loadResource("/data/local/tmp/bbb_2ch_24kHz_s16le.raw"))
31 << "Unable to open Resource";
32 EXPECT_EQ(OK, ap->create()) << "track creation failed";
33 EXPECT_EQ(OK, ap->start()) << "audio track start failed";
34 EXPECT_EQ(OK, ap->onProcess());
35 ap->stop();
36}
37
38TEST(AudioTrackTest, TestSeek) {
Atneya Naireb576172022-04-21 18:24:01 -040039 const auto ap = sp<AudioPlayback>::make(
40 44100 /* sampleRate */, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO);
Ram Mohanba55d5a2022-01-11 20:23:44 +053041 ASSERT_NE(nullptr, ap);
42 ASSERT_EQ(OK, ap->loadResource("/data/local/tmp/bbb_2ch_24kHz_s16le.raw"))
43 << "Unable to open Resource";
44 EXPECT_EQ(OK, ap->create()) << "track creation failed";
45 EXPECT_EQ(OK, ap->start()) << "audio track start failed";
46 EXPECT_EQ(OK, ap->onProcess(true));
47 ap->stop();
48}
49
50TEST(AudioTrackTest, TestAudioCbNotifier) {
Atneya Naireb576172022-04-21 18:24:01 -040051 const auto ap = sp<AudioPlayback>::make(0 /* sampleRate */, AUDIO_FORMAT_PCM_16_BIT,
52 AUDIO_CHANNEL_OUT_STEREO, AUDIO_OUTPUT_FLAG_FAST,
53 AUDIO_SESSION_NONE, AudioTrack::TRANSFER_SHARED);
Ram Mohanba55d5a2022-01-11 20:23:44 +053054 ASSERT_NE(nullptr, ap);
55 ASSERT_EQ(OK, ap->loadResource("/data/local/tmp/bbb_2ch_24kHz_s16le.raw"))
56 << "Unable to open Resource";
57 EXPECT_EQ(OK, ap->create()) << "track creation failed";
58 EXPECT_EQ(BAD_VALUE, ap->getAudioTrackHandle()->addAudioDeviceCallback(nullptr));
59 sp<OnAudioDeviceUpdateNotifier> cb = new OnAudioDeviceUpdateNotifier();
60 sp<OnAudioDeviceUpdateNotifier> cbOld = new OnAudioDeviceUpdateNotifier();
61 EXPECT_EQ(OK, ap->getAudioTrackHandle()->addAudioDeviceCallback(cbOld));
62 EXPECT_EQ(INVALID_OPERATION, ap->getAudioTrackHandle()->addAudioDeviceCallback(cbOld));
63 EXPECT_EQ(OK, ap->getAudioTrackHandle()->addAudioDeviceCallback(cb));
64 EXPECT_EQ(OK, ap->start()) << "audio track start failed";
65 EXPECT_EQ(OK, ap->onProcess());
66 EXPECT_EQ(OK, cb->waitForAudioDeviceCb());
67 EXPECT_EQ(AUDIO_IO_HANDLE_NONE, cbOld->mAudioIo);
68 EXPECT_EQ(AUDIO_PORT_HANDLE_NONE, cbOld->mDeviceId);
69 EXPECT_NE(AUDIO_IO_HANDLE_NONE, cb->mAudioIo);
70 EXPECT_NE(AUDIO_PORT_HANDLE_NONE, cb->mDeviceId);
Ram Mohan236a7622022-02-01 11:31:58 +053071 EXPECT_TRUE(checkPatchPlayback(cb->mAudioIo, cb->mDeviceId));
Ram Mohanba55d5a2022-01-11 20:23:44 +053072 EXPECT_EQ(BAD_VALUE, ap->getAudioTrackHandle()->removeAudioDeviceCallback(nullptr));
73 EXPECT_EQ(INVALID_OPERATION, ap->getAudioTrackHandle()->removeAudioDeviceCallback(cbOld));
74 EXPECT_EQ(OK, ap->getAudioTrackHandle()->removeAudioDeviceCallback(cb));
75 ap->stop();
76}
77
78class AudioTrackCreateTest
79 : public ::testing::TestWithParam<std::tuple<uint32_t, audio_format_t, audio_channel_mask_t,
80 audio_output_flags_t, audio_session_t>> {
81 public:
82 AudioTrackCreateTest()
83 : mSampleRate(std::get<0>(GetParam())),
84 mFormat(std::get<1>(GetParam())),
85 mChannelMask(std::get<2>(GetParam())),
86 mFlags(std::get<3>(GetParam())),
87 mSessionId(std::get<4>(GetParam())){};
88
89 const uint32_t mSampleRate;
90 const audio_format_t mFormat;
91 const audio_channel_mask_t mChannelMask;
92 const audio_output_flags_t mFlags;
93 const audio_session_t mSessionId;
94
Atneya Naireb576172022-04-21 18:24:01 -040095 sp<AudioPlayback> mAP;
Ram Mohanba55d5a2022-01-11 20:23:44 +053096
97 virtual void SetUp() override {
Atneya Naireb576172022-04-21 18:24:01 -040098 mAP = sp<AudioPlayback>::make(mSampleRate, mFormat, mChannelMask, mFlags,
Ram Mohanba55d5a2022-01-11 20:23:44 +053099 mSessionId);
100 ASSERT_NE(nullptr, mAP);
101 ASSERT_EQ(OK, mAP->loadResource("/data/local/tmp/bbb_2ch_24kHz_s16le.raw"))
102 << "Unable to open Resource";
103 ASSERT_EQ(OK, mAP->create()) << "track creation failed";
104 }
105
106 virtual void TearDown() override {
107 if (mAP) mAP->stop();
108 }
109};
110
111TEST_P(AudioTrackCreateTest, TestCreateTrack) {
112 EXPECT_EQ(mFormat, mAP->getAudioTrackHandle()->format());
113 EXPECT_EQ(audio_channel_count_from_out_mask(mChannelMask),
114 mAP->getAudioTrackHandle()->channelCount());
115 if (mSampleRate != 0) EXPECT_EQ(mSampleRate, mAP->getAudioTrackHandle()->getSampleRate());
116 if (mSessionId != AUDIO_SESSION_NONE)
117 EXPECT_EQ(mSessionId, mAP->getAudioTrackHandle()->getSessionId());
118 EXPECT_EQ(mSampleRate, mAP->getAudioTrackHandle()->getOriginalSampleRate());
119 EXPECT_EQ(OK, mAP->start()) << "audio track start failed";
120 EXPECT_EQ(OK, mAP->onProcess());
121}
122
123// sampleRate, format, channelMask, flags, sessionId
124INSTANTIATE_TEST_SUITE_P(
125 AudioTrackParameterizedTest, AudioTrackCreateTest,
126 ::testing::Combine(::testing::Values(48000), ::testing::Values(AUDIO_FORMAT_PCM_16_BIT),
127 ::testing::Values(AUDIO_CHANNEL_OUT_STEREO),
128 ::testing::Values(AUDIO_OUTPUT_FLAG_NONE,
129 AUDIO_OUTPUT_FLAG_PRIMARY | AUDIO_OUTPUT_FLAG_FAST,
130 AUDIO_OUTPUT_FLAG_RAW | AUDIO_OUTPUT_FLAG_FAST,
131 AUDIO_OUTPUT_FLAG_DEEP_BUFFER),
132 ::testing::Values(AUDIO_SESSION_NONE)));