Merge "audio: Introduce read PCM from FMQ session functionality" am: 1ab703d2da
Original change: https://android-review.googlesource.com/c/platform/hardware/interfaces/+/1589975 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: I62ea81530ed5822266493bdc02bb0c23493fdfae
This commit is contained in:
commit
0319a9bb17
3 changed files with 49 additions and 0 deletions
|
@ -43,7 +43,10 @@ AudioConfiguration BluetoothAudioSession::invalidSoftwareAudioConfiguration =
|
|||
AudioConfiguration BluetoothAudioSession::invalidOffloadAudioConfiguration = {};
|
||||
|
||||
static constexpr int kFmqSendTimeoutMs = 1000; // 1000 ms timeout for sending
|
||||
static constexpr int kFmqReceiveTimeoutMs =
|
||||
1000; // 1000 ms timeout for receiving
|
||||
static constexpr int kWritePollMs = 1; // polled non-blocking interval
|
||||
static constexpr int kReadPollMs = 1; // polled non-blocking interval
|
||||
|
||||
static inline timespec timespec_convert_from_hal(const TimeSpec& TS) {
|
||||
return {.tv_sec = static_cast<long>(TS.tvSec),
|
||||
|
@ -402,6 +405,39 @@ size_t BluetoothAudioSession::OutWritePcmData(const void* buffer,
|
|||
return totalWritten;
|
||||
}
|
||||
|
||||
// The control function reads stream from FMQ
|
||||
size_t BluetoothAudioSession::InReadPcmData(void* buffer, size_t bytes) {
|
||||
if (buffer == nullptr || !bytes) return 0;
|
||||
size_t totalRead = 0;
|
||||
int ms_timeout = kFmqReceiveTimeoutMs;
|
||||
do {
|
||||
std::unique_lock<std::recursive_mutex> lock(mutex_);
|
||||
if (!IsSessionReady()) break;
|
||||
size_t availableToRead = mDataMQ->availableToRead();
|
||||
if (availableToRead) {
|
||||
if (availableToRead > (bytes - totalRead)) {
|
||||
availableToRead = bytes - totalRead;
|
||||
}
|
||||
if (!mDataMQ->read(static_cast<uint8_t*>(buffer) + totalRead,
|
||||
availableToRead)) {
|
||||
ALOGE("FMQ datapath reading %zu/%zu failed", totalRead, bytes);
|
||||
return totalRead;
|
||||
}
|
||||
totalRead += availableToRead;
|
||||
} else if (ms_timeout >= kReadPollMs) {
|
||||
lock.unlock();
|
||||
usleep(kReadPollMs * 1000);
|
||||
ms_timeout -= kReadPollMs;
|
||||
continue;
|
||||
} else {
|
||||
ALOGD("in data %zu/%zu overflow %d ms", totalRead, bytes,
|
||||
(kFmqReceiveTimeoutMs - ms_timeout));
|
||||
return totalRead;
|
||||
}
|
||||
} while (totalRead < bytes);
|
||||
return totalRead;
|
||||
}
|
||||
|
||||
std::unique_ptr<BluetoothAudioSessionInstance>
|
||||
BluetoothAudioSessionInstance::instance_ptr =
|
||||
std::unique_ptr<BluetoothAudioSessionInstance>(
|
||||
|
|
|
@ -153,6 +153,8 @@ class BluetoothAudioSession {
|
|||
|
||||
// The control function writes stream to FMQ
|
||||
size_t OutWritePcmData(const void* buffer, size_t bytes);
|
||||
// The control function read stream from FMQ
|
||||
size_t InReadPcmData(void* buffer, size_t bytes);
|
||||
|
||||
static constexpr PcmParameters kInvalidPcmParameters = {
|
||||
.sampleRate = SampleRate::RATE_UNKNOWN,
|
||||
|
|
|
@ -141,6 +141,17 @@ class BluetoothAudioSessionControl_2_1 {
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// The control API reads stream from FMQ
|
||||
static size_t InReadPcmData(const SessionType_2_1& session_type, void* buffer,
|
||||
size_t bytes) {
|
||||
std::shared_ptr<BluetoothAudioSession_2_1> session_ptr =
|
||||
BluetoothAudioSessionInstance_2_1::GetSessionInstance(session_type);
|
||||
if (session_ptr != nullptr) {
|
||||
return session_ptr->GetAudioSession()->InReadPcmData(buffer, bytes);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace audio
|
||||
|
|
Loading…
Reference in a new issue