• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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