Merge "media: Add 8K UHD CamcorderProfile quality" into sc-dev
diff --git a/Android.bp b/Android.bp
index a7cf3e5..944cdc1 100644
--- a/Android.bp
+++ b/Android.bp
@@ -33,10 +33,10 @@
name: "av-headers",
export_include_dirs: ["include"],
static_libs: [
- "av-types-aidl-unstable-cpp",
+ "av-types-aidl-cpp",
],
export_static_lib_headers: [
- "av-types-aidl-unstable-cpp",
+ "av-types-aidl-cpp",
],
header_libs: [
"libaudioclient_aidl_conversion_util",
diff --git a/cmds/screenrecord/screenrecord.cpp b/cmds/screenrecord/screenrecord.cpp
index b31a58b..e6e3473 100644
--- a/cmds/screenrecord/screenrecord.cpp
+++ b/cmds/screenrecord/screenrecord.cpp
@@ -57,7 +57,7 @@
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/AMessage.h>
#include <mediadrm/ICrypto.h>
-#include <ui/DisplayConfig.h>
+#include <ui/DisplayMode.h>
#include <ui/DisplayState.h>
#include "screenrecord.h"
@@ -68,7 +68,7 @@
using android::ALooper;
using android::AMessage;
using android::AString;
-using android::DisplayConfig;
+using android::ui::DisplayMode;
using android::FrameOutput;
using android::IBinder;
using android::IGraphicBufferProducer;
@@ -689,8 +689,8 @@
return err;
}
- DisplayConfig displayConfig;
- err = SurfaceComposerClient::getActiveDisplayConfig(display, &displayConfig);
+ DisplayMode displayMode;
+ err = SurfaceComposerClient::getActiveDisplayMode(display, &displayMode);
if (err != NO_ERROR) {
fprintf(stderr, "ERROR: unable to get display config\n");
return err;
@@ -700,7 +700,7 @@
if (gVerbose) {
printf("Display is %dx%d @%.2ffps (orientation=%s), layerStack=%u\n",
layerStackSpaceRect.getWidth(), layerStackSpaceRect.getHeight(),
- displayConfig.refreshRate, toCString(displayState.orientation),
+ displayMode.refreshRate, toCString(displayState.orientation),
displayState.layerStack);
fflush(stdout);
}
@@ -718,7 +718,7 @@
sp<FrameOutput> frameOutput;
sp<IGraphicBufferProducer> encoderInputSurface;
if (gOutputFormat != FORMAT_FRAMES && gOutputFormat != FORMAT_RAW_FRAMES) {
- err = prepareEncoder(displayConfig.refreshRate, &encoder, &encoderInputSurface);
+ err = prepareEncoder(displayMode.refreshRate, &encoder, &encoderInputSurface);
if (err != NO_ERROR && !gSizeSpecified) {
// fallback is defined for landscape; swap if we're in portrait
@@ -731,7 +731,7 @@
gVideoWidth, gVideoHeight, newWidth, newHeight);
gVideoWidth = newWidth;
gVideoHeight = newHeight;
- err = prepareEncoder(displayConfig.refreshRate, &encoder, &encoderInputSurface);
+ err = prepareEncoder(displayMode.refreshRate, &encoder, &encoderInputSurface);
}
}
if (err != NO_ERROR) return err;
diff --git a/cmds/stagefright/codec.cpp b/cmds/stagefright/codec.cpp
index 33c4663..beeab54 100644
--- a/cmds/stagefright/codec.cpp
+++ b/cmds/stagefright/codec.cpp
@@ -39,7 +39,7 @@
#include <gui/ISurfaceComposer.h>
#include <gui/SurfaceComposerClient.h>
#include <gui/Surface.h>
-#include <ui/DisplayConfig.h>
+#include <ui/DisplayMode.h>
static void usage(const char *me) {
fprintf(stderr, "usage: %s [-a] use audio\n"
@@ -414,10 +414,10 @@
const sp<IBinder> display = SurfaceComposerClient::getInternalDisplayToken();
CHECK(display != nullptr);
- DisplayConfig config;
- CHECK_EQ(SurfaceComposerClient::getActiveDisplayConfig(display, &config), NO_ERROR);
+ ui::DisplayMode mode;
+ CHECK_EQ(SurfaceComposerClient::getActiveDisplayMode(display, &mode), NO_ERROR);
- const ui::Size& resolution = config.resolution;
+ const ui::Size& resolution = mode.resolution;
const ssize_t displayWidth = resolution.getWidth();
const ssize_t displayHeight = resolution.getHeight();
diff --git a/cmds/stagefright/mediafilter.cpp b/cmds/stagefright/mediafilter.cpp
index ca058ab..67c68e6 100644
--- a/cmds/stagefright/mediafilter.cpp
+++ b/cmds/stagefright/mediafilter.cpp
@@ -34,7 +34,7 @@
#include <media/stagefright/NuMediaExtractor.h>
#include <media/stagefright/RenderScriptWrapper.h>
#include <OMX_IVCommon.h>
-#include <ui/DisplayConfig.h>
+#include <ui/DisplayMode.h>
#include "RenderScript.h"
#include "ScriptC_argbtorgba.h"
@@ -752,10 +752,10 @@
const android::sp<IBinder> display = SurfaceComposerClient::getInternalDisplayToken();
CHECK(display != nullptr);
- DisplayConfig config;
- CHECK_EQ(SurfaceComposerClient::getActiveDisplayConfig(display, &config), NO_ERROR);
+ ui::DisplayMode mode;
+ CHECK_EQ(SurfaceComposerClient::getActiveDisplayMode(display, &mode), NO_ERROR);
- const ui::Size& resolution = config.resolution;
+ const ui::Size& resolution = mode.resolution;
const ssize_t displayWidth = resolution.getWidth();
const ssize_t displayHeight = resolution.getHeight();
diff --git a/cmds/stagefright/stream.cpp b/cmds/stagefright/stream.cpp
index 250d26b..40b2392 100644
--- a/cmds/stagefright/stream.cpp
+++ b/cmds/stagefright/stream.cpp
@@ -42,7 +42,7 @@
#include <gui/Surface.h>
#include <fcntl.h>
-#include <ui/DisplayConfig.h>
+#include <ui/DisplayMode.h>
using namespace android;
@@ -321,10 +321,10 @@
const sp<IBinder> display = SurfaceComposerClient::getInternalDisplayToken();
CHECK(display != nullptr);
- DisplayConfig config;
- CHECK_EQ(SurfaceComposerClient::getActiveDisplayConfig(display, &config), NO_ERROR);
+ ui::DisplayMode mode;
+ CHECK_EQ(SurfaceComposerClient::getActiveDisplayMode(display, &mode), NO_ERROR);
- const ui::Size& resolution = config.resolution;
+ const ui::Size& resolution = mode.resolution;
const ssize_t displayWidth = resolution.getWidth();
const ssize_t displayHeight = resolution.getHeight();
diff --git a/media/libaaudio/src/core/AudioStream.cpp b/media/libaaudio/src/core/AudioStream.cpp
index a4beaf4..5078d2c 100644
--- a/media/libaaudio/src/core/AudioStream.cpp
+++ b/media/libaaudio/src/core/AudioStream.cpp
@@ -591,7 +591,8 @@
std::lock_guard<std::mutex> lock(mParentLock);
mParent = parent;
if (!mRegistered) {
- init(android::PLAYER_TYPE_AAUDIO, AAudioConvert_usageToInternal(parent->getUsage()));
+ init(android::PLAYER_TYPE_AAUDIO, AAudioConvert_usageToInternal(parent->getUsage()),
+ (audio_session_t)parent->getSessionId());
mRegistered = true;
}
}
diff --git a/media/libaaudio/tests/Android.bp b/media/libaaudio/tests/Android.bp
index 95d6543..85376ad 100644
--- a/media/libaaudio/tests/Android.bp
+++ b/media/libaaudio/tests/Android.bp
@@ -16,7 +16,7 @@
"libbinder",
"libcutils",
"libutils",
- "shared-file-region-aidl-unstable-cpp",
+ "shared-file-region-aidl-cpp",
],
}
diff --git a/media/libaudioclient/Android.bp b/media/libaudioclient/Android.bp
index 004ae39..8a575d5 100644
--- a/media/libaudioclient/Android.bp
+++ b/media/libaudioclient/Android.bp
@@ -14,14 +14,14 @@
"libaudiofoundation_headers",
],
static_libs: [
- "audioflinger-aidl-unstable-cpp",
- "audiopolicy-aidl-unstable-cpp",
- "av-types-aidl-unstable-cpp",
+ "audioflinger-aidl-cpp",
+ "audiopolicy-aidl-cpp",
+ "av-types-aidl-cpp",
],
export_static_lib_headers: [
- "audioflinger-aidl-unstable-cpp",
- "audiopolicy-aidl-unstable-cpp",
- "av-types-aidl-unstable-cpp",
+ "audioflinger-aidl-cpp",
+ "audiopolicy-aidl-cpp",
+ "av-types-aidl-cpp",
],
target: {
darwin: {
@@ -40,11 +40,11 @@
"PolicyAidlConversion.cpp"
],
shared_libs: [
- "audioclient-types-aidl-unstable-cpp",
- "audioflinger-aidl-unstable-cpp",
- "audiopolicy-aidl-unstable-cpp",
- "audiopolicy-types-aidl-unstable-cpp",
- "capture_state_listener-aidl-unstable-cpp",
+ "audioclient-types-aidl-cpp",
+ "audioflinger-aidl-cpp",
+ "audiopolicy-aidl-cpp",
+ "audiopolicy-types-aidl-cpp",
+ "capture_state_listener-aidl-cpp",
"libaudiofoundation",
"libaudioclient_aidl_conversion",
"libaudioutils",
@@ -60,11 +60,11 @@
include_dirs: ["system/media/audio_utils/include"],
export_include_dirs: ["include"],
export_shared_lib_headers: [
- "audioclient-types-aidl-unstable-cpp",
- "audioflinger-aidl-unstable-cpp",
- "audiopolicy-aidl-unstable-cpp",
- "audiopolicy-types-aidl-unstable-cpp",
- "capture_state_listener-aidl-unstable-cpp",
+ "audioclient-types-aidl-cpp",
+ "audioflinger-aidl-cpp",
+ "audiopolicy-aidl-cpp",
+ "audiopolicy-types-aidl-cpp",
+ "capture_state_listener-aidl-cpp",
"libaudiofoundation",
"libaudioclient_aidl_conversion",
],
@@ -100,12 +100,12 @@
"TrackPlayerBase.cpp",
],
shared_libs: [
- "audioclient-types-aidl-unstable-cpp",
- "audioflinger-aidl-unstable-cpp",
- "audiopolicy-aidl-unstable-cpp",
- "audiopolicy-types-aidl-unstable-cpp",
- "av-types-aidl-unstable-cpp",
- "capture_state_listener-aidl-unstable-cpp",
+ "audioclient-types-aidl-cpp",
+ "audioflinger-aidl-cpp",
+ "audiopolicy-aidl-cpp",
+ "audiopolicy-types-aidl-cpp",
+ "av-types-aidl-cpp",
+ "capture_state_listener-aidl-cpp",
"libaudioclient_aidl_conversion",
"libaudiofoundation",
"libaudioutils",
@@ -125,8 +125,8 @@
"libvibrator",
],
export_shared_lib_headers: [
- "audioflinger-aidl-unstable-cpp",
- "audiopolicy-aidl-unstable-cpp",
+ "audioflinger-aidl-cpp",
+ "audiopolicy-aidl-cpp",
"libbinder",
],
@@ -144,15 +144,15 @@
],
export_header_lib_headers: ["libaudioclient_headers"],
export_static_lib_headers: [
- "effect-aidl-unstable-cpp",
- "shared-file-region-aidl-unstable-cpp",
+ "effect-aidl-cpp",
+ "shared-file-region-aidl-cpp",
],
static_libs: [
- "effect-aidl-unstable-cpp",
+ "effect-aidl-cpp",
// for memory heap analysis
"libc_malloc_debug_backtrace",
- "shared-file-region-aidl-unstable-cpp",
+ "shared-file-region-aidl-cpp",
],
cflags: [
"-Wall",
@@ -213,18 +213,18 @@
"libaudioclient_aidl_conversion_util",
],
shared_libs: [
- "audioclient-types-aidl-unstable-cpp",
+ "audioclient-types-aidl-cpp",
"libbase",
"libbinder",
"liblog",
"libshmemcompat",
"libutils",
- "shared-file-region-aidl-unstable-cpp",
+ "shared-file-region-aidl-cpp",
],
export_shared_lib_headers: [
- "audioclient-types-aidl-unstable-cpp",
+ "audioclient-types-aidl-cpp",
"libbase",
- "shared-file-region-aidl-unstable-cpp",
+ "shared-file-region-aidl-cpp",
],
cflags: [
"-Wall",
diff --git a/media/libaudioclient/PlayerBase.cpp b/media/libaudioclient/PlayerBase.cpp
index 8793735..446a58c 100644
--- a/media/libaudioclient/PlayerBase.cpp
+++ b/media/libaudioclient/PlayerBase.cpp
@@ -49,11 +49,12 @@
baseDestroy();
}
-void PlayerBase::init(player_type_t playerType, audio_usage_t usage) {
+void PlayerBase::init(player_type_t playerType, audio_usage_t usage, audio_session_t sessionId) {
if (mAudioManager == 0) {
ALOGE("AudioPlayer realize: no audio service, player will not be registered");
} else {
- mPIId = mAudioManager->trackPlayer(playerType, usage, AUDIO_CONTENT_TYPE_UNKNOWN, this);
+ mPIId = mAudioManager->trackPlayer(playerType, usage, AUDIO_CONTENT_TYPE_UNKNOWN, this,
+ sessionId);
}
}
diff --git a/media/libaudioclient/TrackPlayerBase.cpp b/media/libaudioclient/TrackPlayerBase.cpp
index 5c73756..536e9fb 100644
--- a/media/libaudioclient/TrackPlayerBase.cpp
+++ b/media/libaudioclient/TrackPlayerBase.cpp
@@ -33,8 +33,9 @@
doDestroy();
}
-void TrackPlayerBase::init(AudioTrack* pat, player_type_t playerType, audio_usage_t usage) {
- PlayerBase::init(playerType, usage);
+void TrackPlayerBase::init(AudioTrack* pat, player_type_t playerType, audio_usage_t usage,
+ audio_session_t sessionId) {
+ PlayerBase::init(playerType, usage, sessionId);
mAudioTrack = pat;
if (mAudioTrack != 0) {
mSelfAudioDeviceCallback = new SelfAudioDeviceCallback(*this);
diff --git a/media/libaudioclient/include/media/AudioTrack.h b/media/libaudioclient/include/media/AudioTrack.h
index d2696c7..e60ed55 100644
--- a/media/libaudioclient/include/media/AudioTrack.h
+++ b/media/libaudioclient/include/media/AudioTrack.h
@@ -662,9 +662,7 @@
* handle on audio hardware output, or AUDIO_IO_HANDLE_NONE if the
* track needed to be re-created but that failed
*/
-private:
audio_io_handle_t getOutput() const;
-public:
/* Selects the audio device to use for output of this AudioTrack. A value of
* AUDIO_PORT_HANDLE_NONE indicates default (AudioPolicyManager) routing.
diff --git a/media/libaudioclient/include/media/PlayerBase.h b/media/libaudioclient/include/media/PlayerBase.h
index 1a42b88..62cc21d 100644
--- a/media/libaudioclient/include/media/PlayerBase.h
+++ b/media/libaudioclient/include/media/PlayerBase.h
@@ -55,7 +55,7 @@
protected:
- void init(player_type_t playerType, audio_usage_t usage);
+ void init(player_type_t playerType, audio_usage_t usage, audio_session_t sessionId);
void baseDestroy();
//IPlayer methods handlers for derived classes
diff --git a/media/libaudioclient/include/media/TrackPlayerBase.h b/media/libaudioclient/include/media/TrackPlayerBase.h
index b40d1eb..80124b8 100644
--- a/media/libaudioclient/include/media/TrackPlayerBase.h
+++ b/media/libaudioclient/include/media/TrackPlayerBase.h
@@ -28,7 +28,8 @@
explicit TrackPlayerBase();
virtual ~TrackPlayerBase();
- void init(AudioTrack* pat, player_type_t playerType, audio_usage_t usage);
+ void init(AudioTrack* pat, player_type_t playerType, audio_usage_t usage,
+ audio_session_t sessionId);
virtual void destroy();
//IPlayer implementation
diff --git a/media/libaudiofoundation/Android.bp b/media/libaudiofoundation/Android.bp
index 9296d0e..a89d086 100644
--- a/media/libaudiofoundation/Android.bp
+++ b/media/libaudiofoundation/Android.bp
@@ -15,10 +15,10 @@
"libmedia_helper_headers",
],
static_libs: [
- "audioclient-types-aidl-unstable-cpp",
+ "audioclient-types-aidl-cpp",
],
export_static_lib_headers: [
- "audioclient-types-aidl-unstable-cpp",
+ "audioclient-types-aidl-cpp",
],
host_supported: true,
target: {
@@ -43,7 +43,7 @@
],
shared_libs: [
- "audioclient-types-aidl-unstable-cpp",
+ "audioclient-types-aidl-cpp",
"libaudioclient_aidl_conversion",
"libaudioutils",
"libbase",
@@ -54,7 +54,7 @@
],
export_shared_lib_headers: [
- "audioclient-types-aidl-unstable-cpp",
+ "audioclient-types-aidl-cpp",
"libaudioclient_aidl_conversion",
],
diff --git a/media/libaudiohal/impl/Android.bp b/media/libaudiohal/impl/Android.bp
index 3727404..8975cc3 100644
--- a/media/libaudiohal/impl/Android.bp
+++ b/media/libaudiohal/impl/Android.bp
@@ -26,7 +26,7 @@
"android.hardware.audio.common-util",
"android.hidl.allocator@1.0",
"android.hidl.memory@1.0",
- "av-types-aidl-unstable-cpp",
+ "av-types-aidl-cpp",
"libaudiofoundation",
"libaudiohal_deathhandler",
"libaudioutils",
diff --git a/media/libmedia/Android.bp b/media/libmedia/Android.bp
index f68f65d..79d6c0b 100644
--- a/media/libmedia/Android.bp
+++ b/media/libmedia/Android.bp
@@ -324,8 +324,8 @@
shared_libs: [
"android.hidl.token@1.0-utils",
- "audioclient-types-aidl-unstable-cpp",
- "av-types-aidl-unstable-cpp",
+ "audioclient-types-aidl-cpp",
+ "av-types-aidl-cpp",
"liblog",
"libcutils",
"libprocessgroup",
diff --git a/media/libmediaplayerservice/Android.bp b/media/libmediaplayerservice/Android.bp
index b62317a..ab6863f 100644
--- a/media/libmediaplayerservice/Android.bp
+++ b/media/libmediaplayerservice/Android.bp
@@ -15,7 +15,7 @@
shared_libs: [
"android.hardware.media.c2@1.0",
"android.hardware.media.omx@1.0",
- "av-types-aidl-unstable-cpp",
+ "av-types-aidl-cpp",
"libbase",
"libandroid_net",
"libaudioclient",
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index 4d90d98..1d5ccca 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -2246,6 +2246,12 @@
mRecycledTrack->frameCount(), t->frameCount());
reuse = false;
}
+ // If recycled and new tracks are not on the same output,
+ // don't reuse the recycled one.
+ if (mRecycledTrack->getOutput() != t->getOutput()) {
+ ALOGV("output has changed, don't reuse track");
+ reuse = false;
+ }
}
if (reuse) {
diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h
index b2f1b9b..aca4369 100644
--- a/media/libmediaplayerservice/MediaPlayerService.h
+++ b/media/libmediaplayerservice/MediaPlayerService.h
@@ -100,6 +100,7 @@
virtual audio_session_t getSessionId() const;
virtual uint32_t getSampleRate() const;
virtual int64_t getBufferDurationInUs() const;
+ virtual audio_output_flags_t getFlags() const { return mFlags; }
virtual status_t open(
uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask,
diff --git a/media/libmediaplayerservice/include/MediaPlayerInterface.h b/media/libmediaplayerservice/include/MediaPlayerInterface.h
index 8d94698..1cbd8a0 100644
--- a/media/libmediaplayerservice/include/MediaPlayerInterface.h
+++ b/media/libmediaplayerservice/include/MediaPlayerInterface.h
@@ -108,6 +108,7 @@
virtual audio_stream_type_t getAudioStreamType() const = 0;
virtual uint32_t getSampleRate() const = 0;
virtual int64_t getBufferDurationInUs() const = 0;
+ virtual audio_output_flags_t getFlags() const = 0;
// If no callback is specified, use the "write" API below to submit
// audio data.
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
index 47362ef..344ee0b 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
@@ -871,10 +871,12 @@
readFromAMessage(msg, &rate);
status_t err = OK;
if (mRenderer != NULL) {
- // AudioSink allows only 1.f and 0.f for offload mode.
- // For other speed, switch to non-offload mode.
- if (mOffloadAudio && ((rate.mSpeed != 0.f && rate.mSpeed != 1.f)
- || rate.mPitch != 1.f)) {
+ // AudioSink allows only 1.f and 0.f for offload and direct modes.
+ // For other speeds, restart audio to fallback to supported paths
+ bool audioDirectOutput = (mAudioSink->getFlags() & AUDIO_OUTPUT_FLAG_DIRECT) != 0;
+ if ((mOffloadAudio || audioDirectOutput) &&
+ ((rate.mSpeed != 0.f && rate.mSpeed != 1.f) || rate.mPitch != 1.f)) {
+
int64_t currentPositionUs;
if (getCurrentPosition(¤tPositionUs) != OK) {
currentPositionUs = mPreviousSeekTimeUs;
diff --git a/media/libmediatranscoding/Android.bp b/media/libmediatranscoding/Android.bp
index 23e83f9..e98b7ea 100644
--- a/media/libmediatranscoding/Android.bp
+++ b/media/libmediatranscoding/Android.bp
@@ -96,7 +96,7 @@
static_libs: [
"mediatranscoding_aidl_interface-ndk_platform",
- "resourceobserver_aidl_interface-ndk_platform",
+ "resourceobserver_aidl_interface-V1-ndk_platform",
],
cflags: [
diff --git a/media/libshmem/Android.bp b/media/libshmem/Android.bp
index 62784ed..c715918 100644
--- a/media/libshmem/Android.bp
+++ b/media/libshmem/Android.bp
@@ -21,12 +21,12 @@
"libbinder",
"libshmemutil",
"libutils",
- "shared-file-region-aidl-unstable-cpp",
+ "shared-file-region-aidl-cpp",
],
export_shared_lib_headers: [
"libbinder",
"libutils",
- "shared-file-region-aidl-unstable-cpp",
+ "shared-file-region-aidl-cpp",
],
target: {
darwin: {
@@ -43,10 +43,10 @@
vendor_available: true,
double_loadable: true,
shared_libs: [
- "shared-file-region-aidl-unstable-cpp",
+ "shared-file-region-aidl-cpp",
],
export_shared_lib_headers: [
- "shared-file-region-aidl-unstable-cpp",
+ "shared-file-region-aidl-cpp",
],
target: {
darwin: {
@@ -64,7 +64,7 @@
"libshmemcompat",
"libshmemutil",
"libutils",
- "shared-file-region-aidl-unstable-cpp",
+ "shared-file-region-aidl-cpp",
],
test_suites: ["device-tests"],
}
diff --git a/media/libstagefright/renderfright/Android.bp b/media/libstagefright/renderfright/Android.bp
index c17f84e..7a71f52 100644
--- a/media/libstagefright/renderfright/Android.bp
+++ b/media/libstagefright/renderfright/Android.bp
@@ -23,7 +23,6 @@
"libEGL",
"libGLESv1_CM",
"libGLESv2",
- "libgui",
"liblog",
"libnativewindow",
"libprocessgroup",
diff --git a/media/libstagefright/renderfright/RenderEngine.cpp b/media/libstagefright/renderfright/RenderEngine.cpp
index c3fbb60..e96ffdb 100644
--- a/media/libstagefright/renderfright/RenderEngine.cpp
+++ b/media/libstagefright/renderfright/RenderEngine.cpp
@@ -18,7 +18,6 @@
#include <cutils/properties.h>
#include <log/log.h>
-#include <private/gui/SyncFeatures.h>
#include "gl/GLESRenderEngine.h"
#include "threaded/RenderEngineThreaded.h"
@@ -52,6 +51,39 @@
RenderEngine::~RenderEngine() = default;
+// static
+SyncFeatures &SyncFeatures::GetInstance() {
+ static SyncFeatures syncFeatures;
+ return syncFeatures;
+}
+
+bool SyncFeatures::useNativeFenceSync() const { return mHasNativeFenceSync; }
+bool SyncFeatures::useFenceSync() const { return mHasFenceSync; }
+bool SyncFeatures::useWaitSync() const { return mHasWaitSync; }
+
+SyncFeatures::SyncFeatures()
+ : mHasNativeFenceSync(false),
+ mHasFenceSync(false),
+ mHasWaitSync(false) {
+ EGLDisplay dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+ // This can only be called after EGL has been initialized; otherwise the
+ // check below will abort.
+ const char* exts = eglQueryString(dpy, EGL_EXTENSIONS);
+ LOG_ALWAYS_FATAL_IF(exts == nullptr, "eglQueryString failed");
+ if (strstr(exts, "EGL_ANDROID_native_fence_sync")) {
+ // This makes GLConsumer use the EGL_ANDROID_native_fence_sync
+ // extension to create Android native fences to signal when all
+ // GLES reads for a given buffer have completed.
+ mHasNativeFenceSync = true;
+ }
+ if (strstr(exts, "EGL_KHR_fence_sync")) {
+ mHasFenceSync = true;
+ }
+ if (strstr(exts, "EGL_KHR_wait_sync")) {
+ mHasWaitSync = true;
+ }
+}
+
namespace impl {
RenderEngine::RenderEngine(const RenderEngineCreationArgs& args) : mArgs(args) {}
@@ -59,11 +91,11 @@
RenderEngine::~RenderEngine() = default;
bool RenderEngine::useNativeFenceSync() const {
- return SyncFeatures::getInstance().useNativeFenceSync();
+ return SyncFeatures::GetInstance().useNativeFenceSync();
}
bool RenderEngine::useWaitSync() const {
- return SyncFeatures::getInstance().useWaitSync();
+ return SyncFeatures::GetInstance().useWaitSync();
}
} // namespace impl
diff --git a/media/libstagefright/renderfright/gl/GLESRenderEngine.cpp b/media/libstagefright/renderfright/gl/GLESRenderEngine.cpp
index 824bdd9..b7f8cb4 100644
--- a/media/libstagefright/renderfright/gl/GLESRenderEngine.cpp
+++ b/media/libstagefright/renderfright/gl/GLESRenderEngine.cpp
@@ -30,7 +30,6 @@
#include <android-base/stringprintf.h>
#include <cutils/compiler.h>
#include <cutils/properties.h>
-#include <gui/DebugEGLImageTracker.h>
#include <renderengine/Mesh.h>
#include <renderengine/Texture.h>
#include <renderengine/private/Description.h>
@@ -436,7 +435,6 @@
EGLImageKHR expired = mFramebufferImageCache.front().second;
mFramebufferImageCache.pop_front();
eglDestroyImageKHR(mEGLDisplay, expired);
- DEBUG_EGL_IMAGE_TRACKER_DESTROY();
}
eglDestroyImageKHR(mEGLDisplay, mPlaceholderImage);
mImageCache.clear();
@@ -1012,15 +1010,11 @@
EGLImageKHR expired = mFramebufferImageCache.front().second;
mFramebufferImageCache.pop_front();
eglDestroyImageKHR(mEGLDisplay, expired);
- DEBUG_EGL_IMAGE_TRACKER_DESTROY();
}
mFramebufferImageCache.push_back({graphicBuffer->getId(), image});
}
}
- if (image != EGL_NO_IMAGE_KHR) {
- DEBUG_EGL_IMAGE_TRACKER_CREATE();
- }
return image;
}
diff --git a/media/libstagefright/renderfright/gl/GLFramebuffer.cpp b/media/libstagefright/renderfright/gl/GLFramebuffer.cpp
index 383486b..d6582b3 100644
--- a/media/libstagefright/renderfright/gl/GLFramebuffer.cpp
+++ b/media/libstagefright/renderfright/gl/GLFramebuffer.cpp
@@ -22,7 +22,6 @@
#include <GLES/glext.h>
#include <GLES2/gl2ext.h>
#include <GLES3/gl3.h>
-#include <gui/DebugEGLImageTracker.h>
#include <nativebase/nativebase.h>
#include <utils/Trace.h>
#include "GLESRenderEngine.h"
@@ -48,7 +47,6 @@
if (mEGLImage != EGL_NO_IMAGE_KHR) {
if (!usingFramebufferCache) {
eglDestroyImageKHR(mEGLDisplay, mEGLImage);
- DEBUG_EGL_IMAGE_TRACKER_DESTROY();
}
mEGLImage = EGL_NO_IMAGE_KHR;
mBufferWidth = 0;
diff --git a/media/libstagefright/renderfright/gl/GLImage.cpp b/media/libstagefright/renderfright/gl/GLImage.cpp
index 8497721..77e648e 100644
--- a/media/libstagefright/renderfright/gl/GLImage.cpp
+++ b/media/libstagefright/renderfright/gl/GLImage.cpp
@@ -20,7 +20,6 @@
#include <vector>
-#include <gui/DebugEGLImageTracker.h>
#include <log/log.h>
#include <utils/Trace.h>
#include "GLESRenderEngine.h"
@@ -59,7 +58,6 @@
if (!eglDestroyImageKHR(mEGLDisplay, mEGLImage)) {
ALOGE("failed to destroy image: %#x", eglGetError());
}
- DEBUG_EGL_IMAGE_TRACKER_DESTROY();
mEGLImage = EGL_NO_IMAGE_KHR;
}
@@ -71,7 +69,6 @@
ALOGE("failed to create EGLImage: %#x", eglGetError());
return false;
}
- DEBUG_EGL_IMAGE_TRACKER_CREATE();
mProtected = isProtected;
}
diff --git a/media/libstagefright/renderfright/include/renderengine/RenderEngine.h b/media/libstagefright/renderfright/include/renderengine/RenderEngine.h
index 40fdff4..af2870f 100644
--- a/media/libstagefright/renderfright/include/renderengine/RenderEngine.h
+++ b/media/libstagefright/renderfright/include/renderengine/RenderEngine.h
@@ -302,6 +302,20 @@
status_t mStatus;
};
+class SyncFeatures {
+public:
+ static SyncFeatures &GetInstance();
+ bool useNativeFenceSync() const;
+ bool useFenceSync() const;
+ bool useWaitSync() const;
+
+private:
+ SyncFeatures();
+ bool mHasNativeFenceSync;
+ bool mHasFenceSync;
+ bool mHasWaitSync;
+};
+
namespace impl {
// impl::RenderEngine contains common implementation that is graphics back-end agnostic.
diff --git a/media/libstagefright/renderfright/threaded/RenderEngineThreaded.cpp b/media/libstagefright/renderfright/threaded/RenderEngineThreaded.cpp
index d4184fd..222d3ee 100644
--- a/media/libstagefright/renderfright/threaded/RenderEngineThreaded.cpp
+++ b/media/libstagefright/renderfright/threaded/RenderEngineThreaded.cpp
@@ -23,7 +23,6 @@
#include <future>
#include <android-base/stringprintf.h>
-#include <private/gui/SyncFeatures.h>
#include <utils/Trace.h>
#include "gl/GLESRenderEngine.h"
@@ -123,7 +122,7 @@
std::lock_guard lock(mThreadMutex);
mFunctionCalls.push([&resultPromise](renderengine::RenderEngine& /*instance*/) {
ATRACE_NAME("REThreaded::useNativeFenceSync");
- bool returnValue = SyncFeatures::getInstance().useNativeFenceSync();
+ bool returnValue = SyncFeatures::GetInstance().useNativeFenceSync();
resultPromise.set_value(returnValue);
});
}
@@ -138,7 +137,7 @@
std::lock_guard lock(mThreadMutex);
mFunctionCalls.push([&resultPromise](renderengine::RenderEngine& /*instance*/) {
ATRACE_NAME("REThreaded::useWaitSync");
- bool returnValue = SyncFeatures::getInstance().useWaitSync();
+ bool returnValue = SyncFeatures::GetInstance().useWaitSync();
resultPromise.set_value(returnValue);
});
}
diff --git a/media/ndk/include/media/NdkMediaFormat.h b/media/ndk/include/media/NdkMediaFormat.h
index 941e3a1..4d0eba5 100644
--- a/media/ndk/include/media/NdkMediaFormat.h
+++ b/media/ndk/include/media/NdkMediaFormat.h
@@ -312,13 +312,11 @@
*/
extern const char* AMEDIAFORMAT_KEY_LOW_LATENCY __INTRODUCED_IN(30);
-#if __ANDROID_API__ >= 31
extern const char* AMEDIAFORMAT_KEY_HDR10_PLUS_INFO __INTRODUCED_IN(31);
extern const char* AMEDIAFORMAT_KEY_SLOW_MOTION_MARKERS __INTRODUCED_IN(31);
extern const char* AMEDIAFORMAT_KEY_THUMBNAIL_CSD_AV1C __INTRODUCED_IN(31);
extern const char* AMEDIAFORMAT_KEY_XMP_OFFSET __INTRODUCED_IN(31);
extern const char* AMEDIAFORMAT_KEY_XMP_SIZE __INTRODUCED_IN(31);
-#endif /* __ANDROID_API__ >= 31 */
__END_DECLS
diff --git a/services/audioflinger/Android.bp b/services/audioflinger/Android.bp
index a005250..09d3871 100644
--- a/services/audioflinger/Android.bp
+++ b/services/audioflinger/Android.bp
@@ -35,10 +35,10 @@
],
shared_libs: [
- "audioflinger-aidl-unstable-cpp",
- "audioclient-types-aidl-unstable-cpp",
- "av-types-aidl-unstable-cpp",
- "effect-aidl-unstable-cpp",
+ "audioflinger-aidl-cpp",
+ "audioclient-types-aidl-cpp",
+ "av-types-aidl-cpp",
+ "effect-aidl-cpp",
"libaudioclient_aidl_conversion",
"libaudiofoundation",
"libaudiohal",
diff --git a/services/audiopolicy/AudioPolicyInterface.h b/services/audiopolicy/AudioPolicyInterface.h
index 630c423..7c0f2ce 100644
--- a/services/audiopolicy/AudioPolicyInterface.h
+++ b/services/audiopolicy/AudioPolicyInterface.h
@@ -450,9 +450,11 @@
virtual status_t getAudioPort(struct audio_port_v7 *port) = 0;
};
-extern "C" AudioPolicyInterface* createAudioPolicyManager(AudioPolicyClientInterface *clientInterface);
-extern "C" void destroyAudioPolicyManager(AudioPolicyInterface *interface);
-
+ // These are the signatures of createAudioPolicyManager/destroyAudioPolicyManager
+ // methods respectively, expected by AudioPolicyService, needs to be exposed by
+ // libaudiopolicymanagercustom.
+ using CreateAudioPolicyManagerInstance = AudioPolicyInterface* (*)(AudioPolicyClientInterface*);
+ using DestroyAudioPolicyManagerInstance = void (*)(AudioPolicyInterface*);
} // namespace android
diff --git a/services/audiopolicy/common/managerdefinitions/include/DeviceDescriptor.h b/services/audiopolicy/common/managerdefinitions/include/DeviceDescriptor.h
index 82cd6cf..05ec69e 100644
--- a/services/audiopolicy/common/managerdefinitions/include/DeviceDescriptor.h
+++ b/services/audiopolicy/common/managerdefinitions/include/DeviceDescriptor.h
@@ -278,6 +278,8 @@
void dump(String8 *dst, const String8 &tag, int spaces = 0, bool verbose = true) const;
+protected:
+ int do_compare(const void* lhs, const void* rhs) const;
private:
void refreshTypes();
void refreshAudioProfiles();
diff --git a/services/audiopolicy/common/managerdefinitions/src/DeviceDescriptor.cpp b/services/audiopolicy/common/managerdefinitions/src/DeviceDescriptor.cpp
index 3cfceba..a92d31e 100644
--- a/services/audiopolicy/common/managerdefinitions/src/DeviceDescriptor.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/DeviceDescriptor.cpp
@@ -279,6 +279,23 @@
return ret;
}
+int DeviceVector::do_compare(const void* lhs, const void* rhs) const {
+ const auto ldevice = *reinterpret_cast<const sp<DeviceDescriptor>*>(lhs);
+ const auto rdevice = *reinterpret_cast<const sp<DeviceDescriptor>*>(rhs);
+ int ret = 0;
+
+ // sort by type.
+ ret = compare_type(ldevice->type(), rdevice->type());
+ if (ret != 0)
+ return ret;
+ // for same type higher priority for latest device.
+ ret = compare_type(rdevice->getId(), ldevice->getId());
+ if (ret != 0)
+ return ret;
+ // fallback to default sort using pointer address
+ return SortedVector::do_compare(lhs, rhs);
+}
+
ssize_t DeviceVector::remove(const sp<DeviceDescriptor>& item)
{
ssize_t ret = indexOf(item);
diff --git a/services/audiopolicy/manager/Android.bp b/services/audiopolicy/manager/Android.bp
deleted file mode 100644
index 5bb432f..0000000
--- a/services/audiopolicy/manager/Android.bp
+++ /dev/null
@@ -1,32 +0,0 @@
-cc_library_shared {
- name: "libaudiopolicymanager",
-
- srcs: [
- "AudioPolicyFactory.cpp",
- ],
-
- include_dirs: [
- "frameworks/av/services/audioflinger"
- ],
-
- shared_libs: [
- "libaudiopolicymanagerdefault",
- ],
-
- static_libs: [
- "libaudiopolicycomponents",
- ],
-
- header_libs: [
- "libaudiopolicycommon",
- "libaudiopolicyengine_interface_headers",
- "libaudiopolicymanager_interface_headers",
- "libaudioutils_headers",
- ],
-
- cflags: [
- "-Werror",
- "-Wall",
- ],
-
-}
diff --git a/services/audiopolicy/manager/AudioPolicyFactory.cpp b/services/audiopolicy/manager/AudioPolicyFactory.cpp
deleted file mode 100644
index 476a1ec..0000000
--- a/services/audiopolicy/manager/AudioPolicyFactory.cpp
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <AudioPolicyManager.h>
-
-namespace android {
-
-extern "C" AudioPolicyInterface* createAudioPolicyManager(
- AudioPolicyClientInterface *clientInterface)
-{
- AudioPolicyManager *apm = new AudioPolicyManager(clientInterface);
- status_t status = apm->initialize();
- if (status != NO_ERROR) {
- delete apm;
- apm = nullptr;
- }
- return apm;
-}
-
-extern "C" void destroyAudioPolicyManager(AudioPolicyInterface *interface)
-{
- delete interface;
-}
-
-} // namespace android
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index e721a78..340eca4 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -272,7 +272,8 @@
mEngine->getActiveMediaDevices(mAvailableOutputDevices);
for (size_t i = 0; i < mOutputs.size(); i++) {
sp<SwAudioOutputDescriptor> desc = mOutputs.valueAt(i);
- if ((mEngine->getPhoneState() != AUDIO_MODE_IN_CALL) || (desc != mPrimaryOutput)) {
+ if (desc->isActive() && ((mEngine->getPhoneState() != AUDIO_MODE_IN_CALL) ||
+ (desc != mPrimaryOutput))) {
DeviceVector newDevices = getNewOutputDevices(desc, true /*fromCache*/);
// do not force device change on duplicated output because if device is 0, it will
// also force a device 0 for the two outputs it is duplicated to which may override
@@ -3303,6 +3304,11 @@
void AudioPolicyManager::updateInputRouting() {
for (const auto& activeDesc : mInputs.getActiveInputs()) {
+ // Skip for hotword recording as the input device switch
+ // is handled within sound trigger HAL
+ if (activeDesc->isSoundTrigger() && activeDesc->source() == AUDIO_SOURCE_HOTWORD) {
+ continue;
+ }
auto newDevice = getNewInputDevice(activeDesc);
// Force new input selection if the new device can not be reached via current input
if (activeDesc->mProfile->getSupportedDevices().contains(newDevice)) {
@@ -5720,13 +5726,27 @@
for (const auto &productStrategy : mEngine->getOrderedProductStrategies()) {
StreamTypeVector streams = mEngine->getStreamTypesForProductStrategy(productStrategy);
auto attr = mEngine->getAllAttributesForProductStrategy(productStrategy).front();
+ auto hasStreamActive = [&](auto stream) {
+ return hasStream(streams, stream) && isStreamActive(stream, 0);
+ };
- if ((hasVoiceStream(streams) &&
- (isInCall() || mOutputs.isStrategyActiveOnSameModule(productStrategy, outputDesc)) &&
- !isStreamActive(AUDIO_STREAM_ENFORCED_AUDIBLE, 0)) ||
- ((hasStream(streams, AUDIO_STREAM_ALARM) || hasStream(streams, AUDIO_STREAM_ENFORCED_AUDIBLE)) &&
- mOutputs.isStrategyActiveOnSameModule(productStrategy, outputDesc)) ||
- outputDesc->isStrategyActive(productStrategy)) {
+ auto doGetOutputDevicesForVoice = [&]() {
+ return hasVoiceStream(streams) && (outputDesc == mPrimaryOutput ||
+ outputDesc->isActive(toVolumeSource(AUDIO_STREAM_VOICE_CALL))) &&
+ (isInCall() ||
+ mOutputs.isStrategyActiveOnSameModule(productStrategy, outputDesc));
+ };
+
+ // With low-latency playing on speaker, music on WFD, when the first low-latency
+ // output is stopped, getNewOutputDevices checks for a product strategy
+ // from the list, as STRATEGY_SONIFICATION comes prior to STRATEGY_MEDIA.
+ // If an ALARM or ENFORCED_AUDIBLE stream is supported by the product strategy,
+ // devices are returned for STRATEGY_SONIFICATION without checking whether the
+ // stream is associated to the output descriptor.
+ if (doGetOutputDevicesForVoice() || outputDesc->isStrategyActive(productStrategy) ||
+ ((hasStreamActive(AUDIO_STREAM_ALARM) ||
+ hasStreamActive(AUDIO_STREAM_ENFORCED_AUDIBLE)) &&
+ mOutputs.isStrategyActiveOnSameModule(productStrategy, outputDesc))) {
// Retrieval of devices for voice DL is done on primary output profile, cannot
// check the route (would force modifying configuration file for this profile)
devices = mEngine->getOutputDevicesForAttributes(attr, nullptr, fromCache);
diff --git a/services/audiopolicy/service/Android.bp b/services/audiopolicy/service/Android.bp
index 8cb1b59..d4f5088 100644
--- a/services/audiopolicy/service/Android.bp
+++ b/services/audiopolicy/service/Android.bp
@@ -18,7 +18,7 @@
"libaudioclient_aidl_conversion",
"libaudiofoundation",
"libaudiopolicy",
- "libaudiopolicymanager",
+ "libaudiopolicymanagerdefault",
"libaudioutils",
"libbinder",
"libcutils",
@@ -30,11 +30,11 @@
"libmediautils",
"libsensorprivacy",
"libutils",
- "audioclient-types-aidl-unstable-cpp",
- "audioflinger-aidl-unstable-cpp",
- "audiopolicy-aidl-unstable-cpp",
- "audiopolicy-types-aidl-unstable-cpp",
- "capture_state_listener-aidl-unstable-cpp",
+ "audioclient-types-aidl-cpp",
+ "audioflinger-aidl-cpp",
+ "audiopolicy-aidl-cpp",
+ "audiopolicy-types-aidl-cpp",
+ "capture_state_listener-aidl-cpp",
],
static_libs: [
diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp
index 12335d9..90ad81e 100644
--- a/services/audiopolicy/service/AudioPolicyService.cpp
+++ b/services/audiopolicy/service/AudioPolicyService.cpp
@@ -23,6 +23,7 @@
#define __STDC_LIMIT_MACROS
#include <stdint.h>
#include <sys/time.h>
+#include <dlfcn.h>
#include <audio_utils/clock.h>
#include <binder/IServiceManager.h>
@@ -44,12 +45,14 @@
#include <system/audio.h>
#include <system/audio_policy.h>
+#include <AudioPolicyManager.h>
namespace android {
using binder::Status;
static const char kDeadlockedString[] = "AudioPolicyService may be deadlocked\n";
static const char kCmdDeadlockedString[] = "AudioPolicyService command thread may be deadlocked\n";
+static const char kAudioPolicyManagerCustomPath[] = "libaudiopolicymanagercustom.so";
static const int kDumpLockTimeoutNs = 1 * NANOS_PER_SECOND;
@@ -59,12 +62,54 @@
// ----------------------------------------------------------------------------
+static AudioPolicyInterface* createAudioPolicyManager(AudioPolicyClientInterface *clientInterface)
+{
+ AudioPolicyManager *apm = new AudioPolicyManager(clientInterface);
+ status_t status = apm->initialize();
+ if (status != NO_ERROR) {
+ delete apm;
+ apm = nullptr;
+ }
+ return apm;
+}
+
+static void destroyAudioPolicyManager(AudioPolicyInterface *interface)
+{
+ delete interface;
+}
+// ----------------------------------------------------------------------------
+
AudioPolicyService::AudioPolicyService()
: BnAudioPolicyService(),
mAudioPolicyManager(NULL),
mAudioPolicyClient(NULL),
mPhoneState(AUDIO_MODE_INVALID),
- mCaptureStateNotifier(false) {
+ mCaptureStateNotifier(false),
+ mCreateAudioPolicyManager(createAudioPolicyManager),
+ mDestroyAudioPolicyManager(destroyAudioPolicyManager) {
+}
+
+void AudioPolicyService::loadAudioPolicyManager()
+{
+ mLibraryHandle = dlopen(kAudioPolicyManagerCustomPath, RTLD_NOW);
+ if (mLibraryHandle != nullptr) {
+ ALOGI("%s loading %s", __func__, kAudioPolicyManagerCustomPath);
+ mCreateAudioPolicyManager = reinterpret_cast<CreateAudioPolicyManagerInstance>
+ (dlsym(mLibraryHandle, "createAudioPolicyManager"));
+ const char *lastError = dlerror();
+ ALOGW_IF(mCreateAudioPolicyManager == nullptr, "%s createAudioPolicyManager is null %s",
+ __func__, lastError != nullptr ? lastError : "no error");
+
+ mDestroyAudioPolicyManager = reinterpret_cast<DestroyAudioPolicyManagerInstance>(
+ dlsym(mLibraryHandle, "destroyAudioPolicyManager"));
+ lastError = dlerror();
+ ALOGW_IF(mDestroyAudioPolicyManager == nullptr, "%s destroyAudioPolicyManager is null %s",
+ __func__, lastError != nullptr ? lastError : "no error");
+ if (mCreateAudioPolicyManager == nullptr || mDestroyAudioPolicyManager == nullptr){
+ unloadAudioPolicyManager();
+ LOG_ALWAYS_FATAL("could not find audiopolicymanager interface methods");
+ }
+ }
}
void AudioPolicyService::onFirstRef()
@@ -78,7 +123,9 @@
mOutputCommandThread = new AudioCommandThread(String8("ApmOutput"), this);
mAudioPolicyClient = new AudioPolicyClient(this);
- mAudioPolicyManager = createAudioPolicyManager(mAudioPolicyClient);
+
+ loadAudioPolicyManager();
+ mAudioPolicyManager = mCreateAudioPolicyManager(mAudioPolicyClient);
}
// load audio processing modules
sp<AudioPolicyEffects> audioPolicyEffects = new AudioPolicyEffects();
@@ -94,12 +141,25 @@
sensorPrivacyPolicy->registerSelf();
}
+void AudioPolicyService::unloadAudioPolicyManager()
+{
+ ALOGV("%s ", __func__);
+ if (mLibraryHandle != nullptr) {
+ dlclose(mLibraryHandle);
+ }
+ mLibraryHandle = nullptr;
+ mCreateAudioPolicyManager = nullptr;
+ mDestroyAudioPolicyManager = nullptr;
+}
+
AudioPolicyService::~AudioPolicyService()
{
mAudioCommandThread->exit();
mOutputCommandThread->exit();
- destroyAudioPolicyManager(mAudioPolicyManager);
+ mDestroyAudioPolicyManager(mAudioPolicyManager);
+ unloadAudioPolicyManager();
+
delete mAudioPolicyClient;
mNotificationClients.clear();
diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h
index 72d8f28..e25d542 100644
--- a/services/audiopolicy/service/AudioPolicyService.h
+++ b/services/audiopolicy/service/AudioPolicyService.h
@@ -38,7 +38,6 @@
#include "CaptureStateNotifier.h"
#include <AudioPolicyInterface.h>
#include <android/hardware/BnSensorPrivacyListener.h>
-
#include <unordered_map>
namespace android {
@@ -861,7 +860,8 @@
// Internal dump utilities.
status_t dumpPermissionDenial(int fd);
-
+ void loadAudioPolicyManager();
+ void unloadAudioPolicyManager();
mutable Mutex mLock; // prevents concurrent access to AudioPolicy manager functions changing
// device connection state or routing
@@ -896,6 +896,10 @@
CaptureStateNotifier mCaptureStateNotifier;
+ void *mLibraryHandle = nullptr;
+ CreateAudioPolicyManagerInstance mCreateAudioPolicyManager;
+ DestroyAudioPolicyManagerInstance mDestroyAudioPolicyManager;
+
std::map<userid_t, sp<SensorPrivacyPolicy>> mMicrophoneSensorPrivacyPolicies;
};
diff --git a/services/mediaresourcemanager/Android.bp b/services/mediaresourcemanager/Android.bp
index 83a139b..cb69aa0 100644
--- a/services/mediaresourcemanager/Android.bp
+++ b/services/mediaresourcemanager/Android.bp
@@ -77,7 +77,7 @@
],
static_libs: [
- "resourceobserver_aidl_interface-ndk_platform",
+ "resourceobserver_aidl_interface-V1-ndk_platform",
],
include_dirs: ["frameworks/av/include"],
diff --git a/services/mediaresourcemanager/test/Android.bp b/services/mediaresourcemanager/test/Android.bp
index 308ee91..ad70a35 100644
--- a/services/mediaresourcemanager/test/Android.bp
+++ b/services/mediaresourcemanager/test/Android.bp
@@ -47,7 +47,7 @@
test_suites: ["device-tests"],
static_libs: [
"libresourcemanagerservice",
- "resourceobserver_aidl_interface-ndk_platform",
+ "resourceobserver_aidl_interface-V1-ndk_platform",
],
shared_libs: [
"libbinder",
diff --git a/services/tuner/Android.bp b/services/tuner/Android.bp
index 1cb3037..caa3474 100644
--- a/services/tuner/Android.bp
+++ b/services/tuner/Android.bp
@@ -85,7 +85,7 @@
],
static_libs: [
- "android.hardware.common.fmq-unstable-ndk_platform",
+ "android.hardware.common.fmq-V1-ndk_platform",
"libaidlcommonsupport",
],
@@ -111,6 +111,7 @@
shared_libs: [
"android.hardware.tv.tuner@1.0",
+ "android.hardware.tv.tuner@1.1",
"libbase",
"libbinder",
"libfmq",
diff --git a/services/tuner/TunerDemux.h b/services/tuner/TunerDemux.h
index 9f294c6..2a9836b 100644
--- a/services/tuner/TunerDemux.h
+++ b/services/tuner/TunerDemux.h
@@ -56,6 +56,8 @@
Status disconnectCiCam() override;
Status close() override;
+ int getId() { return mDemuxId; }
+
private:
sp<IDemux> mDemux;
int mDemuxId;
diff --git a/services/tuner/TunerDescrambler.cpp b/services/tuner/TunerDescrambler.cpp
new file mode 100644
index 0000000..6b2889d
--- /dev/null
+++ b/services/tuner/TunerDescrambler.cpp
@@ -0,0 +1,120 @@
+/**
+ * Copyright 2021, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "TunerDescrambler"
+
+#include "TunerFilter.h"
+#include "TunerDemux.h"
+#include "TunerDescrambler.h"
+
+using ::android::hardware::tv::tuner::V1_0::Result;
+
+using namespace std;
+
+namespace android {
+
+TunerDescrambler::TunerDescrambler(sp<IDescrambler> descrambler) {
+ mDescrambler = descrambler;
+}
+
+TunerDescrambler::~TunerDescrambler() {
+ mDescrambler = nullptr;
+}
+
+Status TunerDescrambler::setDemuxSource(const std::shared_ptr<ITunerDemux>& demux) {
+ if (mDescrambler == nullptr) {
+ ALOGE("IDescrambler is not initialized");
+ return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+
+ Result res = mDescrambler->setDemuxSource(static_cast<TunerDemux*>(demux.get())->getId());
+ if (res != Result::SUCCESS) {
+ return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
+ }
+ return Status::ok();
+}
+
+Status TunerDescrambler::setKeyToken(const vector<uint8_t>& keyToken) {
+ if (mDescrambler == nullptr) {
+ ALOGE("IDescrambler is not initialized");
+ return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+
+ Result res = mDescrambler->setKeyToken(keyToken);
+ if (res != Result::SUCCESS) {
+ return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
+ }
+ return Status::ok();
+}
+
+Status TunerDescrambler::addPid(const TunerDemuxPid& pid,
+ const shared_ptr<ITunerFilter>& optionalSourceFilter) {
+ if (mDescrambler == nullptr) {
+ ALOGE("IDescrambler is not initialized");
+ return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+
+ Result res = mDescrambler->addPid(getHidlDemuxPid(pid),
+ static_cast<TunerFilter*>(optionalSourceFilter.get())->getHalFilter());
+ if (res != Result::SUCCESS) {
+ return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
+ }
+ return Status::ok();
+}
+
+Status TunerDescrambler::removePid(const TunerDemuxPid& pid,
+ const shared_ptr<ITunerFilter>& optionalSourceFilter) {
+ if (mDescrambler == nullptr) {
+ ALOGE("IDescrambler is not initialized");
+ return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+
+ Result res = mDescrambler->removePid(getHidlDemuxPid(pid),
+ static_cast<TunerFilter*>(optionalSourceFilter.get())->getHalFilter());
+ if (res != Result::SUCCESS) {
+ return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
+ }
+ return Status::ok();
+}
+
+Status TunerDescrambler::close() {
+ if (mDescrambler == nullptr) {
+ ALOGE("IDescrambler is not initialized.");
+ return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+
+ Result res = mDescrambler->close();
+ if (res != Result::SUCCESS) {
+ return Status::fromServiceSpecificError(static_cast<int32_t>(res));
+ }
+ return Status::ok();
+}
+
+DemuxPid TunerDescrambler::getHidlDemuxPid(const TunerDemuxPid& pid) {
+ DemuxPid hidlPid;
+ switch (pid.getTag()) {
+ case TunerDemuxPid::tPid: {
+ hidlPid.tPid((uint16_t)pid.tPid);
+ break;
+ }
+ case TunerDemuxPid::mmtpPid: {
+ hidlPid.mmtpPid((uint16_t)pid.mmtpPid);
+ break;
+ }
+ }
+ return hidlPid;
+}
+} // namespace android
diff --git a/services/tuner/TunerDescrambler.h b/services/tuner/TunerDescrambler.h
new file mode 100644
index 0000000..1970fb7
--- /dev/null
+++ b/services/tuner/TunerDescrambler.h
@@ -0,0 +1,54 @@
+/**
+ * Copyright 2021, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_MEDIA_TUNERDESCRAMBLER_H
+#define ANDROID_MEDIA_TUNERDESCRAMBLER_H
+
+#include <aidl/android/media/tv/tuner/BnTunerDescrambler.h>
+#include <android/hardware/tv/tuner/1.0/ITuner.h>
+
+using Status = ::ndk::ScopedAStatus;
+using ::aidl::android::media::tv::tuner::BnTunerDescrambler;
+using ::aidl::android::media::tv::tuner::ITunerDemux;
+using ::aidl::android::media::tv::tuner::ITunerFilter;
+using ::aidl::android::media::tv::tuner::TunerDemuxPid;
+using ::android::hardware::tv::tuner::V1_0::DemuxPid;
+using ::android::hardware::tv::tuner::V1_0::IDescrambler;
+
+namespace android {
+
+class TunerDescrambler : public BnTunerDescrambler {
+
+public:
+ TunerDescrambler(sp<IDescrambler> descrambler);
+ virtual ~TunerDescrambler();
+ Status setDemuxSource(const shared_ptr<ITunerDemux>& demux) override;
+ Status setKeyToken(const vector<uint8_t>& keyToken) override;
+ Status addPid(const TunerDemuxPid& pid,
+ const shared_ptr<ITunerFilter>& optionalSourceFilter) override;
+ Status removePid(const TunerDemuxPid& pid,
+ const shared_ptr<ITunerFilter>& optionalSourceFilter) override;
+ Status close() override;
+
+private:
+ DemuxPid getHidlDemuxPid(const TunerDemuxPid& pid);
+
+ sp<IDescrambler> mDescrambler;
+};
+
+} // namespace android
+
+#endif // ANDROID_MEDIA_TUNERDESCRAMBLER_H
diff --git a/services/tuner/TunerFrontend.cpp b/services/tuner/TunerFrontend.cpp
index a919f98..b85e58b 100644
--- a/services/tuner/TunerFrontend.cpp
+++ b/services/tuner/TunerFrontend.cpp
@@ -17,6 +17,7 @@
#define LOG_TAG "TunerFrontend"
#include "TunerFrontend.h"
+#include "TunerLnb.h"
using ::aidl::android::media::tv::tuner::TunerFrontendAtsc3PlpSettings;
using ::aidl::android::media::tv::tuner::TunerFrontendScanAtsc3PlpInfo;
@@ -206,12 +207,68 @@
return Status::fromServiceSpecificError(static_cast<int32_t>(status));
}
-Status TunerFrontend::setLnb(int /*lnbHandle*/) {
- return Status::ok();
+Status TunerFrontend::setLnb(const shared_ptr<ITunerLnb>& lnb) {
+ if (mFrontend == NULL) {
+ ALOGD("IFrontend is not initialized");
+ return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+
+ Result status = mFrontend->setLnb(static_cast<TunerLnb*>(lnb.get())->getId());
+ if (status == Result::SUCCESS) {
+ return Status::ok();
+ }
+
+ return Status::fromServiceSpecificError(static_cast<int32_t>(status));
}
-Status TunerFrontend::setLna(bool /*bEnable*/) {
- return Status::ok();
+Status TunerFrontend::setLna(bool bEnable) {
+ if (mFrontend == NULL) {
+ ALOGD("IFrontend is not initialized");
+ return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+
+ Result status = mFrontend->setLna(bEnable);
+ if (status == Result::SUCCESS) {
+ return Status::ok();
+ }
+
+ return Status::fromServiceSpecificError(static_cast<int32_t>(status));
+}
+
+Status TunerFrontend::linkCiCamToFrontend(int ciCamId, int32_t* _aidl_return) {
+ if (mFrontend_1_1 == NULL) {
+ ALOGD("IFrontend_1_1 is not initialized");
+ return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+
+ int ltsId;
+ Result status;
+ mFrontend_1_1->linkCiCam(static_cast<uint32_t>(ciCamId),
+ [&](Result r, uint32_t id) {
+ status = r;
+ ltsId = id;
+ });
+
+ if (status == Result::SUCCESS) {
+ *_aidl_return = ltsId;
+ return Status::ok();
+ }
+
+ return Status::fromServiceSpecificError(static_cast<int32_t>(status));
+}
+
+Status TunerFrontend::unlinkCiCamToFrontend(int ciCamId) {
+ if (mFrontend_1_1 == NULL) {
+ ALOGD("IFrontend_1_1 is not initialized");
+ return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+
+ Result status = mFrontend_1_1->unlinkCiCam(ciCamId);
+ if (status == Result::SUCCESS) {
+ return Status::ok();
+ }
+
+ return Status::fromServiceSpecificError(static_cast<int32_t>(status));
}
Status TunerFrontend::close() {
diff --git a/services/tuner/TunerFrontend.h b/services/tuner/TunerFrontend.h
index 729640c..22fd509 100644
--- a/services/tuner/TunerFrontend.h
+++ b/services/tuner/TunerFrontend.h
@@ -27,6 +27,7 @@
using Status = ::ndk::ScopedAStatus;
using ::aidl::android::media::tv::tuner::BnTunerFrontend;
using ::aidl::android::media::tv::tuner::ITunerFrontendCallback;
+using ::aidl::android::media::tv::tuner::ITunerLnb;
using ::aidl::android::media::tv::tuner::TunerFrontendAtsc3Settings;
using ::aidl::android::media::tv::tuner::TunerFrontendDvbsCodeRate;
using ::aidl::android::media::tv::tuner::TunerFrontendScanMessage;
@@ -65,8 +66,10 @@
Status stopTune() override;
Status scan(const TunerFrontendSettings& settings, int frontendScanType) override;
Status stopScan() override;
- Status setLnb(int lnbHandle) override;
+ Status setLnb(const shared_ptr<ITunerLnb>& lnb) override;
Status setLna(bool bEnable) override;
+ Status linkCiCamToFrontend(int ciCamId, int32_t* _aidl_return) override;
+ Status unlinkCiCamToFrontend(int ciCamId) override;
Status close() override;
Status getStatus(const vector<int32_t>& statusTypes,
vector<TunerFrontendStatus>* _aidl_return) override;
diff --git a/services/tuner/TunerLnb.h b/services/tuner/TunerLnb.h
index e80b97e..500d072 100644
--- a/services/tuner/TunerLnb.h
+++ b/services/tuner/TunerLnb.h
@@ -49,6 +49,8 @@
Status sendDiseqcMessage(const vector<uint8_t>& diseqcMessage) override;
Status close() override;
+ int getId() { return mId; }
+
struct LnbCallback : public ILnbCallback {
LnbCallback(const shared_ptr<ITunerLnbCallback> tunerLnbCallback)
: mTunerLnbCallback(tunerLnbCallback) {};
diff --git a/services/tuner/TunerService.cpp b/services/tuner/TunerService.cpp
index 4376188..4f6f16c 100644
--- a/services/tuner/TunerService.cpp
+++ b/services/tuner/TunerService.cpp
@@ -17,12 +17,12 @@
#define LOG_TAG "TunerService"
#include <android/binder_manager.h>
-#include <fmq/ConvertMQDescriptors.h>
#include <utils/Log.h>
#include "TunerService.h"
#include "TunerFrontend.h"
#include "TunerLnb.h"
#include "TunerDemux.h"
+#include "TunerDescrambler.h"
using ::aidl::android::media::tv::tuner::TunerFrontendAnalogCapabilities;
using ::aidl::android::media::tv::tuner::TunerFrontendAtsc3Capabilities;
@@ -45,6 +45,7 @@
using ::android::hardware::tv::tuner::V1_0::ILnb;
using ::android::hardware::tv::tuner::V1_0::LnbId;
using ::android::hardware::tv::tuner::V1_0::Result;
+using ::android::hardware::tv::tuner::V1_1::FrontendDtmbCapabilities;
namespace android {
@@ -57,8 +58,8 @@
AServiceManager_addService(service->asBinder().get(), getServiceName());
}
-bool TunerService::getITuner() {
- ALOGD("getITuner");
+bool TunerService::hasITuner() {
+ ALOGD("hasITuner");
if (mTuner != nullptr) {
return true;
}
@@ -70,10 +71,26 @@
return true;
}
+bool TunerService::hasITuner_1_1() {
+ ALOGD("hasITuner_1_1");
+ if (mTuner_1_1 != nullptr) {
+ return true;
+ }
+ if (!hasITuner()) {
+ return false;
+ }
+ mTuner_1_1 = ::android::hardware::tv::tuner::V1_1::ITuner::castFrom(mTuner);
+ if (mTuner_1_1 == nullptr) {
+ ALOGE("Failed to get ITuner_1_1 service");
+ return false;
+ }
+ return true;
+}
+
Status TunerService::openDemux(
int /* demuxHandle */, std::shared_ptr<ITunerDemux>* _aidl_return) {
ALOGD("openDemux");
- if (!getITuner()) {
+ if (!hasITuner()) {
return Status::fromServiceSpecificError(static_cast<int32_t>(Result::NOT_INITIALIZED));
}
Result res;
@@ -98,7 +115,7 @@
Status TunerService::getDemuxCaps(TunerDemuxCapabilities* _aidl_return) {
ALOGD("getDemuxCaps");
- if (!getITuner()) {
+ if (!hasITuner()) {
return Status::fromServiceSpecificError(static_cast<int32_t>(Result::NOT_INITIALIZED));
}
Result res;
@@ -116,48 +133,8 @@
return Status::fromServiceSpecificError(static_cast<int32_t>(res));
}
-Result TunerService::configFilter() {
- ALOGD("configFilter");
- if (mFilter == NULL) {
- ALOGD("Failed to configure filter: filter not found");
- return Result::NOT_INITIALIZED;
- }
- DemuxFilterSettings filterSettings;
- DemuxTsFilterSettings tsFilterSettings {
- .tpid = 256,
- };
- DemuxFilterAvSettings filterAvSettings {
- .isPassthrough = false,
- };
- tsFilterSettings.filterSettings.av(filterAvSettings);
- filterSettings.ts(tsFilterSettings);
- Result res = mFilter->configure(filterSettings);
-
- if (res != Result::SUCCESS) {
- ALOGD("config filter failed, res = %d", res);
- return res;
- }
-
- Result getQueueDescResult = Result::UNKNOWN_ERROR;
- mFilter->getQueueDesc(
- [&](Result r, const MQDescriptorSync<uint8_t>& desc) {
- mFilterMQDesc = desc;
- getQueueDescResult = r;
- ALOGD("getFilterQueueDesc");
- });
- if (getQueueDescResult == Result::SUCCESS) {
- unsafeHidlToAidlMQDescriptor<uint8_t, int8_t, SynchronizedReadWrite>(
- mFilterMQDesc, &mAidlMQDesc);
- mAidlMq = new (nothrow) AidlMessageQueue(mAidlMQDesc);
- EventFlag::createEventFlag(mAidlMq->getEventFlagWord(), &mEventFlag);
- } else {
- ALOGD("get MQDesc failed, res = %d", getQueueDescResult);
- }
- return getQueueDescResult;
-}
-
Status TunerService::getFrontendIds(vector<int32_t>* ids) {
- if (!getITuner()) {
+ if (!hasITuner()) {
return Status::fromServiceSpecificError(
static_cast<int32_t>(Result::NOT_INITIALIZED));
}
@@ -172,17 +149,15 @@
return Status::ok();
}
-Status TunerService::getFrontendInfo(
- int32_t frontendHandle, TunerFrontendInfo* _aidl_return) {
- if (mTuner == nullptr) {
+Status TunerService::getFrontendInfo(int32_t id, TunerFrontendInfo* _aidl_return) {
+ if (!hasITuner()) {
ALOGE("ITuner service is not init.");
return ::ndk::ScopedAStatus::fromServiceSpecificError(
static_cast<int32_t>(Result::UNAVAILABLE));
}
FrontendInfo info;
- int feId = getResourceIdFromHandle(frontendHandle, FRONTEND);
- Result res = getHidlFrontendInfo(feId, info);
+ Result res = getHidlFrontendInfo(id, info);
if (res != Result::SUCCESS) {
return Status::fromServiceSpecificError(static_cast<int32_t>(res));
}
@@ -192,9 +167,41 @@
return Status::ok();
}
+Status TunerService::getFrontendDtmbCapabilities(
+ int32_t id, TunerFrontendDtmbCapabilities* _aidl_return) {
+ if (!hasITuner_1_1()) {
+ ALOGE("ITuner_1_1 service is not init.");
+ return ::ndk::ScopedAStatus::fromServiceSpecificError(
+ static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+
+ Result res;
+ FrontendDtmbCapabilities dtmbCaps;
+ mTuner_1_1->getFrontendDtmbCapabilities(id,
+ [&](Result r, const FrontendDtmbCapabilities& caps) {
+ dtmbCaps = caps;
+ res = r;
+ });
+ if (res != Result::SUCCESS) {
+ return Status::fromServiceSpecificError(static_cast<int32_t>(res));
+ }
+
+ TunerFrontendDtmbCapabilities aidlDtmbCaps{
+ .transmissionModeCap = (int)dtmbCaps.transmissionModeCap,
+ .bandwidthCap = (int)dtmbCaps.bandwidthCap,
+ .modulationCap = (int)dtmbCaps.modulationCap,
+ .codeRateCap = (int)dtmbCaps.codeRateCap,
+ .guardIntervalCap = (int)dtmbCaps.guardIntervalCap,
+ .interleaveModeCap = (int)dtmbCaps.interleaveModeCap,
+ };
+
+ *_aidl_return = aidlDtmbCaps;
+ return Status::ok();
+}
+
Status TunerService::openFrontend(
int32_t frontendHandle, shared_ptr<ITunerFrontend>* _aidl_return) {
- if (mTuner == nullptr) {
+ if (!hasITuner()) {
ALOGE("ITuner service is not init.");
return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
}
@@ -213,25 +220,8 @@
return Status::ok();
}
-Status TunerService::getFmqSyncReadWrite(
- MQDescriptor<int8_t, SynchronizedReadWrite>* mqDesc, bool* _aidl_return) {
- ALOGD("getFmqSyncReadWrite");
- // TODO: put the following methods AIDL, and should be called from clients.
- configFilter();
- mFilter->start();
- if (mqDesc == nullptr) {
- ALOGD("getFmqSyncReadWrite null MQDescriptor.");
- *_aidl_return = false;
- } else {
- ALOGD("getFmqSyncReadWrite true");
- *_aidl_return = true;
- *mqDesc = move(mAidlMQDesc);
- }
- return ndk::ScopedAStatus::ok();
-}
-
Status TunerService::openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) {
- if (!getITuner()) {
+ if (!hasITuner()) {
ALOGD("get ITuner failed");
return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
}
@@ -252,7 +242,7 @@
}
Status TunerService::openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>* _aidl_return) {
- if (!getITuner()) {
+ if (!hasITuner()) {
ALOGE("get ITuner failed");
return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
}
@@ -273,8 +263,30 @@
return Status::ok();
}
+Status TunerService::openDescrambler(int32_t /*descramblerHandle*/,
+ std::shared_ptr<ITunerDescrambler>* _aidl_return) {
+ if (!hasITuner()) {
+ ALOGD("get ITuner failed");
+ return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+
+ Result status;
+ sp<IDescrambler> descrambler;
+ //int id = getResourceIdFromHandle(descramblerHandle, DESCRAMBLER);
+ mTuner->openDescrambler([&](Result r, const sp<IDescrambler>& descramblerSp) {
+ status = r;
+ descrambler = descramblerSp;
+ });
+ if (status != Result::SUCCESS) {
+ return Status::fromServiceSpecificError(static_cast<int32_t>(status));
+ }
+
+ *_aidl_return = ::ndk::SharedRefBase::make<TunerDescrambler>(descrambler);
+ return Status::ok();
+}
+
Status TunerService::updateTunerResources() {
- if (!getITuner()) {
+ if (!hasITuner()) {
return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
}
@@ -430,7 +442,7 @@
case FrontendType::DVBC: {
TunerFrontendCableCapabilities cableCaps{
.modulationCap = (int)halInfo.frontendCaps.dvbcCaps().modulationCap,
- .codeRateCap = (int)halInfo.frontendCaps.dvbcCaps().fecCap,
+ .codeRateCap = (int64_t)halInfo.frontendCaps.dvbcCaps().fecCap,
.annexCap = (int)halInfo.frontendCaps.dvbcCaps().annexCap,
};
caps.set<TunerFrontendCapabilities::cableCaps>(cableCaps);
diff --git a/services/tuner/TunerService.h b/services/tuner/TunerService.h
index e18b793..ce085cb 100644
--- a/services/tuner/TunerService.h
+++ b/services/tuner/TunerService.h
@@ -19,7 +19,7 @@
#include <aidl/android/media/tv/tunerresourcemanager/ITunerResourceManager.h>
#include <aidl/android/media/tv/tuner/BnTunerService.h>
-#include <android/hardware/tv/tuner/1.0/ITuner.h>
+#include <android/hardware/tv/tuner/1.1/ITuner.h>
#include <fmq/AidlMessageQueue.h>
#include <fmq/EventFlag.h>
#include <fmq/MessageQueue.h>
@@ -29,9 +29,11 @@
using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite;
using ::aidl::android::media::tv::tuner::BnTunerService;
using ::aidl::android::media::tv::tuner::ITunerDemux;
+using ::aidl::android::media::tv::tuner::ITunerDescrambler;
using ::aidl::android::media::tv::tuner::ITunerFrontend;
using ::aidl::android::media::tv::tuner::ITunerLnb;
using ::aidl::android::media::tv::tuner::TunerDemuxCapabilities;
+using ::aidl::android::media::tv::tuner::TunerFrontendDtmbCapabilities;
using ::aidl::android::media::tv::tuner::TunerFrontendInfo;
using ::aidl::android::media::tv::tunerresourcemanager::ITunerResourceManager;
@@ -55,6 +57,7 @@
using ::android::hardware::tv::tuner::V1_0::FrontendId;
using ::android::hardware::tv::tuner::V1_0::FrontendInfo;
using ::android::hardware::tv::tuner::V1_0::IDemux;
+using ::android::hardware::tv::tuner::V1_0::IDescrambler;
using ::android::hardware::tv::tuner::V1_0::IFilter;
using ::android::hardware::tv::tuner::V1_0::IFilterCallback;
using ::android::hardware::tv::tuner::V1_0::ITuner;
@@ -94,6 +97,20 @@
TunerService();
virtual ~TunerService();
+ Status getFrontendIds(vector<int32_t>* ids) override;
+ Status getFrontendInfo(int32_t id, TunerFrontendInfo* _aidl_return) override;
+ Status getFrontendDtmbCapabilities(
+ int32_t id, TunerFrontendDtmbCapabilities* _aidl_return) override;
+ Status openFrontend(
+ int32_t frontendHandle, shared_ptr<ITunerFrontend>* _aidl_return) override;
+ Status openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) override;
+ Status openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>* _aidl_return) override;
+ Status openDemux(int32_t demuxHandle, std::shared_ptr<ITunerDemux>* _aidl_return) override;
+ Status getDemuxCaps(TunerDemuxCapabilities* _aidl_return) override;
+ Status openDescrambler(int32_t descramblerHandle,
+ std::shared_ptr<ITunerDescrambler>* _aidl_return) override;
+ Status updateTunerResources() override;
+
// TODO: create a map between resource id and handles.
static int getResourceIdFromHandle(int resourceHandle, int /*type*/) {
return (resourceHandle & 0x00ff0000) >> 16;
@@ -106,21 +123,9 @@
| (mResourceRequestCount++ & 0xffff);
}
- Status getFrontendIds(vector<int32_t>* ids) override;
- Status getFrontendInfo(int32_t frontendHandle, TunerFrontendInfo* _aidl_return) override;
- Status openFrontend(
- int32_t frontendHandle, shared_ptr<ITunerFrontend>* _aidl_return) override;
- Status getFmqSyncReadWrite(
- MQDescriptor<int8_t, SynchronizedReadWrite>* mqDesc, bool* _aidl_return) override;
- Status openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) override;
- Status openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>* _aidl_return) override;
- Status openDemux(int32_t demuxHandle, std::shared_ptr<ITunerDemux>* _aidl_return) override;
- Status getDemuxCaps(TunerDemuxCapabilities* _aidl_return) override;
- Status updateTunerResources() override;
-
private:
- bool getITuner();
- Result configFilter();
+ bool hasITuner();
+ bool hasITuner_1_1();
void updateFrontendResources();
void updateLnbResources();
@@ -132,15 +137,10 @@
TunerFrontendInfo convertToAidlFrontendInfo(FrontendInfo halInfo);
sp<ITuner> mTuner;
- sp<IFilter> mFilter;
+ sp<::android::hardware::tv::tuner::V1_1::ITuner> mTuner_1_1;
shared_ptr<ITunerResourceManager> mTunerResourceManager;
int mResourceRequestCount = 0;
-
- AidlMessageQueue* mAidlMq;
- MQDescriptorSync<uint8_t> mFilterMQDesc;
- AidlMQDesc mAidlMQDesc;
- EventFlag* mEventFlag;
};
} // namespace android
diff --git a/services/tuner/aidl/android/media/tv/tuner/ITunerDescrambler.aidl b/services/tuner/aidl/android/media/tv/tuner/ITunerDescrambler.aidl
new file mode 100644
index 0000000..7370eee
--- /dev/null
+++ b/services/tuner/aidl/android/media/tv/tuner/ITunerDescrambler.aidl
@@ -0,0 +1,53 @@
+/**
+ * Copyright 2021, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.tv.tuner;
+
+import android.media.tv.tuner.ITunerDemux;
+import android.media.tv.tuner.ITunerFilter;
+import android.media.tv.tuner.TunerDemuxPid;
+
+/**
+ * Tuner Demux interface handles tuner related operations.
+ *
+ * {@hide}
+ */
+interface ITunerDescrambler {
+ /**
+ * Set a demux as source of the descrambler.
+ */
+ void setDemuxSource(in ITunerDemux tunerDemux);
+
+ /**
+ * Set a key token to link descrambler to a key slot.
+ */
+ void setKeyToken(in byte[] keyToken);
+
+ /**
+ * Add packets' PID to the descrambler for descrambling.
+ */
+ void addPid(in TunerDemuxPid pid, in ITunerFilter optionalSourceFilter);
+
+ /**
+ * Remove packets' PID from the descrambler.
+ */
+ void removePid(in TunerDemuxPid pid, in ITunerFilter optionalSourceFilter);
+
+ /**
+ * Close a new interface of ITunerDescrambler.
+ */
+ void close();
+}
diff --git a/services/tuner/aidl/android/media/tv/tuner/ITunerFrontend.aidl b/services/tuner/aidl/android/media/tv/tuner/ITunerFrontend.aidl
index 254e16a..ef0255a 100644
--- a/services/tuner/aidl/android/media/tv/tuner/ITunerFrontend.aidl
+++ b/services/tuner/aidl/android/media/tv/tuner/ITunerFrontend.aidl
@@ -17,6 +17,7 @@
package android.media.tv.tuner;
import android.media.tv.tuner.ITunerFrontendCallback;
+import android.media.tv.tuner.ITunerLnb;
import android.media.tv.tuner.TunerFrontendSettings;
import android.media.tv.tuner.TunerFrontendStatus;
@@ -61,9 +62,9 @@
/**
* Sets Low-Noise Block downconverter (LNB) for satellite frontend.
*
- * @param lnbHandle lnb handle in use.
+ * @param tuner lnb interface.
*/
- void setLnb(in int lnbHandle);
+ void setLnb(in ITunerLnb lnb);
/**
* Enable or Disable Low Noise Amplifier (LNA).
@@ -73,6 +74,18 @@
void setLna(in boolean bEnable);
/**
+ * Link Frontend to the cicam with given id.
+ *
+ * @return lts id
+ */
+ int linkCiCamToFrontend(in int ciCamId);
+
+ /**
+ * Unink Frontend to the cicam with given id.
+ */
+ void unlinkCiCamToFrontend(in int ciCamId);
+
+ /**
* Releases the ITunerFrontend instance.
*/
void close();
diff --git a/services/tuner/aidl/android/media/tv/tuner/ITunerService.aidl b/services/tuner/aidl/android/media/tv/tuner/ITunerService.aidl
index c6259ae..bea8811 100644
--- a/services/tuner/aidl/android/media/tv/tuner/ITunerService.aidl
+++ b/services/tuner/aidl/android/media/tv/tuner/ITunerService.aidl
@@ -20,9 +20,11 @@
import android.hardware.common.fmq.SynchronizedReadWrite;
import android.hardware.common.fmq.UnsynchronizedWrite;
import android.media.tv.tuner.ITunerDemux;
+import android.media.tv.tuner.ITunerDescrambler;
import android.media.tv.tuner.ITunerFrontend;
import android.media.tv.tuner.ITunerLnb;
import android.media.tv.tuner.TunerDemuxCapabilities;
+import android.media.tv.tuner.TunerFrontendDtmbCapabilities;
import android.media.tv.tuner.TunerFrontendInfo;
/**
@@ -47,6 +49,11 @@
TunerFrontendInfo getFrontendInfo(in int frontendHandle);
/**
+ * Get Dtmb Frontend Capabilities.
+ */
+ TunerFrontendDtmbCapabilities getFrontendDtmbCapabilities(in int id);
+
+ /**
* Open a Tuner Frontend interface.
*
* @param frontendHandle the handle of the frontend granted by TRM.
@@ -54,13 +61,6 @@
*/
ITunerFrontend openFrontend(in int frontendHandle);
- /*
- * Gets synchronized fast message queue.
- *
- * @return true if succeeds, false otherwise.
- */
- boolean getFmqSyncReadWrite(out MQDescriptor<byte, SynchronizedReadWrite> mqDesc);
-
/**
* Open a new interface of ITunerLnb given a lnbHandle.
*
@@ -89,6 +89,13 @@
*/
TunerDemuxCapabilities getDemuxCaps();
+ /* Open a new interface of ITunerDescrambler given a descramblerHandle.
+ *
+ * @param descramblerHandle the handle of the descrambler granted by TRM.
+ * @return a newly created ITunerDescrambler interface.
+ */
+ ITunerDescrambler openDescrambler(in int descramblerHandle);
+
/**
* Update Tuner Resources in TunerResourceManager.
*/
diff --git a/services/tuner/aidl/android/media/tv/tuner/TunerDemuxPid.aidl b/services/tuner/aidl/android/media/tv/tuner/TunerDemuxPid.aidl
new file mode 100644
index 0000000..51c6378
--- /dev/null
+++ b/services/tuner/aidl/android/media/tv/tuner/TunerDemuxPid.aidl
@@ -0,0 +1,28 @@
+/**
+ * Copyright 2021, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.tv.tuner;
+
+/**
+ * Demux PID interface.
+ *
+ * {@hide}
+ */
+union TunerDemuxPid {
+ int tPid;
+
+ int mmtpPid;
+}
diff --git a/services/tuner/aidl/android/media/tv/tuner/TunerFrontendCableCapabilities.aidl b/services/tuner/aidl/android/media/tv/tuner/TunerFrontendCableCapabilities.aidl
index 7df452a..b880c60 100644
--- a/services/tuner/aidl/android/media/tv/tuner/TunerFrontendCableCapabilities.aidl
+++ b/services/tuner/aidl/android/media/tv/tuner/TunerFrontendCableCapabilities.aidl
@@ -30,7 +30,7 @@
/**
* Code Rate capability
*/
- int codeRateCap; // inner FEC will converge to codeRate
+ long codeRateCap; // inner FEC will converge to codeRate
/**
* Annex capability
diff --git a/services/tuner/aidl/android/media/tv/tuner/TunerFrontendDtmbCapabilities.aidl b/services/tuner/aidl/android/media/tv/tuner/TunerFrontendDtmbCapabilities.aidl
new file mode 100644
index 0000000..e8e4933
--- /dev/null
+++ b/services/tuner/aidl/android/media/tv/tuner/TunerFrontendDtmbCapabilities.aidl
@@ -0,0 +1,36 @@
+/**
+ * Copyright 2021, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.tv.tuner;
+
+/**
+ * DTMB Frontend Capabilities interface.
+ *
+ * {@hide}
+ */
+parcelable TunerFrontendDtmbCapabilities {
+ int transmissionModeCap;
+
+ int bandwidthCap;
+
+ int modulationCap;
+
+ int codeRateCap;
+
+ int guardIntervalCap;
+
+ int interleaveModeCap;
+}