Consolidate libaudioclient buffers p1
Prepare for libaudioclient buffer refactor by updating
clients of libaudioclient to use new buffer interface.
libaudioclient
- Wrap existing buffers with new interface
- Modify internal calls to be compatible with wrap
AAudio
- Update to use new buffer interface
- Update record to use callback
TrackPlayerBase
- Used for SLES (in different repo). Update to use sp<>
ToneGenerator/MediaPlayerService/AudioPlayer
- Update to use new buffer interface
StageFright
- Update to new callback interface
- Update to use new buffer interface
Bug: 216175830 - shared buffer
Bug: 199156212 - callback interface
Test: atest AudioTrackTest AudioRecordTest
atest AudioTrackOffloadTest
OboeTester non-exclusive, non-MMAP, power-saving for both
AAudio and SLES, input and output
No-Typo-Check: Existing class members
Change-Id: Ib1241f2e530bc509b2d4dde956ec5188f2287994
diff --git a/media/libaudioclient/AudioRecord.cpp b/media/libaudioclient/AudioRecord.cpp
index ebd488a..0c37fb5 100644
--- a/media/libaudioclient/AudioRecord.cpp
+++ b/media/libaudioclient/AudioRecord.cpp
@@ -266,7 +266,7 @@
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); }
@@ -1131,7 +1131,7 @@
}
if (mTransfer != TRANSFER_OBTAIN) {
audioBuffer->frameCount = 0;
- audioBuffer->size = 0;
+ audioBuffer->mSize = 0;
audioBuffer->raw = NULL;
if (nonContig != NULL) {
*nonContig = 0;
@@ -1214,7 +1214,7 @@
} 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) {
@@ -1291,7 +1291,7 @@
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;
@@ -1497,15 +1497,15 @@
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) {
diff --git a/media/libaudioclient/AudioTrack.cpp b/media/libaudioclient/AudioTrack.cpp
index bdf3147..919d6d2 100644
--- a/media/libaudioclient/AudioTrack.cpp
+++ b/media/libaudioclient/AudioTrack.cpp
@@ -293,7 +293,7 @@
size_t onMoreData(const AudioTrack::Buffer & buffer) override {
AudioTrack::Buffer copy = buffer;
mCallback(AudioTrack::EVENT_MORE_DATA, mData, static_cast<void*>(©));
- return copy.size;
+ return copy.size();
}
void onUnderrun() override {
mCallback(AudioTrack::EVENT_UNDERRUN, mData, nullptr);
@@ -319,7 +319,7 @@
size_t onCanWriteMoreData(const AudioTrack::Buffer & buffer) override {
AudioTrack::Buffer copy = buffer;
mCallback(AudioTrack::EVENT_CAN_WRITE_MORE_DATA, mData, static_cast<void*>(©));
- return copy.size;
+ return copy.size();
}
};
}
@@ -2194,7 +2194,7 @@
}
if (mTransfer != TRANSFER_OBTAIN) {
audioBuffer->frameCount = 0;
- audioBuffer->size = 0;
+ audioBuffer->mSize = 0;
audioBuffer->raw = NULL;
if (nonContig != NULL) {
*nonContig = 0;
@@ -2286,7 +2286,7 @@
} while (((status == DEAD_OBJECT) || (status == NOT_ENOUGH_DATA)) && (tryCounter-- > 0));
audioBuffer->frameCount = buffer.mFrameCount;
- audioBuffer->size = buffer.mFrameCount * mFrameSize;
+ audioBuffer->mSize = buffer.mFrameCount * mFrameSize;
audioBuffer->raw = buffer.mRaw;
audioBuffer->sequence = oldSequence;
if (nonContig != NULL) {
@@ -2302,7 +2302,7 @@
return;
}
- size_t stepCount = audioBuffer->size / mFrameSize;
+ size_t stepCount = audioBuffer->mSize / mFrameSize;
if (stepCount == 0) {
return;
}
@@ -2382,8 +2382,8 @@
return ssize_t(err);
}
- size_t toWrite = audioBuffer.size;
- memcpy(audioBuffer.i8, buffer, toWrite);
+ size_t toWrite = audioBuffer.size();
+ memcpy(audioBuffer.raw, buffer, toWrite);
buffer = ((const char *) buffer) + toWrite;
userSize -= toWrite;
written += toWrite;
@@ -2740,11 +2740,11 @@
}
}
- size_t reqSize = audioBuffer.size;
+ size_t reqSize = audioBuffer.size();
if (mTransfer == TRANSFER_SYNC_NOTIF_CALLBACK) {
// when notifying client it can write more data, pass the total size that can be
// written in the next write() call, since it's not passed through the callback
- audioBuffer.size += nonContig;
+ audioBuffer.mSize += nonContig;
}
const size_t writtenSize = (mTransfer == TRANSFER_CALLBACK)
? callback->onMoreData(audioBuffer)
@@ -2809,7 +2809,7 @@
}
// releaseBuffer reads from audioBuffer.size
- audioBuffer.size = writtenSize;
+ audioBuffer.mSize = writtenSize;
size_t releasedFrames = writtenSize / mFrameSize;
audioBuffer.frameCount = releasedFrames;
diff --git a/media/libaudioclient/ToneGenerator.cpp b/media/libaudioclient/ToneGenerator.cpp
index cd3eacb..9b43f3c 100644
--- a/media/libaudioclient/ToneGenerator.cpp
+++ b/media/libaudioclient/ToneGenerator.cpp
@@ -1329,7 +1329,7 @@
//
// Input:
// buffer An buffer object containing a pointer which we will fill with
-// buffer.size bytes.
+// buffer.size() bytes.
//
// Output:
// The number of bytes we successfully wrote.
@@ -1337,16 +1337,16 @@
////////////////////////////////////////////////////////////////////////////////
size_t ToneGenerator::onMoreData(const AudioTrack::Buffer& buffer) {
- int16_t *lpOut = buffer.i16;
- uint32_t lNumSmp = (buffer.size / sizeof(int16_t) < UINT32_MAX) ?
- buffer.size / sizeof(int16_t) : UINT32_MAX;
- if (buffer.size == 0) return 0;
+ int16_t *lpOut = reinterpret_cast<int16_t*>(buffer.data());
+ uint32_t lNumSmp = (buffer.size() / sizeof(int16_t) < UINT32_MAX) ?
+ buffer.size() / sizeof(int16_t) : UINT32_MAX;
+ if (buffer.size() == 0) return 0;
// We will write to the entire buffer unless we are stopped, then we return
// 0 at loop end
size_t bytesWritten = lNumSmp * sizeof(int16_t);
// Clear output buffer: WaveGenerator accumulates into lpOut buffer
- memset(lpOut, 0, buffer.size);
+ memset(lpOut, 0, buffer.size());
while (lNumSmp) {
unsigned int lReqSmp = lNumSmp < mProcessSize*2 ? lNumSmp : mProcessSize;
diff --git a/media/libaudioclient/TrackPlayerBase.cpp b/media/libaudioclient/TrackPlayerBase.cpp
index 188f321..4fc1c44 100644
--- a/media/libaudioclient/TrackPlayerBase.cpp
+++ b/media/libaudioclient/TrackPlayerBase.cpp
@@ -33,11 +33,14 @@
doDestroy();
}
-void TrackPlayerBase::init(AudioTrack* pat, player_type_t playerType, audio_usage_t usage,
- audio_session_t sessionId) {
+void TrackPlayerBase::init(const sp<AudioTrack>& pat,
+ const sp<AudioTrack::IAudioTrackCallback>& callback,
+ player_type_t playerType, audio_usage_t usage,
+ audio_session_t sessionId) {
PlayerBase::init(playerType, usage, sessionId);
mAudioTrack = pat;
if (mAudioTrack != 0) {
+ mCallbackHandle = callback;
mSelfAudioDeviceCallback = new SelfAudioDeviceCallback(*this);
mAudioTrack->addAudioDeviceCallback(mSelfAudioDeviceCallback);
mAudioTrack->setPlayerIId(mPIId); // set in PlayerBase::init().
diff --git a/media/libaudioclient/fuzzer/audioflinger_fuzzer.cpp b/media/libaudioclient/fuzzer/audioflinger_fuzzer.cpp
index 4c89249..169a6a7 100644
--- a/media/libaudioclient/fuzzer/audioflinger_fuzzer.cpp
+++ b/media/libaudioclient/fuzzer/audioflinger_fuzzer.cpp
@@ -355,7 +355,7 @@
audioBuffer.frameCount = static_cast<size_t>(mFdp.ConsumeIntegral<uint32_t>());
record->obtainBuffer(&audioBuffer, waitCount, &nonContig);
bool blocking = false;
- record->read(audioBuffer.raw, audioBuffer.size, blocking);
+ record->read(audioBuffer.data(), audioBuffer.size(), blocking);
record->getInputFramesLost();
record->getFlags();
diff --git a/media/libaudioclient/include/media/AudioRecord.h b/media/libaudioclient/include/media/AudioRecord.h
index 3cfcbf3..faea716 100644
--- a/media/libaudioclient/include/media/AudioRecord.h
+++ b/media/libaudioclient/include/media/AudioRecord.h
@@ -40,7 +40,6 @@
struct audio_track_cblk_t;
class AudioRecordClientProxy;
-
// ----------------------------------------------------------------------------
class AudioRecord : public AudioSystem::AudioDeviceCallback
@@ -70,15 +69,21 @@
class Buffer
{
+ friend AudioRecord;
public:
- // FIXME use m prefix
+ size_t size() const { return mSize; }
+ size_t getFrameCount() const { return frameCount; }
+ uint8_t* data() const { return ui8; }
+ // Leaving public for now to assist refactoring. This class will
+ // be replaced.
size_t frameCount; // number of sample frames corresponding to size;
// on input to obtainBuffer() it is the number of frames desired
// on output from obtainBuffer() it is the number of available
// frames to be read
// on input to releaseBuffer() it is currently ignored
- size_t size; // input/output in bytes == frameCount * frameSize
+ private:
+ size_t mSize; // input/output in bytes == frameCount * frameSize
// on input to obtainBuffer() it is ignored
// on output from obtainBuffer() it is the number of available
// bytes to be read, which is frameCount * frameSize
@@ -90,7 +95,7 @@
union {
void* raw;
int16_t* i16; // signed 16-bit
- int8_t* i8; // unsigned 8-bit, offset by 0x80
+ uint8_t* ui8; // unsigned 8-bit, offset by 0x80
// input to obtainBuffer(): unused, output: pointer to buffer
};
diff --git a/media/libaudioclient/include/media/AudioTrack.h b/media/libaudioclient/include/media/AudioTrack.h
index 16e10b5..d777124 100644
--- a/media/libaudioclient/include/media/AudioTrack.h
+++ b/media/libaudioclient/include/media/AudioTrack.h
@@ -95,34 +95,36 @@
class Buffer
{
+ friend AudioTrack;
public:
- // FIXME use m prefix
+ size_t size() const { return mSize; }
+ size_t getFrameCount() const { return frameCount; }
+ uint8_t * data() const { return ui8; }
+ // Leaving public for now to ease refactoring. This class will be
+ // replaced
size_t frameCount; // number of sample frames corresponding to size;
// on input to obtainBuffer() it is the number of frames desired,
// on output from obtainBuffer() it is the number of available
// [empty slots for] frames to be filled
// on input to releaseBuffer() it is currently ignored
-
- size_t size; // input/output in bytes == frameCount * frameSize
+ private:
+ size_t mSize; // input/output in bytes == frameCount * frameSize
// on input to obtainBuffer() it is ignored
// on output from obtainBuffer() it is the number of available
// [empty slots for] bytes to be filled,
// which is frameCount * frameSize
// on input to releaseBuffer() it is the number of bytes to
// release
- // FIXME This is redundant with respect to frameCount. Consider
- // removing size and making frameCount the primary field.
union {
void* raw;
int16_t* i16; // signed 16-bit
- int8_t* i8; // unsigned 8-bit, offset by 0x80
+ uint8_t* ui8; // unsigned 8-bit, offset by 0x80
}; // input to obtainBuffer(): unused, output: pointer to buffer
uint32_t sequence; // IAudioTrack instance sequence number, as of obtainBuffer().
// It is set by obtainBuffer() and confirmed by releaseBuffer().
// Not "user-serviceable".
- // TODO Consider sp<IMemory> instead, or in addition to this.
};
/* As a convenience, if a callback is supplied, a handler thread
diff --git a/media/libaudioclient/include/media/TrackPlayerBase.h b/media/libaudioclient/include/media/TrackPlayerBase.h
index 80124b8..fe88116 100644
--- a/media/libaudioclient/include/media/TrackPlayerBase.h
+++ b/media/libaudioclient/include/media/TrackPlayerBase.h
@@ -28,8 +28,8 @@
explicit TrackPlayerBase();
virtual ~TrackPlayerBase();
- void init(AudioTrack* pat, player_type_t playerType, audio_usage_t usage,
- audio_session_t sessionId);
+ void init(const sp<AudioTrack>& pat, const sp<AudioTrack::IAudioTrackCallback>& callback,
+ player_type_t playerType, audio_usage_t usage, audio_session_t sessionId);
virtual void destroy();
//IPlayer implementation
@@ -66,8 +66,8 @@
// volume coming from the player volume API
float mPlayerVolumeL, mPlayerVolumeR;
-
- sp<SelfAudioDeviceCallback> mSelfAudioDeviceCallback;
+ sp<AudioTrack::IAudioTrackCallback> mCallbackHandle;
+ sp<SelfAudioDeviceCallback> mSelfAudioDeviceCallback;
};
} // namespace android