1 /* 2 * Copyright (C) 2018 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 // Test AAudio SessionId, which is used to associate Effects with a stream 18 19 #include <stdio.h> 20 #include <unistd.h> 21 22 #include <aaudio/AAudio.h> 23 #include <gtest/gtest.h> 24 25 constexpr int64_t kNanosPerSecond = 1000000000; 26 constexpr int kNumFrames = 256; 27 constexpr int kChannelCount = 2; 28 29 // Test AAUDIO_SESSION_ID_NONE default 30 static void checkSessionIdNone(aaudio_performance_mode_t perfMode) { 31 32 float *buffer = new float[kNumFrames * kChannelCount]; 33 34 AAudioStreamBuilder *aaudioBuilder = nullptr; 35 36 AAudioStream *aaudioStream1 = nullptr; 37 int32_t sessionId1 = 0; 38 39 // Use an AAudioStreamBuilder to contain requested parameters. 40 ASSERT_EQ(AAUDIO_OK, AAudio_createStreamBuilder(&aaudioBuilder)); 41 42 // Request stream properties. 43 AAudioStreamBuilder_setPerformanceMode(aaudioBuilder, perfMode); 44 45 // Create an AAudioStream using the Builder. 46 ASSERT_EQ(AAUDIO_OK, AAudioStreamBuilder_openStream(aaudioBuilder, &aaudioStream1)); 47 48 // Since we did not request or specify a SessionID, we should get NONE 49 sessionId1 = AAudioStream_getSessionId(aaudioStream1); 50 ASSERT_EQ(AAUDIO_SESSION_ID_NONE, sessionId1); 51 52 ASSERT_EQ(AAUDIO_OK, AAudioStream_requestStart(aaudioStream1)); 53 54 ASSERT_EQ(kNumFrames, AAudioStream_write(aaudioStream1, buffer, kNumFrames, kNanosPerSecond)); 55 56 EXPECT_EQ(AAUDIO_OK, AAudioStream_requestStop(aaudioStream1)); 57 58 EXPECT_EQ(AAUDIO_OK, AAudioStream_close(aaudioStream1)); 59 delete[] buffer; 60 AAudioStreamBuilder_delete(aaudioBuilder); 61 } 62 63 TEST(test_session_id, aaudio_session_id_none_perfnone) { 64 checkSessionIdNone(AAUDIO_PERFORMANCE_MODE_NONE); 65 } 66 67 TEST(test_session_id, aaudio_session_id_none_lowlat) { 68 checkSessionIdNone(AAUDIO_PERFORMANCE_MODE_LOW_LATENCY); 69 } 70 71 // Test AAUDIO_SESSION_ID_ALLOCATE 72 static void checkSessionIdAllocate(aaudio_performance_mode_t perfMode, 73 aaudio_direction_t direction) { 74 75 float *buffer = new float[kNumFrames * kChannelCount]; 76 77 AAudioStreamBuilder *aaudioBuilder = nullptr; 78 79 AAudioStream *aaudioStream1 = nullptr; 80 int32_t sessionId1 = 0; 81 AAudioStream *aaudioStream2 = nullptr; 82 int32_t sessionId2 = 0; 83 84 // Use an AAudioStreamBuilder to contain requested parameters. 85 ASSERT_EQ(AAUDIO_OK, AAudio_createStreamBuilder(&aaudioBuilder)); 86 87 // Request stream properties. 88 AAudioStreamBuilder_setPerformanceMode(aaudioBuilder, perfMode); 89 // This stream could be input or output. 90 AAudioStreamBuilder_setDirection(aaudioBuilder, direction); 91 92 // Ask AAudio to allocate a Session ID. 93 AAudioStreamBuilder_setSessionId(aaudioBuilder, AAUDIO_SESSION_ID_ALLOCATE); 94 95 // Create an AAudioStream using the Builder. 96 ASSERT_EQ(AAUDIO_OK, AAudioStreamBuilder_openStream(aaudioBuilder, &aaudioStream1)); 97 98 // Get the allocated ID from the stream. 99 sessionId1 = AAudioStream_getSessionId(aaudioStream1); 100 101 // Check for invalid session IDs. 102 ASSERT_NE(AAUDIO_SESSION_ID_NONE, sessionId1); 103 ASSERT_NE(AAUDIO_SESSION_ID_ALLOCATE, sessionId1); 104 105 ASSERT_EQ(AAUDIO_OK, AAudioStream_requestStart(aaudioStream1)); 106 107 if (direction == AAUDIO_DIRECTION_INPUT) { 108 ASSERT_EQ(kNumFrames, AAudioStream_read(aaudioStream1, 109 buffer, kNumFrames, kNanosPerSecond)); 110 } else { 111 ASSERT_EQ(kNumFrames, AAudioStream_write(aaudioStream1, 112 buffer, kNumFrames, kNanosPerSecond)); 113 } 114 115 EXPECT_EQ(AAUDIO_OK, AAudioStream_requestStop(aaudioStream1)); 116 117 // Now open a second stream using the same session ID. ================== 118 AAudioStreamBuilder_setSessionId(aaudioBuilder, sessionId1); 119 120 // Reverse direction for second stream. 121 aaudio_direction_t otherDirection = (direction == AAUDIO_DIRECTION_OUTPUT) 122 ? AAUDIO_DIRECTION_INPUT 123 : AAUDIO_DIRECTION_OUTPUT; 124 AAudioStreamBuilder_setDirection(aaudioBuilder, otherDirection); 125 126 // Create an AAudioStream using the Builder. 127 ASSERT_EQ(AAUDIO_OK, AAudioStreamBuilder_openStream(aaudioBuilder, &aaudioStream2)); 128 129 // Get the allocated ID from the stream. 130 // It should match the ID that we set it to in the builder. 131 sessionId2 = AAudioStream_getSessionId(aaudioStream2); 132 ASSERT_EQ(sessionId1, sessionId2); 133 134 ASSERT_EQ(AAUDIO_OK, AAudioStream_requestStart(aaudioStream2)); 135 136 if (otherDirection == AAUDIO_DIRECTION_INPUT) { 137 ASSERT_EQ(kNumFrames, AAudioStream_read(aaudioStream2, 138 buffer, kNumFrames, kNanosPerSecond)); 139 } else { 140 ASSERT_EQ(kNumFrames, AAudioStream_write(aaudioStream2, 141 buffer, kNumFrames, kNanosPerSecond)); 142 } 143 144 EXPECT_EQ(AAUDIO_OK, AAudioStream_requestStop(aaudioStream2)); 145 146 EXPECT_EQ(AAUDIO_OK, AAudioStream_close(aaudioStream2)); 147 148 149 EXPECT_EQ(AAUDIO_OK, AAudioStream_close(aaudioStream1)); 150 delete[] buffer; 151 AAudioStreamBuilder_delete(aaudioBuilder); 152 } 153 154 TEST(test_session_id, aaudio_session_id_alloc_perfnone_in) { 155 checkSessionIdAllocate(AAUDIO_PERFORMANCE_MODE_NONE, AAUDIO_DIRECTION_INPUT); 156 } 157 TEST(test_session_id, aaudio_session_id_alloc_perfnone_out) { 158 checkSessionIdAllocate(AAUDIO_PERFORMANCE_MODE_NONE, AAUDIO_DIRECTION_OUTPUT); 159 } 160 161 TEST(test_session_id, aaudio_session_id_alloc_lowlat_in) { 162 checkSessionIdAllocate(AAUDIO_PERFORMANCE_MODE_LOW_LATENCY, AAUDIO_DIRECTION_INPUT); 163 } 164 TEST(test_session_id, aaudio_session_id_alloc_lowlat_out) { 165 checkSessionIdAllocate(AAUDIO_PERFORMANCE_MODE_LOW_LATENCY, AAUDIO_DIRECTION_OUTPUT); 166 } 167