blob: d08e150129055dd68314b9082eca6f56d6cf11e6 [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) {
26 std::unique_ptr<AudioPlayback> ap(new AudioPlayback(
27 44100, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO, AUDIO_OUTPUT_FLAG_NONE,
28 AUDIO_SESSION_NONE, AudioTrack::TRANSFER_OBTAIN));
29 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) {
39 std::unique_ptr<AudioPlayback> ap(
40 new AudioPlayback(44100, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO));
41 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) {
51 std::unique_ptr<AudioPlayback> ap(new AudioPlayback(
52 0, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO, AUDIO_OUTPUT_FLAG_FAST,
53 AUDIO_SESSION_NONE, AudioTrack::TRANSFER_SHARED));
54 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);
71 EXPECT_EQ(BAD_VALUE, ap->getAudioTrackHandle()->removeAudioDeviceCallback(nullptr));
72 EXPECT_EQ(INVALID_OPERATION, ap->getAudioTrackHandle()->removeAudioDeviceCallback(cbOld));
73 EXPECT_EQ(OK, ap->getAudioTrackHandle()->removeAudioDeviceCallback(cb));
74 ap->stop();
75}
76
77class AudioTrackCreateTest
78 : public ::testing::TestWithParam<std::tuple<uint32_t, audio_format_t, audio_channel_mask_t,
79 audio_output_flags_t, audio_session_t>> {
80 public:
81 AudioTrackCreateTest()
82 : mSampleRate(std::get<0>(GetParam())),
83 mFormat(std::get<1>(GetParam())),
84 mChannelMask(std::get<2>(GetParam())),
85 mFlags(std::get<3>(GetParam())),
86 mSessionId(std::get<4>(GetParam())){};
87
88 const uint32_t mSampleRate;
89 const audio_format_t mFormat;
90 const audio_channel_mask_t mChannelMask;
91 const audio_output_flags_t mFlags;
92 const audio_session_t mSessionId;
93
94 std::unique_ptr<AudioPlayback> mAP;
95
96 virtual void SetUp() override {
97 mAP = std::make_unique<AudioPlayback>(mSampleRate, mFormat, mChannelMask, mFlags,
98 mSessionId);
99 ASSERT_NE(nullptr, mAP);
100 ASSERT_EQ(OK, mAP->loadResource("/data/local/tmp/bbb_2ch_24kHz_s16le.raw"))
101 << "Unable to open Resource";
102 ASSERT_EQ(OK, mAP->create()) << "track creation failed";
103 }
104
105 virtual void TearDown() override {
106 if (mAP) mAP->stop();
107 }
108};
109
110TEST_P(AudioTrackCreateTest, TestCreateTrack) {
111 EXPECT_EQ(mFormat, mAP->getAudioTrackHandle()->format());
112 EXPECT_EQ(audio_channel_count_from_out_mask(mChannelMask),
113 mAP->getAudioTrackHandle()->channelCount());
114 if (mSampleRate != 0) EXPECT_EQ(mSampleRate, mAP->getAudioTrackHandle()->getSampleRate());
115 if (mSessionId != AUDIO_SESSION_NONE)
116 EXPECT_EQ(mSessionId, mAP->getAudioTrackHandle()->getSessionId());
117 EXPECT_EQ(mSampleRate, mAP->getAudioTrackHandle()->getOriginalSampleRate());
118 EXPECT_EQ(OK, mAP->start()) << "audio track start failed";
119 EXPECT_EQ(OK, mAP->onProcess());
120}
121
122// sampleRate, format, channelMask, flags, sessionId
123INSTANTIATE_TEST_SUITE_P(
124 AudioTrackParameterizedTest, AudioTrackCreateTest,
125 ::testing::Combine(::testing::Values(48000), ::testing::Values(AUDIO_FORMAT_PCM_16_BIT),
126 ::testing::Values(AUDIO_CHANNEL_OUT_STEREO),
127 ::testing::Values(AUDIO_OUTPUT_FLAG_NONE,
128 AUDIO_OUTPUT_FLAG_PRIMARY | AUDIO_OUTPUT_FLAG_FAST,
129 AUDIO_OUTPUT_FLAG_RAW | AUDIO_OUTPUT_FLAG_FAST,
130 AUDIO_OUTPUT_FLAG_DEEP_BUFFER),
131 ::testing::Values(AUDIO_SESSION_NONE)));