Add tee sink to SpdifStreamOut
Test: enable per https://source.android.com/docs/core/audio/debugging
play ac3 track via SpdifStreamOut using
AudioTrackSurroundTest#testPlayAC3Bytes
dumpsys media.audio_flinger and see .raw iec61937 wrapped
file in /data/misc/audioserver.
Change-Id: I65ccd9d8a5b92ef7ffc87e081095d8f7332d8acb
diff --git a/services/audioflinger/datapath/SpdifStreamOut.cpp b/services/audioflinger/datapath/SpdifStreamOut.cpp
index 43e9c0c..6bc1f2d 100644
--- a/services/audioflinger/datapath/SpdifStreamOut.cpp
+++ b/services/audioflinger/datapath/SpdifStreamOut.cpp
@@ -17,6 +17,7 @@
#define LOG_TAG "AudioFlinger"
//#define LOG_NDEBUG 0
+#include "Configuration.h"
#include <system/audio.h>
#include <utils/Log.h>
@@ -96,6 +97,16 @@
ALOGI("SpdifStreamOut::open() status = %d", status);
+#ifdef TEE_SINK
+ if (status == OK) {
+ // Don't use PCM 16-bit format to avoid WAV encoding IEC61937 data.
+ mTee.set(customConfig.sample_rate,
+ audio_channel_count_from_out_mask(customConfig.channel_mask),
+ AUDIO_FORMAT_IEC61937, NBAIO_Tee::TEE_FLAG_OUTPUT_THREAD);
+ mTee.setId(std::string("_") + std::to_string(handle) + "_D");
+ }
+#endif
+
return status;
}
@@ -113,7 +124,15 @@
ssize_t SpdifStreamOut::writeDataBurst(const void* buffer, size_t bytes)
{
- return AudioStreamOut::write(buffer, bytes);
+ const ssize_t written = AudioStreamOut::write(buffer, bytes);
+
+#ifdef TEE_SINK
+ if (written > 0) {
+ mTee.write(reinterpret_cast<const char *>(buffer),
+ written / AudioStreamOut::getFrameSize());
+ }
+#endif
+ return written;
}
ssize_t SpdifStreamOut::write(const void* buffer, size_t numBytes)