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/Android.bp b/services/audioflinger/datapath/Android.bp
index 58f0422..ee98aef 100644
--- a/services/audioflinger/datapath/Android.bp
+++ b/services/audioflinger/datapath/Android.bp
@@ -55,10 +55,18 @@
shared_libs: [
"audioclient-types-aidl-cpp",
"av-types-aidl-cpp",
+ "libaudioflinger_utils", // NBAIO_Tee
+ "libaudioprocessing",
"libaudiospdif",
"libaudioutils",
"libbase",
+ "libcutils",
"liblog",
+ "libnbaio",
"libutils", // refbase
],
+
+ include_dirs: [
+ "frameworks/av/services/audioflinger", // for configuration
+ ],
}
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)
diff --git a/services/audioflinger/datapath/SpdifStreamOut.h b/services/audioflinger/datapath/SpdifStreamOut.h
index c8dc89f..1640575 100644
--- a/services/audioflinger/datapath/SpdifStreamOut.h
+++ b/services/audioflinger/datapath/SpdifStreamOut.h
@@ -25,6 +25,7 @@
#include "AudioStreamOut.h"
+#include <afutils/NBAIO_Tee.h>
#include <audio_utils/spdif/SPDIFEncoder.h>
namespace android {
@@ -116,6 +117,10 @@
ssize_t writeDataBurst(const void* data, size_t bytes);
ssize_t writeInternal(const void* buffer, size_t bytes);
+#ifdef TEE_SINK
+ NBAIO_Tee mTee;
+#endif
+
};
} // namespace android