| /* |
| * Copyright (C) 2019 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| // Test whether a stream dies if it is written to after a delay. |
| // Maybe because the message queue from the AAudio service fills up. |
| |
| #include <stdio.h> |
| #include <unistd.h> |
| |
| #include <aaudio/AAudio.h> |
| #include <gtest/gtest.h> |
| |
| constexpr int64_t kNanosPerSecond = 1000000000; |
| constexpr int64_t kTimeoutNanos = kNanosPerSecond / 2; |
| constexpr int kNumFrames = 256; |
| constexpr int kChannelCount = 2; |
| |
| static void checkFullQueue(aaudio_performance_mode_t perfMode, |
| int32_t sleepMillis) { |
| std::unique_ptr<float[]> buffer = std::make_unique<float[]>( |
| kNumFrames * kChannelCount); |
| |
| AAudioStreamBuilder *aaudioBuilder = nullptr; |
| |
| // Use an AAudioStreamBuilder to contain requested parameters. |
| ASSERT_EQ(AAUDIO_OK, AAudio_createStreamBuilder(&aaudioBuilder)); |
| |
| AAudioStreamBuilder_setChannelCount(aaudioBuilder, kChannelCount); |
| |
| // Request stream properties. |
| AAudioStreamBuilder_setPerformanceMode(aaudioBuilder, perfMode); |
| |
| // Create an AAudioStream using the Builder. |
| AAudioStream *aaudioStream = nullptr; |
| ASSERT_EQ(AAUDIO_OK, AAudioStreamBuilder_openStream(aaudioBuilder, |
| &aaudioStream)); |
| AAudioStreamBuilder_delete(aaudioBuilder); |
| |
| EXPECT_EQ(AAUDIO_OK, AAudioStream_requestStart(aaudioStream)); |
| |
| // Sleep for awhile. This might kill the stream. |
| usleep(sleepMillis * 1000); // 1000 millis in a microsecond |
| |
| for (int i = 0; i < 10; i++) { |
| const aaudio_result_t result = AAudioStream_write(aaudioStream, |
| buffer.get(), |
| kNumFrames, |
| kTimeoutNanos); |
| EXPECT_EQ(kNumFrames, result); |
| if (kNumFrames != result) break; |
| } |
| |
| EXPECT_EQ(AAUDIO_OK, AAudioStream_requestStop(aaudioStream)); |
| |
| EXPECT_EQ(AAUDIO_OK, AAudioStream_close(aaudioStream)); |
| } |
| |
| TEST(test_full_queue, aaudio_full_queue_perf_none_50) { |
| checkFullQueue(AAUDIO_PERFORMANCE_MODE_NONE, 50 /* sleepMillis */); |
| } |
| |
| TEST(test_full_queue, aaudio_full_queue_perf_none_200) { |
| checkFullQueue(AAUDIO_PERFORMANCE_MODE_NONE, 200 /* sleepMillis */); |
| } |
| |
| TEST(test_full_queue, aaudio_full_queue_perf_none_1000) { |
| checkFullQueue(AAUDIO_PERFORMANCE_MODE_NONE, 1000 /* sleepMillis */); |
| } |
| |
| TEST(test_full_queue, aaudio_full_queue_low_latency_50) { |
| checkFullQueue(AAUDIO_PERFORMANCE_MODE_LOW_LATENCY, 50 /* sleepMillis */); |
| } |
| |
| TEST(test_full_queue, aaudio_full_queue_low_latency_200) { |
| checkFullQueue(AAUDIO_PERFORMANCE_MODE_LOW_LATENCY, 200 /* sleepMillis */); |
| } |
| |
| TEST(test_full_queue, aaudio_full_queue_low_latency_1000) { |
| checkFullQueue(AAUDIO_PERFORMANCE_MODE_LOW_LATENCY, 1000 /* sleepMillis */); |
| } |