aaudio: initialize the callback buffer

This can prevent some loud noises during unit tests.

Also use std::unique_ptr

Bug: 154342174
Test: libaaudio/tests/test_various.cpp
Change-Id: I1c1dc0f4a6a29cf7d7a656392a81a325847de22d
gugelfrei
Phil Burk 4 years ago
parent 01d9c845f0
commit bf821e2c39

@ -230,7 +230,7 @@ aaudio_result_t AudioStreamInternal::open(const AudioStreamBuilder &builder) {
} }
const int32_t callbackBufferSize = mCallbackFrames * getBytesPerFrame(); const int32_t callbackBufferSize = mCallbackFrames * getBytesPerFrame();
mCallbackBuffer = new uint8_t[callbackBufferSize]; mCallbackBuffer = std::make_unique<uint8_t[]>(callbackBufferSize);
} }
// For debugging and analyzing the distribution of MMAP timestamps. // For debugging and analyzing the distribution of MMAP timestamps.
@ -279,8 +279,7 @@ aaudio_result_t AudioStreamInternal::release_l() {
mServiceStreamHandle = AAUDIO_HANDLE_INVALID; mServiceStreamHandle = AAUDIO_HANDLE_INVALID;
mServiceInterface.closeStream(serviceStreamHandle); mServiceInterface.closeStream(serviceStreamHandle);
delete[] mCallbackBuffer; mCallbackBuffer.reset();
mCallbackBuffer = nullptr;
result = mEndPointParcelable.close(); result = mEndPointParcelable.close();
aaudio_result_t result2 = AudioStream::release_l(); aaudio_result_t result2 = AudioStream::release_l();
return (result != AAUDIO_OK) ? result : result2; return (result != AAUDIO_OK) ? result : result2;

@ -164,7 +164,7 @@ protected:
// Offset from underlying frame position. // Offset from underlying frame position.
int64_t mFramesOffsetFromService = 0; // offset for timestamps int64_t mFramesOffsetFromService = 0; // offset for timestamps
uint8_t *mCallbackBuffer = nullptr; std::unique_ptr<uint8_t[]> mCallbackBuffer;
int32_t mCallbackFrames = 0; int32_t mCallbackFrames = 0;
// The service uses this for SHARED mode. // The service uses this for SHARED mode.

@ -243,7 +243,7 @@ void *AudioStreamInternalCapture::callbackLoop() {
int64_t timeoutNanos = calculateReasonableTimeout(mCallbackFrames); int64_t timeoutNanos = calculateReasonableTimeout(mCallbackFrames);
// This is a BLOCKING READ! // This is a BLOCKING READ!
result = read(mCallbackBuffer, mCallbackFrames, timeoutNanos); result = read(mCallbackBuffer.get(), mCallbackFrames, timeoutNanos);
if ((result != mCallbackFrames)) { if ((result != mCallbackFrames)) {
ALOGE("callbackLoop: read() returned %d", result); ALOGE("callbackLoop: read() returned %d", result);
if (result >= 0) { if (result >= 0) {
@ -255,7 +255,7 @@ void *AudioStreamInternalCapture::callbackLoop() {
} }
// Call application using the AAudio callback interface. // Call application using the AAudio callback interface.
callbackResult = maybeCallDataCallback(mCallbackBuffer, mCallbackFrames); callbackResult = maybeCallDataCallback(mCallbackBuffer.get(), mCallbackFrames);
if (callbackResult == AAUDIO_CALLBACK_RESULT_STOP) { if (callbackResult == AAUDIO_CALLBACK_RESULT_STOP) {
ALOGD("%s(): callback returned AAUDIO_CALLBACK_RESULT_STOP", __func__); ALOGD("%s(): callback returned AAUDIO_CALLBACK_RESULT_STOP", __func__);

@ -268,11 +268,11 @@ void *AudioStreamInternalPlay::callbackLoop() {
// result might be a frame count // result might be a frame count
while (mCallbackEnabled.load() && isActive() && (result >= 0)) { while (mCallbackEnabled.load() && isActive() && (result >= 0)) {
// Call application using the AAudio callback interface. // Call application using the AAudio callback interface.
callbackResult = maybeCallDataCallback(mCallbackBuffer, mCallbackFrames); callbackResult = maybeCallDataCallback(mCallbackBuffer.get(), mCallbackFrames);
if (callbackResult == AAUDIO_CALLBACK_RESULT_CONTINUE) { if (callbackResult == AAUDIO_CALLBACK_RESULT_CONTINUE) {
// Write audio data to stream. This is a BLOCKING WRITE! // Write audio data to stream. This is a BLOCKING WRITE!
result = write(mCallbackBuffer, mCallbackFrames, timeoutNanos); result = write(mCallbackBuffer.get(), mCallbackFrames, timeoutNanos);
if ((result != mCallbackFrames)) { if ((result != mCallbackFrames)) {
if (result >= 0) { if (result >= 0) {
// Only wrote some of the frames requested. Must have timed out. // Only wrote some of the frames requested. Must have timed out.

Loading…
Cancel
Save