/** * Sets the stream parameters which are specific to playback, including device id and the * dataCallback function, which must be set for low latency playback. * @param builder The playback stream builder */ void PlayAudioEngine::setupPlaybackStreamParameters(AAudioStreamBuilder *builder) { AAudioStreamBuilder_setDeviceId(builder, playbackDeviceId_); AAudioStreamBuilder_setFormat(builder, sampleFormat_); AAudioStreamBuilder_setChannelCount(builder, sampleChannels_); // We request EXCLUSIVE mode since this will give us the lowest possible latency. // If EXCLUSIVE mode isn't available the builder will fall back to SHARED mode. AAudioStreamBuilder_setSharingMode(builder, AAUDIO_SHARING_MODE_EXCLUSIVE); AAudioStreamBuilder_setPerformanceMode(builder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY); AAudioStreamBuilder_setDirection(builder, AAUDIO_DIRECTION_OUTPUT); AAudioStreamBuilder_setDataCallback(builder, ::dataCallback, this); AAudioStreamBuilder_setErrorCallback(builder, ::errorCallback, this); }
static void testOpenOptions(aaudio_direction_t direction, int32_t channelCount, int32_t sampleRate, aaudio_format_t format) { aaudio_result_t result = AAUDIO_OK; int32_t bufferCapacity; int32_t framesPerBurst = 0; int32_t actualChannelCount = 0; int32_t actualSampleRate = 0; aaudio_format_t actualDataFormat = AAUDIO_FORMAT_UNSPECIFIED; aaudio_sharing_mode_t actualSharingMode = AAUDIO_SHARING_MODE_SHARED; aaudio_direction_t actualDirection; AAudioStreamBuilder *aaudioBuilder = nullptr; AAudioStream *aaudioStream = nullptr; printf("TestOpen: dir = %d, chans = %3d, rate = %6d format = %d\n", direction, channelCount, sampleRate, format); // Use an AAudioStreamBuilder to contain requested parameters. ASSERT_EQ(AAUDIO_OK, AAudio_createStreamBuilder(&aaudioBuilder)); // Request stream properties. AAudioStreamBuilder_setDirection(aaudioBuilder, direction); AAudioStreamBuilder_setSampleRate(aaudioBuilder, sampleRate); AAudioStreamBuilder_setChannelCount(aaudioBuilder, channelCount); AAudioStreamBuilder_setFormat(aaudioBuilder, format); AAudioStreamBuilder_setDataCallback(aaudioBuilder, MyDataCallbackProc, nullptr); //AAudioStreamBuilder_setPerformanceMode(aaudioBuilder, AAUDIO_PERFORMANCE_MODE_NONE); AAudioStreamBuilder_setPerformanceMode(aaudioBuilder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY); //AAudioStreamBuilder_setPerformanceMode(aaudioBuilder, AAUDIO_PERFORMANCE_MODE_POWER_SAVING); // Create an AAudioStream using the Builder. result = AAudioStreamBuilder_openStream(aaudioBuilder, &aaudioStream); if (result != AAUDIO_OK) { printf("Stream not opened! That may be OK.\n"); goto finish; } // Check to see what kind of stream we actually got. actualSampleRate = AAudioStream_getSampleRate(aaudioStream); actualChannelCount = AAudioStream_getChannelCount(aaudioStream); actualDataFormat = AAudioStream_getFormat(aaudioStream); actualDirection = AAudioStream_getDirection(aaudioStream); printf(" dir = %d, chans = %3d, rate = %6d format = %d\n", direction, actualChannelCount, actualSampleRate, actualDataFormat); // If we ask for something specific then we should get that. if (channelCount != AAUDIO_UNSPECIFIED) { EXPECT_EQ(channelCount, actualChannelCount); } if (sampleRate != AAUDIO_UNSPECIFIED) { EXPECT_EQ(sampleRate, actualSampleRate); } if (format != AAUDIO_FORMAT_UNSPECIFIED) { EXPECT_EQ(format, actualDataFormat); } EXPECT_EQ(direction, actualDirection); // This is the number of frames that are read in one chunk by a DMA controller // or a DSP or a mixer. framesPerBurst = AAudioStream_getFramesPerBurst(aaudioStream); bufferCapacity = AAudioStream_getBufferCapacityInFrames(aaudioStream); printf(" bufferCapacity = %d, remainder = %d\n", bufferCapacity, bufferCapacity % framesPerBurst); finish: AAudioStream_close(aaudioStream); AAudioStreamBuilder_delete(aaudioBuilder); printf(" result = %d = %s\n", result, AAudio_convertResultToText(result)); }