1 #include "btif/include/btif_avrcp_audio_track.h"
2
3 #include <aaudio/AAudio.h>
4 #include <aaudio/AAudioTesting.h>
5 #include <gtest/gtest.h>
6
7 #include <memory>
8
9 // Define the incomplete audio stream struct type.
10 struct AAudioStreamStruct {
11 // The ID of the stream.
12 int32_t streamId;
13 };
14
15 // Expected audio track.
16 typedef struct {
17 AAudioStream* stream;
18 int bitsPerSample;
19 int channelCount;
20 float* buffer;
21 size_t bufferLength;
22 float gain;
23 } BtifAvrcpAudioTrack;
24
25 class BtifAvrcpAudioTrackTest : public ::testing::Test {};
26
TEST_F(BtifAvrcpAudioTrackTest,setAudioTrackGain_maxGainSet)27 TEST_F(BtifAvrcpAudioTrackTest, setAudioTrackGain_maxGainSet) {
28 void* track_handle = BtifAvrcpAudioTrackCreate(10, 16, 3);
29 BtifAvrcpSetAudioTrackGain(track_handle, 1.0f);
30 BtifAvrcpAudioTrack* trackHolder =
31 static_cast<BtifAvrcpAudioTrack*>(track_handle);
32 EXPECT_EQ(trackHolder->gain, 1.0f);
33 BtifAvrcpAudioTrackDelete(track_handle);
34 }
35
TEST_F(BtifAvrcpAudioTrackTest,setAudioTrackGain_minimumGainSet)36 TEST_F(BtifAvrcpAudioTrackTest, setAudioTrackGain_minimumGainSet) {
37 void* track_handle = BtifAvrcpAudioTrackCreate(10, 16, 3);
38 BtifAvrcpSetAudioTrackGain(track_handle, 0.0f);
39 BtifAvrcpAudioTrack* trackHolder =
40 static_cast<BtifAvrcpAudioTrack*>(track_handle);
41 EXPECT_EQ(trackHolder->gain, 0.0f);
42 BtifAvrcpAudioTrackDelete(track_handle);
43 }
44
TEST_F(BtifAvrcpAudioTrackTest,setAudioTrackGain_maxGainOutOfBounds_setsCappedGain)45 TEST_F(BtifAvrcpAudioTrackTest,
46 setAudioTrackGain_maxGainOutOfBounds_setsCappedGain) {
47 void* track_handle = BtifAvrcpAudioTrackCreate(10, 16, 3);
48 BtifAvrcpAudioTrack* trackHolder =
49 static_cast<BtifAvrcpAudioTrack*>(track_handle);
50 BtifAvrcpSetAudioTrackGain(track_handle, 2.0f);
51 EXPECT_EQ(trackHolder->gain, 1.0f);
52 BtifAvrcpAudioTrackDelete(track_handle);
53 }
54
TEST_F(BtifAvrcpAudioTrackTest,setAudioTrackGain_minGainOutOfBounds_setsCappedGain)55 TEST_F(BtifAvrcpAudioTrackTest,
56 setAudioTrackGain_minGainOutOfBounds_setsCappedGain) {
57 void* track_handle = BtifAvrcpAudioTrackCreate(10, 16, 3);
58 BtifAvrcpAudioTrack* trackHolder =
59 static_cast<BtifAvrcpAudioTrack*>(track_handle);
60 BtifAvrcpSetAudioTrackGain(track_handle, -2.0f);
61 EXPECT_EQ(trackHolder->gain, 0.0f);
62 BtifAvrcpAudioTrackDelete(track_handle);
63 }
64
TEST_F(BtifAvrcpAudioTrackTest,setMaxAudioTrackGain_minGain_bufferStreamDucked)65 TEST_F(BtifAvrcpAudioTrackTest,
66 setMaxAudioTrackGain_minGain_bufferStreamDucked) {
67 constexpr float scaleQ15ToFloat = 1.0f / 32768.0f;
68 constexpr size_t bufferLength = 100;
69 constexpr int bitsPerSample = 16;
70 constexpr size_t sampleSize = bitsPerSample / 8;
71 constexpr auto gainValue = 0.5f;
72 void* track_handle = BtifAvrcpAudioTrackCreate(10, bitsPerSample, 3);
73 BtifAvrcpAudioTrack* trackHolder =
74 static_cast<BtifAvrcpAudioTrack*>(track_handle);
75 std::unique_ptr<AAudioStream> stream(new AAudioStream);
76 // Set the values to track holder as mock audio lib APIs are a no-op.
77 trackHolder->stream = stream.get();
78 trackHolder->bufferLength = bufferLength;
79 trackHolder->buffer = new float[trackHolder->bufferLength]();
80
81 BtifAvrcpSetAudioTrackGain(trackHolder, gainValue);
82 // Create a fake buffer.
83 uint8_t data[bufferLength];
84 for (size_t index = 0; index < bufferLength; ++index) {
85 data[index] = index;
86 }
87 BtifAvrcpAudioTrackWriteData(trackHolder, data, bufferLength);
88 const int16_t* dataInt = (int16_t*)data;
89 for (size_t index = 0; index < bufferLength / sampleSize; ++index) {
90 const float expected = dataInt[index] * scaleQ15ToFloat * gainValue;
91 EXPECT_NEAR(expected, trackHolder->buffer[index], 0.01f);
92 }
93 BtifAvrcpAudioTrackDelete(trackHolder);
94 }
95