Loading cmds/stagefright/AudioPlayer.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -453,7 +453,7 @@ size_t AudioPlayer::AudioSinkCallback( } size_t AudioPlayer::onMoreData(const AudioTrack::Buffer& buffer) { return fillBuffer(buffer.raw, buffer.size); return fillBuffer(buffer.data(), buffer.size()); } void AudioPlayer::onStreamEnd() { Loading media/libaaudio/src/legacy/AudioStreamLegacy.cpp +72 −7 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ size_t AudioStreamLegacy::onMoreData(const android::AudioTrack::Buffer& buffer) // This takes advantage of them killing the stream when they see a size out of range. // That is an undocumented behavior. // TODO add to API in AudioRecord and AudioTrack // TODO(b/216175830) cleanup size re-computation const size_t SIZE_STOP_CALLBACKS = SIZE_MAX; aaudio_data_callback_result_t callbackResult; (void) checkForDisconnectRequest(true); Loading @@ -83,7 +84,7 @@ size_t AudioStreamLegacy::onMoreData(const android::AudioTrack::Buffer& buffer) // Note that this code assumes an AudioTrack::Buffer is the same as // AudioRecord::Buffer // TODO define our own AudioBuffer and pass it from the subclasses. size_t written = buffer.size; size_t written = buffer.size(); if (getState() == AAUDIO_STREAM_STATE_DISCONNECTED) { ALOGW("%s() data, stream disconnected", __func__); // This will kill the stream and prevent it from being restarted. Loading @@ -96,23 +97,23 @@ size_t AudioStreamLegacy::onMoreData(const android::AudioTrack::Buffer& buffer) // caused by Legacy callbacks running after the track is "stopped". written = 0; } else { if (buffer.frameCount == 0) { if (buffer.getFrameCount() == 0) { ALOGW("%s() data, frameCount is zero", __func__); return written; } // If the caller specified an exact size then use a block size adapter. if (mBlockAdapter != nullptr) { int32_t byteCount = buffer.frameCount * getBytesPerDeviceFrame(); int32_t byteCount = buffer.getFrameCount() * getBytesPerDeviceFrame(); callbackResult = mBlockAdapter->processVariableBlock( static_cast<uint8_t*>(buffer.raw), byteCount); buffer.data(), byteCount); } else { // Call using the AAudio callback interface. callbackResult = callDataCallbackFrames(static_cast<uint8_t *>(buffer.raw), buffer.frameCount); callbackResult = callDataCallbackFrames(buffer.data(), buffer.getFrameCount()); } if (callbackResult == AAUDIO_CALLBACK_RESULT_CONTINUE) { written = buffer.frameCount * getBytesPerDeviceFrame(); written = buffer.getFrameCount() * getBytesPerDeviceFrame(); } else { if (callbackResult == AAUDIO_CALLBACK_RESULT_STOP) { ALOGD("%s() callback returned AAUDIO_CALLBACK_RESULT_STOP", __func__); Loading @@ -134,6 +135,70 @@ size_t AudioStreamLegacy::onMoreData(const android::AudioTrack::Buffer& buffer) return written; } // TODO (b/216175830) this method is duplicated in order to ease refactoring which will // reconsolidate. size_t AudioStreamLegacy::onMoreData(const android::AudioRecord::Buffer& buffer) { // This illegal size can be used to tell AudioRecord or AudioTrack to stop calling us. // This takes advantage of them killing the stream when they see a size out of range. // That is an undocumented behavior. // TODO add to API in AudioRecord and AudioTrack const size_t SIZE_STOP_CALLBACKS = SIZE_MAX; aaudio_data_callback_result_t callbackResult; (void) checkForDisconnectRequest(true); // Note that this code assumes an AudioTrack::Buffer is the same as // AudioRecord::Buffer // TODO define our own AudioBuffer and pass it from the subclasses. size_t written = buffer.size(); if (getState() == AAUDIO_STREAM_STATE_DISCONNECTED) { ALOGW("%s() data, stream disconnected", __func__); // This will kill the stream and prevent it from being restarted. // That is OK because the stream is disconnected. written = SIZE_STOP_CALLBACKS; } else if (!mCallbackEnabled.load()) { ALOGW("%s() no data because callback disabled, set size=0", __func__); // Do NOT use SIZE_STOP_CALLBACKS here because that will kill the stream and // prevent it from being restarted. This can occur because of a race condition // caused by Legacy callbacks running after the track is "stopped". written = 0; } else { if (buffer.getFrameCount() == 0) { ALOGW("%s() data, frameCount is zero", __func__); return written; } // If the caller specified an exact size then use a block size adapter. if (mBlockAdapter != nullptr) { int32_t byteCount = buffer.getFrameCount() * getBytesPerDeviceFrame(); callbackResult = mBlockAdapter->processVariableBlock( buffer.data(), byteCount); } else { // Call using the AAudio callback interface. callbackResult = callDataCallbackFrames(buffer.data(), buffer.getFrameCount()); } if (callbackResult == AAUDIO_CALLBACK_RESULT_CONTINUE) { written = buffer.getFrameCount() * getBytesPerDeviceFrame(); } else { if (callbackResult == AAUDIO_CALLBACK_RESULT_STOP) { ALOGD("%s() callback returned AAUDIO_CALLBACK_RESULT_STOP", __func__); } else { ALOGW("%s() callback returned invalid result = %d", __func__, callbackResult); } written = 0; systemStopInternal(); // Disable the callback just in case the system keeps trying to call us. mCallbackEnabled.store(false); } if (updateStateMachine() != AAUDIO_OK) { forceDisconnect(); mCallbackEnabled.store(false); } } return written; } aaudio_result_t AudioStreamLegacy::checkForDisconnectRequest(bool errorCallbackEnabled) { if (mRequestDisconnect.isRequested()) { Loading media/libaaudio/src/legacy/AudioStreamLegacy.h +8 −2 Original line number Diff line number Diff line Loading @@ -17,9 +17,10 @@ #ifndef LEGACY_AUDIO_STREAM_LEGACY_H #define LEGACY_AUDIO_STREAM_LEGACY_H #include <media/AudioRecord.h> #include <media/AudioSystem.h> #include <media/AudioTimestamp.h> #include <media/AudioTrack.h> #include <media/AudioSystem.h> #include <aaudio/AAudio.h> Loading Loading @@ -57,7 +58,8 @@ typedef int32_t aaudio_callback_operation_t; class AudioStreamLegacy : public AudioStream, public FixedBlockProcessor, protected android::AudioTrack::IAudioTrackCallback { protected android::AudioTrack::IAudioTrackCallback, protected android::AudioRecord::IAudioRecordCallback { public: AudioStreamLegacy(); Loading @@ -82,7 +84,11 @@ public: protected: size_t onMoreData(const android::AudioTrack::Buffer& buffer) override; // TODO (b/216175830) this method is duplicated in order to ease refactoring which will // reconsolidate. size_t onMoreData(const android::AudioRecord::Buffer& buffer) override; void onNewIAudioTrack() override; void onNewIAudioRecord() override { onNewIAudioTrack(); } aaudio_result_t getBestTimestamp(clockid_t clockId, int64_t *framePosition, int64_t *timeNanoseconds, Loading media/libaaudio/src/legacy/AudioStreamRecord.cpp +2 −27 Original line number Diff line number Diff line Loading @@ -37,10 +37,6 @@ using android::content::AttributionSourceState; using namespace android; using namespace aaudio; static void sCallbackWrapper(int event, void* userData, void* info) { static_cast<AudioStreamRecord*>(userData)->processCallback(event, info); } AudioStreamRecord::AudioStreamRecord() : AudioStreamLegacy() , mFixedBlockWriter(*this) Loading Loading @@ -128,13 +124,11 @@ aaudio_result_t AudioStreamRecord::open(const AudioStreamBuilder& builder) uint32_t notificationFrames = 0; // Setup the callback if there is one. AudioRecord::legacy_callback_t callback = nullptr; void *callbackData = nullptr; sp<AudioRecord::IAudioRecordCallback> callback; AudioRecord::transfer_type streamTransferType = AudioRecord::transfer_type::TRANSFER_SYNC; if (builder.getDataCallbackProc() != nullptr) { streamTransferType = AudioRecord::transfer_type::TRANSFER_CALLBACK; callback = sCallbackWrapper; callbackData = this; callback = sp<AudioRecord::IAudioRecordCallback>::fromExisting(this); } mCallbackBufferSize = builder.getFramesPerDataCallback(); Loading Loading @@ -181,7 +175,6 @@ aaudio_result_t AudioStreamRecord::open(const AudioStreamBuilder& builder) channelMask, frameCount, callback, callbackData, notificationFrames, false /*threadCanCallJava*/, sessionId, Loading Loading @@ -354,24 +347,6 @@ const void * AudioStreamRecord::maybeConvertDeviceData(const void *audioData, in } } void AudioStreamRecord::processCallback(int event, void *info) { switch (event) { case AudioRecord::EVENT_MORE_DATA: { AudioTrack::Buffer *audioBuffer = static_cast<AudioTrack::Buffer *>(info); audioBuffer->size = onMoreData(*audioBuffer); break; } // Stream got rerouted so we disconnect. case AudioRecord::EVENT_NEW_IAUDIORECORD: onNewIAudioTrack(); break; default: break; } return; } aaudio_result_t AudioStreamRecord::requestStart_l() { if (mAudioRecord.get() == nullptr) { Loading media/libaudioclient/AudioRecord.cpp +8 −8 Original line number Diff line number Diff line Loading @@ -267,7 +267,7 @@ class LegacyCallbackWrapper : public AudioRecord::IAudioRecordCallback { size_t onMoreData(const AudioRecord::Buffer& buffer) override { AudioRecord::Buffer copy = buffer; mCallback(AudioRecord::EVENT_MORE_DATA, mData, ©); return copy.size; return copy.size(); } void onOverrun() override { mCallback(AudioRecord::EVENT_OVERRUN, mData, nullptr); } Loading Loading @@ -1142,7 +1142,7 @@ status_t AudioRecord::obtainBuffer(Buffer* audioBuffer, int32_t waitCount, size_ } if (mTransfer != TRANSFER_OBTAIN) { audioBuffer->frameCount = 0; audioBuffer->size = 0; audioBuffer->mSize = 0; audioBuffer->raw = NULL; if (nonContig != NULL) { *nonContig = 0; Loading Loading @@ -1231,7 +1231,7 @@ status_t AudioRecord::obtainBuffer(Buffer* audioBuffer, const struct timespec *r } while ((status == DEAD_OBJECT) && (tryCounter-- > 0)); audioBuffer->frameCount = buffer.mFrameCount; audioBuffer->size = buffer.mFrameCount * mServerFrameSize; audioBuffer->mSize = buffer.mFrameCount * mServerFrameSize; audioBuffer->raw = buffer.mRaw; audioBuffer->sequence = oldSequence; if (nonContig != NULL) { Loading Loading @@ -1308,7 +1308,7 @@ ssize_t AudioRecord::read(void* buffer, size_t userSize, bool blocking) size_t bytesRead = audioBuffer.frameCount * mFrameSize; memcpy_by_audio_format(buffer, mFormat, audioBuffer.raw, mServerConfig.format, audioBuffer.size / mServerSampleSize); audioBuffer.mSize / mServerSampleSize); buffer = ((char *) buffer) + bytesRead; userSize -= bytesRead; read += bytesRead; Loading Loading @@ -1514,15 +1514,15 @@ nsecs_t AudioRecord::processAudioBuffer() if (mServerConfig.format != mFormat) { buffer = &mFormatConversionBuffer; buffer->frameCount = audioBuffer.frameCount; buffer->size = buffer->frameCount * mFrameSize; buffer->mSize = buffer->frameCount * mFrameSize; buffer->sequence = audioBuffer.sequence; memcpy_by_audio_format(buffer->raw, mFormat, audioBuffer.raw, mServerConfig.format, audioBuffer.size / mServerSampleSize); mServerConfig.format, audioBuffer.size() / mServerSampleSize); } const size_t reqSize = buffer->size; const size_t reqSize = buffer->size(); const size_t readSize = callback->onMoreData(*buffer); buffer->size = readSize; buffer->mSize = readSize; // Validate on returned size if (ssize_t(readSize) < 0 || readSize > reqSize) { Loading Loading
cmds/stagefright/AudioPlayer.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -453,7 +453,7 @@ size_t AudioPlayer::AudioSinkCallback( } size_t AudioPlayer::onMoreData(const AudioTrack::Buffer& buffer) { return fillBuffer(buffer.raw, buffer.size); return fillBuffer(buffer.data(), buffer.size()); } void AudioPlayer::onStreamEnd() { Loading
media/libaaudio/src/legacy/AudioStreamLegacy.cpp +72 −7 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ size_t AudioStreamLegacy::onMoreData(const android::AudioTrack::Buffer& buffer) // This takes advantage of them killing the stream when they see a size out of range. // That is an undocumented behavior. // TODO add to API in AudioRecord and AudioTrack // TODO(b/216175830) cleanup size re-computation const size_t SIZE_STOP_CALLBACKS = SIZE_MAX; aaudio_data_callback_result_t callbackResult; (void) checkForDisconnectRequest(true); Loading @@ -83,7 +84,7 @@ size_t AudioStreamLegacy::onMoreData(const android::AudioTrack::Buffer& buffer) // Note that this code assumes an AudioTrack::Buffer is the same as // AudioRecord::Buffer // TODO define our own AudioBuffer and pass it from the subclasses. size_t written = buffer.size; size_t written = buffer.size(); if (getState() == AAUDIO_STREAM_STATE_DISCONNECTED) { ALOGW("%s() data, stream disconnected", __func__); // This will kill the stream and prevent it from being restarted. Loading @@ -96,23 +97,23 @@ size_t AudioStreamLegacy::onMoreData(const android::AudioTrack::Buffer& buffer) // caused by Legacy callbacks running after the track is "stopped". written = 0; } else { if (buffer.frameCount == 0) { if (buffer.getFrameCount() == 0) { ALOGW("%s() data, frameCount is zero", __func__); return written; } // If the caller specified an exact size then use a block size adapter. if (mBlockAdapter != nullptr) { int32_t byteCount = buffer.frameCount * getBytesPerDeviceFrame(); int32_t byteCount = buffer.getFrameCount() * getBytesPerDeviceFrame(); callbackResult = mBlockAdapter->processVariableBlock( static_cast<uint8_t*>(buffer.raw), byteCount); buffer.data(), byteCount); } else { // Call using the AAudio callback interface. callbackResult = callDataCallbackFrames(static_cast<uint8_t *>(buffer.raw), buffer.frameCount); callbackResult = callDataCallbackFrames(buffer.data(), buffer.getFrameCount()); } if (callbackResult == AAUDIO_CALLBACK_RESULT_CONTINUE) { written = buffer.frameCount * getBytesPerDeviceFrame(); written = buffer.getFrameCount() * getBytesPerDeviceFrame(); } else { if (callbackResult == AAUDIO_CALLBACK_RESULT_STOP) { ALOGD("%s() callback returned AAUDIO_CALLBACK_RESULT_STOP", __func__); Loading @@ -134,6 +135,70 @@ size_t AudioStreamLegacy::onMoreData(const android::AudioTrack::Buffer& buffer) return written; } // TODO (b/216175830) this method is duplicated in order to ease refactoring which will // reconsolidate. size_t AudioStreamLegacy::onMoreData(const android::AudioRecord::Buffer& buffer) { // This illegal size can be used to tell AudioRecord or AudioTrack to stop calling us. // This takes advantage of them killing the stream when they see a size out of range. // That is an undocumented behavior. // TODO add to API in AudioRecord and AudioTrack const size_t SIZE_STOP_CALLBACKS = SIZE_MAX; aaudio_data_callback_result_t callbackResult; (void) checkForDisconnectRequest(true); // Note that this code assumes an AudioTrack::Buffer is the same as // AudioRecord::Buffer // TODO define our own AudioBuffer and pass it from the subclasses. size_t written = buffer.size(); if (getState() == AAUDIO_STREAM_STATE_DISCONNECTED) { ALOGW("%s() data, stream disconnected", __func__); // This will kill the stream and prevent it from being restarted. // That is OK because the stream is disconnected. written = SIZE_STOP_CALLBACKS; } else if (!mCallbackEnabled.load()) { ALOGW("%s() no data because callback disabled, set size=0", __func__); // Do NOT use SIZE_STOP_CALLBACKS here because that will kill the stream and // prevent it from being restarted. This can occur because of a race condition // caused by Legacy callbacks running after the track is "stopped". written = 0; } else { if (buffer.getFrameCount() == 0) { ALOGW("%s() data, frameCount is zero", __func__); return written; } // If the caller specified an exact size then use a block size adapter. if (mBlockAdapter != nullptr) { int32_t byteCount = buffer.getFrameCount() * getBytesPerDeviceFrame(); callbackResult = mBlockAdapter->processVariableBlock( buffer.data(), byteCount); } else { // Call using the AAudio callback interface. callbackResult = callDataCallbackFrames(buffer.data(), buffer.getFrameCount()); } if (callbackResult == AAUDIO_CALLBACK_RESULT_CONTINUE) { written = buffer.getFrameCount() * getBytesPerDeviceFrame(); } else { if (callbackResult == AAUDIO_CALLBACK_RESULT_STOP) { ALOGD("%s() callback returned AAUDIO_CALLBACK_RESULT_STOP", __func__); } else { ALOGW("%s() callback returned invalid result = %d", __func__, callbackResult); } written = 0; systemStopInternal(); // Disable the callback just in case the system keeps trying to call us. mCallbackEnabled.store(false); } if (updateStateMachine() != AAUDIO_OK) { forceDisconnect(); mCallbackEnabled.store(false); } } return written; } aaudio_result_t AudioStreamLegacy::checkForDisconnectRequest(bool errorCallbackEnabled) { if (mRequestDisconnect.isRequested()) { Loading
media/libaaudio/src/legacy/AudioStreamLegacy.h +8 −2 Original line number Diff line number Diff line Loading @@ -17,9 +17,10 @@ #ifndef LEGACY_AUDIO_STREAM_LEGACY_H #define LEGACY_AUDIO_STREAM_LEGACY_H #include <media/AudioRecord.h> #include <media/AudioSystem.h> #include <media/AudioTimestamp.h> #include <media/AudioTrack.h> #include <media/AudioSystem.h> #include <aaudio/AAudio.h> Loading Loading @@ -57,7 +58,8 @@ typedef int32_t aaudio_callback_operation_t; class AudioStreamLegacy : public AudioStream, public FixedBlockProcessor, protected android::AudioTrack::IAudioTrackCallback { protected android::AudioTrack::IAudioTrackCallback, protected android::AudioRecord::IAudioRecordCallback { public: AudioStreamLegacy(); Loading @@ -82,7 +84,11 @@ public: protected: size_t onMoreData(const android::AudioTrack::Buffer& buffer) override; // TODO (b/216175830) this method is duplicated in order to ease refactoring which will // reconsolidate. size_t onMoreData(const android::AudioRecord::Buffer& buffer) override; void onNewIAudioTrack() override; void onNewIAudioRecord() override { onNewIAudioTrack(); } aaudio_result_t getBestTimestamp(clockid_t clockId, int64_t *framePosition, int64_t *timeNanoseconds, Loading
media/libaaudio/src/legacy/AudioStreamRecord.cpp +2 −27 Original line number Diff line number Diff line Loading @@ -37,10 +37,6 @@ using android::content::AttributionSourceState; using namespace android; using namespace aaudio; static void sCallbackWrapper(int event, void* userData, void* info) { static_cast<AudioStreamRecord*>(userData)->processCallback(event, info); } AudioStreamRecord::AudioStreamRecord() : AudioStreamLegacy() , mFixedBlockWriter(*this) Loading Loading @@ -128,13 +124,11 @@ aaudio_result_t AudioStreamRecord::open(const AudioStreamBuilder& builder) uint32_t notificationFrames = 0; // Setup the callback if there is one. AudioRecord::legacy_callback_t callback = nullptr; void *callbackData = nullptr; sp<AudioRecord::IAudioRecordCallback> callback; AudioRecord::transfer_type streamTransferType = AudioRecord::transfer_type::TRANSFER_SYNC; if (builder.getDataCallbackProc() != nullptr) { streamTransferType = AudioRecord::transfer_type::TRANSFER_CALLBACK; callback = sCallbackWrapper; callbackData = this; callback = sp<AudioRecord::IAudioRecordCallback>::fromExisting(this); } mCallbackBufferSize = builder.getFramesPerDataCallback(); Loading Loading @@ -181,7 +175,6 @@ aaudio_result_t AudioStreamRecord::open(const AudioStreamBuilder& builder) channelMask, frameCount, callback, callbackData, notificationFrames, false /*threadCanCallJava*/, sessionId, Loading Loading @@ -354,24 +347,6 @@ const void * AudioStreamRecord::maybeConvertDeviceData(const void *audioData, in } } void AudioStreamRecord::processCallback(int event, void *info) { switch (event) { case AudioRecord::EVENT_MORE_DATA: { AudioTrack::Buffer *audioBuffer = static_cast<AudioTrack::Buffer *>(info); audioBuffer->size = onMoreData(*audioBuffer); break; } // Stream got rerouted so we disconnect. case AudioRecord::EVENT_NEW_IAUDIORECORD: onNewIAudioTrack(); break; default: break; } return; } aaudio_result_t AudioStreamRecord::requestStart_l() { if (mAudioRecord.get() == nullptr) { Loading
media/libaudioclient/AudioRecord.cpp +8 −8 Original line number Diff line number Diff line Loading @@ -267,7 +267,7 @@ class LegacyCallbackWrapper : public AudioRecord::IAudioRecordCallback { size_t onMoreData(const AudioRecord::Buffer& buffer) override { AudioRecord::Buffer copy = buffer; mCallback(AudioRecord::EVENT_MORE_DATA, mData, ©); return copy.size; return copy.size(); } void onOverrun() override { mCallback(AudioRecord::EVENT_OVERRUN, mData, nullptr); } Loading Loading @@ -1142,7 +1142,7 @@ status_t AudioRecord::obtainBuffer(Buffer* audioBuffer, int32_t waitCount, size_ } if (mTransfer != TRANSFER_OBTAIN) { audioBuffer->frameCount = 0; audioBuffer->size = 0; audioBuffer->mSize = 0; audioBuffer->raw = NULL; if (nonContig != NULL) { *nonContig = 0; Loading Loading @@ -1231,7 +1231,7 @@ status_t AudioRecord::obtainBuffer(Buffer* audioBuffer, const struct timespec *r } while ((status == DEAD_OBJECT) && (tryCounter-- > 0)); audioBuffer->frameCount = buffer.mFrameCount; audioBuffer->size = buffer.mFrameCount * mServerFrameSize; audioBuffer->mSize = buffer.mFrameCount * mServerFrameSize; audioBuffer->raw = buffer.mRaw; audioBuffer->sequence = oldSequence; if (nonContig != NULL) { Loading Loading @@ -1308,7 +1308,7 @@ ssize_t AudioRecord::read(void* buffer, size_t userSize, bool blocking) size_t bytesRead = audioBuffer.frameCount * mFrameSize; memcpy_by_audio_format(buffer, mFormat, audioBuffer.raw, mServerConfig.format, audioBuffer.size / mServerSampleSize); audioBuffer.mSize / mServerSampleSize); buffer = ((char *) buffer) + bytesRead; userSize -= bytesRead; read += bytesRead; Loading Loading @@ -1514,15 +1514,15 @@ nsecs_t AudioRecord::processAudioBuffer() if (mServerConfig.format != mFormat) { buffer = &mFormatConversionBuffer; buffer->frameCount = audioBuffer.frameCount; buffer->size = buffer->frameCount * mFrameSize; buffer->mSize = buffer->frameCount * mFrameSize; buffer->sequence = audioBuffer.sequence; memcpy_by_audio_format(buffer->raw, mFormat, audioBuffer.raw, mServerConfig.format, audioBuffer.size / mServerSampleSize); mServerConfig.format, audioBuffer.size() / mServerSampleSize); } const size_t reqSize = buffer->size; const size_t reqSize = buffer->size(); const size_t readSize = callback->onMoreData(*buffer); buffer->size = readSize; buffer->mSize = readSize; // Validate on returned size if (ssize_t(readSize) < 0 || readSize > reqSize) { Loading