From ed15eee545584a75ba4825a2f8650f4db470ad4a Mon Sep 17 00:00:00 2001 From: Mikhail Naganov Date: Fri, 31 Jul 2020 17:42:20 -0700 Subject: Update Visualizer implementation after changes in AudioEffect AudioEffect was fixed to remove a call to AudioEffect::set away from the constructor. Bug: 162323621 Bug: 174222126 Test: repro steps from the bug atest android.media.cts.VisualizerTest Change-Id: I90ac6e4fe0a1229758a98a63a3b7810de60469be Merged-In: I90ac6e4fe0a1229758a98a63a3b7810de60469be --- media/jni/audioeffect/Visualizer.cpp | 33 ++++++++++++--------- media/jni/audioeffect/Visualizer.h | 34 +++++++++++++--------- .../jni/audioeffect/android_media_AudioEffect.cpp | 21 +++++++------ media/jni/audioeffect/android_media_Visualizer.cpp | 10 +++---- 4 files changed, 55 insertions(+), 43 deletions(-) (limited to 'media') diff --git a/media/jni/audioeffect/Visualizer.cpp b/media/jni/audioeffect/Visualizer.cpp index efeb3352d393..d92c7caf57a6 100644 --- a/media/jni/audioeffect/Visualizer.cpp +++ b/media/jni/audioeffect/Visualizer.cpp @@ -33,21 +33,9 @@ namespace android { // --------------------------------------------------------------------------- -Visualizer::Visualizer (const String16& opPackageName, - int32_t priority, - effect_callback_t cbf, - void* user, - audio_session_t sessionId) - : AudioEffect(SL_IID_VISUALIZATION, opPackageName, NULL, priority, cbf, user, sessionId), - mCaptureRate(CAPTURE_RATE_DEF), - mCaptureSize(CAPTURE_SIZE_DEF), - mSampleRate(44100000), - mScalingMode(VISUALIZER_SCALING_MODE_NORMALIZED), - mMeasurementMode(MEASUREMENT_MODE_NONE), - mCaptureCallBack(NULL), - mCaptureCbkUser(NULL) +Visualizer::Visualizer (const String16& opPackageName) + : AudioEffect(opPackageName) { - initCaptureSize(); } Visualizer::~Visualizer() @@ -57,6 +45,23 @@ Visualizer::~Visualizer() setCaptureCallBack(NULL, NULL, 0, 0); } +status_t Visualizer::set(int32_t priority, + effect_callback_t cbf, + void* user, + audio_session_t sessionId, + audio_io_handle_t io, + const AudioDeviceTypeAddr& device, + bool probe) +{ + status_t status = AudioEffect::set( + SL_IID_VISUALIZATION, nullptr, priority, cbf, user, sessionId, io, device, probe); + if (status == NO_ERROR || status == ALREADY_EXISTS) { + initCaptureSize(); + } + return status; +} + + void Visualizer::release() { ALOGV("Visualizer::release()"); diff --git a/media/jni/audioeffect/Visualizer.h b/media/jni/audioeffect/Visualizer.h index d4672a95c6d8..8b6a62f25638 100644 --- a/media/jni/audioeffect/Visualizer.h +++ b/media/jni/audioeffect/Visualizer.h @@ -65,14 +65,22 @@ public: /* Constructor. * See AudioEffect constructor for details on parameters. */ - Visualizer(const String16& opPackageName, - int32_t priority = 0, - effect_callback_t cbf = NULL, - void* user = NULL, - audio_session_t sessionId = AUDIO_SESSION_OUTPUT_MIX); + explicit Visualizer(const String16& opPackageName); ~Visualizer(); + /** + * Initialize an uninitialized Visualizer. + * See AudioEffect 'set' function for details on parameters. + */ + status_t set(int32_t priority = 0, + effect_callback_t cbf = NULL, + void* user = NULL, + audio_session_t sessionId = AUDIO_SESSION_OUTPUT_MIX, + audio_io_handle_t io = AUDIO_IO_HANDLE_NONE, + const AudioDeviceTypeAddr& device = {}, + bool probe = false); + // Declared 'final' because we call this in ~Visualizer(). status_t setEnabled(bool enabled) final; @@ -163,15 +171,15 @@ private: uint32_t initCaptureSize(); Mutex mCaptureLock; - uint32_t mCaptureRate; - uint32_t mCaptureSize; - uint32_t mSampleRate; - uint32_t mScalingMode; - uint32_t mMeasurementMode; - capture_cbk_t mCaptureCallBack; - void *mCaptureCbkUser; + uint32_t mCaptureRate = CAPTURE_RATE_DEF; + uint32_t mCaptureSize = CAPTURE_SIZE_DEF; + uint32_t mSampleRate = 44100000; + uint32_t mScalingMode = VISUALIZER_SCALING_MODE_NORMALIZED; + uint32_t mMeasurementMode = MEASUREMENT_MODE_NONE; + capture_cbk_t mCaptureCallBack = nullptr; + void *mCaptureCbkUser = nullptr; sp mCaptureThread; - uint32_t mCaptureFlags; + uint32_t mCaptureFlags = 0; }; diff --git a/media/jni/audioeffect/android_media_AudioEffect.cpp b/media/jni/audioeffect/android_media_AudioEffect.cpp index dbe7b4b619c9..96961ac21a2d 100644 --- a/media/jni/audioeffect/android_media_AudioEffect.cpp +++ b/media/jni/audioeffect/android_media_AudioEffect.cpp @@ -337,22 +337,21 @@ android_media_AudioEffect_native_setup(JNIEnv *env, jobject thiz, jobject weak_t } // create the native AudioEffect object - lpAudioEffect = new AudioEffect(typeStr, - String16(opPackageNameStr.c_str()), - uuidStr, - priority, - effectCallback, - &lpJniStorage->mCallbackData, - (audio_session_t) sessionId, - AUDIO_IO_HANDLE_NONE, - device, - probe); + lpAudioEffect = new AudioEffect(String16(opPackageNameStr.c_str())); if (lpAudioEffect == 0) { ALOGE("Error creating AudioEffect"); goto setup_failure; } - + lpAudioEffect->set(typeStr, + uuidStr, + priority, + effectCallback, + &lpJniStorage->mCallbackData, + (audio_session_t) sessionId, + AUDIO_IO_HANDLE_NONE, + device, + probe); lStatus = AudioEffectJni::translateNativeErrorToJava(lpAudioEffect->initCheck()); if (lStatus != AUDIOEFFECT_SUCCESS && lStatus != AUDIOEFFECT_ERROR_ALREADY_EXISTS) { ALOGE("AudioEffect initCheck failed %d", lStatus); diff --git a/media/jni/audioeffect/android_media_Visualizer.cpp b/media/jni/audioeffect/android_media_Visualizer.cpp index f9a77f474c50..4c5970a30a05 100644 --- a/media/jni/audioeffect/android_media_Visualizer.cpp +++ b/media/jni/audioeffect/android_media_Visualizer.cpp @@ -382,15 +382,15 @@ android_media_visualizer_native_setup(JNIEnv *env, jobject thiz, jobject weak_th } // create the native Visualizer object - lpVisualizer = new Visualizer(String16(opPackageNameStr.c_str()), - 0, - android_media_visualizer_effect_callback, - lpJniStorage, - (audio_session_t) sessionId); + lpVisualizer = new Visualizer(String16(opPackageNameStr.c_str())); if (lpVisualizer == 0) { ALOGE("Error creating Visualizer"); goto setup_failure; } + lpVisualizer->set(0, + android_media_visualizer_effect_callback, + lpJniStorage, + (audio_session_t) sessionId); lStatus = translateError(lpVisualizer->initCheck()); if (lStatus != VISUALIZER_SUCCESS && lStatus != VISUALIZER_ERROR_ALREADY_EXISTS) { -- cgit v1.2.3 From ab813b4f12159a9231870e0865c5e7d2d6cef2d6 Mon Sep 17 00:00:00 2001 From: Santiago Seifert Date: Fri, 20 Nov 2020 20:25:46 +0000 Subject: Expose MediaExtractor entry point to MediaMetrics Bug: 170386720 Test: atest CtsMediaV2TestCases:ExtractorTest$FunctionalityTest Change-Id: Id10861db464b88734c34c81db945b1a828f0bc2c Merged-In: Id10861db464b88734c34c81db945b1a828f0bc2c --- media/jni/android_media_MediaExtractor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'media') diff --git a/media/jni/android_media_MediaExtractor.cpp b/media/jni/android_media_MediaExtractor.cpp index 528dc62c3016..c60203eae759 100644 --- a/media/jni/android_media_MediaExtractor.cpp +++ b/media/jni/android_media_MediaExtractor.cpp @@ -68,7 +68,7 @@ JMediaExtractor::JMediaExtractor(JNIEnv *env, jobject thiz) mClass = (jclass)env->NewGlobalRef(clazz); mObject = env->NewWeakGlobalRef(thiz); - mImpl = new NuMediaExtractor; + mImpl = new NuMediaExtractor(NuMediaExtractor::EntryPoint::SDK); } JMediaExtractor::~JMediaExtractor() { -- cgit v1.2.3 From 6b6699abe5afd5022ce93e7bea39cd08a20d342a Mon Sep 17 00:00:00 2001 From: Santiago Seifert Date: Fri, 20 Nov 2020 20:25:46 +0000 Subject: Expose MediaExtractor entry point to MediaMetrics Bug: 170386720 Test: atest CtsMediaV2TestCases:ExtractorTest$FunctionalityTest Change-Id: Id10861db464b88734c34c81db945b1a828f0bc2c Merged-In: Id10861db464b88734c34c81db945b1a828f0bc2c --- media/jni/android_media_MediaExtractor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'media') diff --git a/media/jni/android_media_MediaExtractor.cpp b/media/jni/android_media_MediaExtractor.cpp index 948ebcd9fdd5..6a622c5a1566 100644 --- a/media/jni/android_media_MediaExtractor.cpp +++ b/media/jni/android_media_MediaExtractor.cpp @@ -68,7 +68,7 @@ JMediaExtractor::JMediaExtractor(JNIEnv *env, jobject thiz) mClass = (jclass)env->NewGlobalRef(clazz); mObject = env->NewWeakGlobalRef(thiz); - mImpl = new NuMediaExtractor; + mImpl = new NuMediaExtractor(NuMediaExtractor::EntryPoint::SDK); } JMediaExtractor::~JMediaExtractor() { -- cgit v1.2.3 From 946d9f1d21b53aed2275544764d48157ab2fdb98 Mon Sep 17 00:00:00 2001 From: jiabin Date: Mon, 14 Dec 2020 21:13:30 -0800 Subject: Add package name when initializing SoundPool. The package name is useful for permission validation. Currently, package name is required when starting external vibration so that the vibrator service can verify if the app has the permission to start vibration. Bug: 175595599 Test: SoundPool tests in cts Test: play audio-coupled-haptic file using SoundPool. Change-Id: Ibfe414063a303118a5bb393d65ea5dc2323bf722 Merged-In: Ibfe414063a303118a5bb393d65ea5dc2323bf722 (cherry picked from commit de9005bab1751e23342bbc9f0f51213eea8885af) --- media/java/android/media/SoundPool.java | 5 +++-- media/jni/soundpool/SoundPool.cpp | 5 +++-- media/jni/soundpool/SoundPool.h | 5 ++++- media/jni/soundpool/Stream.cpp | 4 +++- media/jni/soundpool/StreamManager.cpp | 4 +++- media/jni/soundpool/StreamManager.h | 8 +++++++- media/jni/soundpool/android_media_SoundPool.cpp | 8 +++++--- 7 files changed, 28 insertions(+), 11 deletions(-) (limited to 'media') diff --git a/media/java/android/media/SoundPool.java b/media/java/android/media/SoundPool.java index 1bf2863989a5..3f685a4c934e 100644 --- a/media/java/android/media/SoundPool.java +++ b/media/java/android/media/SoundPool.java @@ -149,7 +149,8 @@ public class SoundPool extends PlayerBase { super(attributes, AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL); // do native setup - if (native_setup(new WeakReference(this), maxStreams, attributes) != 0) { + if (native_setup(new WeakReference(this), + maxStreams, attributes, getCurrentOpPackageName()) != 0) { throw new RuntimeException("Native setup failed"); } mAttributes = attributes; @@ -501,7 +502,7 @@ public class SoundPool extends PlayerBase { private native final int _load(FileDescriptor fd, long offset, long length, int priority); private native final int native_setup(Object weakRef, int maxStreams, - Object/*AudioAttributes*/ attributes); + @NonNull Object/*AudioAttributes*/ attributes, @NonNull String opPackageName); private native final int _play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate); diff --git a/media/jni/soundpool/SoundPool.cpp b/media/jni/soundpool/SoundPool.cpp index ac44843859f6..253b4e3a8a09 100644 --- a/media/jni/soundpool/SoundPool.cpp +++ b/media/jni/soundpool/SoundPool.cpp @@ -84,8 +84,9 @@ bool checkLoop(int32_t *loop) } // namespace -SoundPool::SoundPool(int32_t maxStreams, const audio_attributes_t* attributes) - : mStreamManager(maxStreams, kStreamManagerThreads, attributes) +SoundPool::SoundPool( + int32_t maxStreams, const audio_attributes_t* attributes, const std::string& opPackageName) + : mStreamManager(maxStreams, kStreamManagerThreads, attributes, opPackageName) { ALOGV("%s(maxStreams=%d, attr={ content_type=%d, usage=%d, flags=0x%x, tags=%s })", __func__, maxStreams, diff --git a/media/jni/soundpool/SoundPool.h b/media/jni/soundpool/SoundPool.h index d5b16ef629cd..ffb1c997393a 100644 --- a/media/jni/soundpool/SoundPool.h +++ b/media/jni/soundpool/SoundPool.h @@ -19,6 +19,8 @@ #include "SoundManager.h" #include "StreamManager.h" +#include + namespace android { /** @@ -29,7 +31,8 @@ namespace android { */ class SoundPool { public: - SoundPool(int32_t maxStreams, const audio_attributes_t* attributes); + SoundPool(int32_t maxStreams, const audio_attributes_t* attributes, + const std::string& opPackageName = {}); ~SoundPool(); // SoundPool Java API support diff --git a/media/jni/soundpool/Stream.cpp b/media/jni/soundpool/Stream.cpp index e7042d0562a4..73e319a5902e 100644 --- a/media/jni/soundpool/Stream.cpp +++ b/media/jni/soundpool/Stream.cpp @@ -332,7 +332,9 @@ void Stream::play_l(const std::shared_ptr& sound, int32_t nextStreamID, 0 /*default notification frames*/, AUDIO_SESSION_ALLOCATE, AudioTrack::TRANSFER_DEFAULT, nullptr /*offloadInfo*/, -1 /*uid*/, -1 /*pid*/, - mStreamManager->getAttributes()); + mStreamManager->getAttributes(), + false /*doNotReconnect*/, 1.0f /*maxRequiredSpeed*/, + mStreamManager->getOpPackageName()); // Set caller name so it can be logged in destructor. // MediaMetricsConstants.h: AMEDIAMETRICS_PROP_CALLERNAME_VALUE_SOUNDPOOL newTrack->setCallerName("soundpool"); diff --git a/media/jni/soundpool/StreamManager.cpp b/media/jni/soundpool/StreamManager.cpp index 5b6494d4947e..502ee00b583e 100644 --- a/media/jni/soundpool/StreamManager.cpp +++ b/media/jni/soundpool/StreamManager.cpp @@ -98,9 +98,11 @@ int32_t StreamMap::getNextIdForStream(Stream* stream) const { #pragma clang diagnostic ignored "-Wthread-safety-analysis" StreamManager::StreamManager( - int32_t streams, size_t threads, const audio_attributes_t* attributes) + int32_t streams, size_t threads, const audio_attributes_t* attributes, + std::string opPackageName) : StreamMap(streams) , mAttributes(*attributes) + , mOpPackageName(std::move(opPackageName)) { ALOGV("%s(%d, %zu, ...)", __func__, streams, threads); forEach([this](Stream *stream) { diff --git a/media/jni/soundpool/StreamManager.h b/media/jni/soundpool/StreamManager.h index 59ae2f9d108b..81ac69eb4358 100644 --- a/media/jni/soundpool/StreamManager.h +++ b/media/jni/soundpool/StreamManager.h @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -386,7 +387,8 @@ class StreamManager : public StreamMap { public: // Note: the SoundPool pointer is only used for stream initialization. // It is not stored in StreamManager. - StreamManager(int32_t streams, size_t threads, const audio_attributes_t* attributes); + StreamManager(int32_t streams, size_t threads, const audio_attributes_t* attributes, + std::string opPackageName); ~StreamManager(); // Returns positive streamID on success, 0 on failure. This is locked. @@ -400,6 +402,8 @@ public: const audio_attributes_t* getAttributes() const { return &mAttributes; } + const std::string& getOpPackageName() const { return mOpPackageName; } + // Moves the stream to the restart queue (called upon BUFFER_END of the static track) // this is locked internally. // If activeStreamIDToMatch is nonzero, it will only move to the restart queue @@ -473,6 +477,8 @@ private: // The paired stream may be active or restarting. // No particular order. std::unordered_set mProcessingStreams GUARDED_BY(mStreamManagerLock); + + const std::string mOpPackageName; }; } // namespace android::soundpool diff --git a/media/jni/soundpool/android_media_SoundPool.cpp b/media/jni/soundpool/android_media_SoundPool.cpp index 8f6df3db718b..de96737d4034 100644 --- a/media/jni/soundpool/android_media_SoundPool.cpp +++ b/media/jni/soundpool/android_media_SoundPool.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include "SoundPool.h" @@ -181,7 +182,7 @@ static void android_media_callback(SoundPoolEvent event, SoundPool* soundPool, v static jint android_media_SoundPool_native_setup(JNIEnv *env, jobject thiz, jobject weakRef, - jint maxChannels, jobject jaa) + jint maxChannels, jobject jaa, jstring opPackageName) { if (jaa == nullptr) { ALOGE("Error creating SoundPool: invalid audio attributes"); @@ -203,7 +204,8 @@ android_media_SoundPool_native_setup(JNIEnv *env, jobject thiz, jobject weakRef, paa->flags = env->GetIntField(jaa, javaAudioAttrFields.fieldFlags); ALOGV("android_media_SoundPool_native_setup"); - auto *ap = new SoundPool(maxChannels, paa); + ScopedUtfChars opPackageNameStr(env, opPackageName); + auto *ap = new SoundPool(maxChannels, paa, opPackageNameStr.c_str()); if (ap == nullptr) { return -1; } @@ -298,7 +300,7 @@ static JNINativeMethod gMethods[] = { (void *)android_media_SoundPool_setRate }, { "native_setup", - "(Ljava/lang/Object;ILjava/lang/Object;)I", + "(Ljava/lang/Object;ILjava/lang/Object;Ljava/lang/String;)I", (void*)android_media_SoundPool_native_setup }, { "native_release", -- cgit v1.2.3 From 181d26b7e5844d6952ff16365cac3730d5ba366f Mon Sep 17 00:00:00 2001 From: jiabin Date: Mon, 14 Dec 2020 21:13:30 -0800 Subject: Add package name when initializing SoundPool. The package name is useful for permission validation. Currently, package name is required when starting external vibration so that the vibrator service can verify if the app has the permission to start vibration. Bug: 175595599 Test: SoundPool tests in cts Test: play audio-coupled-haptic file using SoundPool. Change-Id: Ibfe414063a303118a5bb393d65ea5dc2323bf722 Merged-In: Ibfe414063a303118a5bb393d65ea5dc2323bf722 (cherry picked from commit de9005bab1751e23342bbc9f0f51213eea8885af) --- media/java/android/media/SoundPool.java | 5 +++-- media/jni/soundpool/SoundPool.cpp | 5 +++-- media/jni/soundpool/SoundPool.h | 5 ++++- media/jni/soundpool/Stream.cpp | 4 +++- media/jni/soundpool/StreamManager.cpp | 4 +++- media/jni/soundpool/StreamManager.h | 8 +++++++- media/jni/soundpool/android_media_SoundPool.cpp | 8 +++++--- 7 files changed, 28 insertions(+), 11 deletions(-) (limited to 'media') diff --git a/media/java/android/media/SoundPool.java b/media/java/android/media/SoundPool.java index 1bf2863989a5..3f685a4c934e 100644 --- a/media/java/android/media/SoundPool.java +++ b/media/java/android/media/SoundPool.java @@ -149,7 +149,8 @@ public class SoundPool extends PlayerBase { super(attributes, AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL); // do native setup - if (native_setup(new WeakReference(this), maxStreams, attributes) != 0) { + if (native_setup(new WeakReference(this), + maxStreams, attributes, getCurrentOpPackageName()) != 0) { throw new RuntimeException("Native setup failed"); } mAttributes = attributes; @@ -501,7 +502,7 @@ public class SoundPool extends PlayerBase { private native final int _load(FileDescriptor fd, long offset, long length, int priority); private native final int native_setup(Object weakRef, int maxStreams, - Object/*AudioAttributes*/ attributes); + @NonNull Object/*AudioAttributes*/ attributes, @NonNull String opPackageName); private native final int _play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate); diff --git a/media/jni/soundpool/SoundPool.cpp b/media/jni/soundpool/SoundPool.cpp index ac44843859f6..253b4e3a8a09 100644 --- a/media/jni/soundpool/SoundPool.cpp +++ b/media/jni/soundpool/SoundPool.cpp @@ -84,8 +84,9 @@ bool checkLoop(int32_t *loop) } // namespace -SoundPool::SoundPool(int32_t maxStreams, const audio_attributes_t* attributes) - : mStreamManager(maxStreams, kStreamManagerThreads, attributes) +SoundPool::SoundPool( + int32_t maxStreams, const audio_attributes_t* attributes, const std::string& opPackageName) + : mStreamManager(maxStreams, kStreamManagerThreads, attributes, opPackageName) { ALOGV("%s(maxStreams=%d, attr={ content_type=%d, usage=%d, flags=0x%x, tags=%s })", __func__, maxStreams, diff --git a/media/jni/soundpool/SoundPool.h b/media/jni/soundpool/SoundPool.h index d5b16ef629cd..ffb1c997393a 100644 --- a/media/jni/soundpool/SoundPool.h +++ b/media/jni/soundpool/SoundPool.h @@ -19,6 +19,8 @@ #include "SoundManager.h" #include "StreamManager.h" +#include + namespace android { /** @@ -29,7 +31,8 @@ namespace android { */ class SoundPool { public: - SoundPool(int32_t maxStreams, const audio_attributes_t* attributes); + SoundPool(int32_t maxStreams, const audio_attributes_t* attributes, + const std::string& opPackageName = {}); ~SoundPool(); // SoundPool Java API support diff --git a/media/jni/soundpool/Stream.cpp b/media/jni/soundpool/Stream.cpp index e7042d0562a4..73e319a5902e 100644 --- a/media/jni/soundpool/Stream.cpp +++ b/media/jni/soundpool/Stream.cpp @@ -332,7 +332,9 @@ void Stream::play_l(const std::shared_ptr& sound, int32_t nextStreamID, 0 /*default notification frames*/, AUDIO_SESSION_ALLOCATE, AudioTrack::TRANSFER_DEFAULT, nullptr /*offloadInfo*/, -1 /*uid*/, -1 /*pid*/, - mStreamManager->getAttributes()); + mStreamManager->getAttributes(), + false /*doNotReconnect*/, 1.0f /*maxRequiredSpeed*/, + mStreamManager->getOpPackageName()); // Set caller name so it can be logged in destructor. // MediaMetricsConstants.h: AMEDIAMETRICS_PROP_CALLERNAME_VALUE_SOUNDPOOL newTrack->setCallerName("soundpool"); diff --git a/media/jni/soundpool/StreamManager.cpp b/media/jni/soundpool/StreamManager.cpp index 5b6494d4947e..502ee00b583e 100644 --- a/media/jni/soundpool/StreamManager.cpp +++ b/media/jni/soundpool/StreamManager.cpp @@ -98,9 +98,11 @@ int32_t StreamMap::getNextIdForStream(Stream* stream) const { #pragma clang diagnostic ignored "-Wthread-safety-analysis" StreamManager::StreamManager( - int32_t streams, size_t threads, const audio_attributes_t* attributes) + int32_t streams, size_t threads, const audio_attributes_t* attributes, + std::string opPackageName) : StreamMap(streams) , mAttributes(*attributes) + , mOpPackageName(std::move(opPackageName)) { ALOGV("%s(%d, %zu, ...)", __func__, streams, threads); forEach([this](Stream *stream) { diff --git a/media/jni/soundpool/StreamManager.h b/media/jni/soundpool/StreamManager.h index 59ae2f9d108b..81ac69eb4358 100644 --- a/media/jni/soundpool/StreamManager.h +++ b/media/jni/soundpool/StreamManager.h @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -386,7 +387,8 @@ class StreamManager : public StreamMap { public: // Note: the SoundPool pointer is only used for stream initialization. // It is not stored in StreamManager. - StreamManager(int32_t streams, size_t threads, const audio_attributes_t* attributes); + StreamManager(int32_t streams, size_t threads, const audio_attributes_t* attributes, + std::string opPackageName); ~StreamManager(); // Returns positive streamID on success, 0 on failure. This is locked. @@ -400,6 +402,8 @@ public: const audio_attributes_t* getAttributes() const { return &mAttributes; } + const std::string& getOpPackageName() const { return mOpPackageName; } + // Moves the stream to the restart queue (called upon BUFFER_END of the static track) // this is locked internally. // If activeStreamIDToMatch is nonzero, it will only move to the restart queue @@ -473,6 +477,8 @@ private: // The paired stream may be active or restarting. // No particular order. std::unordered_set mProcessingStreams GUARDED_BY(mStreamManagerLock); + + const std::string mOpPackageName; }; } // namespace android::soundpool diff --git a/media/jni/soundpool/android_media_SoundPool.cpp b/media/jni/soundpool/android_media_SoundPool.cpp index 26725f87bfdc..357cc63bd41e 100644 --- a/media/jni/soundpool/android_media_SoundPool.cpp +++ b/media/jni/soundpool/android_media_SoundPool.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include "SoundPool.h" @@ -181,7 +182,7 @@ static void android_media_callback(SoundPoolEvent event, SoundPool* soundPool, v static jint android_media_SoundPool_native_setup(JNIEnv *env, jobject thiz, jobject weakRef, - jint maxChannels, jobject jaa) + jint maxChannels, jobject jaa, jstring opPackageName) { if (jaa == nullptr) { ALOGE("Error creating SoundPool: invalid audio attributes"); @@ -203,7 +204,8 @@ android_media_SoundPool_native_setup(JNIEnv *env, jobject thiz, jobject weakRef, paa->flags = (audio_flags_mask_t) env->GetIntField(jaa, javaAudioAttrFields.fieldFlags); ALOGV("android_media_SoundPool_native_setup"); - auto *ap = new SoundPool(maxChannels, paa); + ScopedUtfChars opPackageNameStr(env, opPackageName); + auto *ap = new SoundPool(maxChannels, paa, opPackageNameStr.c_str()); if (ap == nullptr) { return -1; } @@ -298,7 +300,7 @@ static JNINativeMethod gMethods[] = { (void *)android_media_SoundPool_setRate }, { "native_setup", - "(Ljava/lang/Object;ILjava/lang/Object;)I", + "(Ljava/lang/Object;ILjava/lang/Object;Ljava/lang/String;)I", (void*)android_media_SoundPool_native_setup }, { "native_release", -- cgit v1.2.3 From 56bc77955355f5e2db824c6cab977cc245283d97 Mon Sep 17 00:00:00 2001 From: Kyunglyul Hyun Date: Thu, 15 Oct 2020 06:20:45 +0000 Subject: MediaRouterService binds services when necessary MediaRouterService maintained bindings to provider services once those are established. With this CL, it only binds services when there is a non-empty discovery preference set by a foreground app or an app is casting. This change may break output switcher, which enables transfer media of background apps. To alleviate that MediaRouter2Manager#startScan and #stopScan are added so that system UI can force the service bind to the services and find remote devices to cast. Bug: 169575701 Bug: 172920557 Test: manually and CTS Change-Id: I4a47fdb1c9fe05a04d26950485833c9cbfb91a69 (cherry picked from commit 9f889ca4e62044900004cb7ce4e85415d2b019e2) (cherry picked from commit 602b168f99b00c037191234a85190d845680aa64) --- media/java/android/media/IMediaRouterService.aidl | 2 ++ media/java/android/media/MediaRouter2Manager.java | 30 ++++++++++++++++++++++ .../android/media/RouteDiscoveryPreference.java | 1 + 3 files changed, 33 insertions(+) (limited to 'media') diff --git a/media/java/android/media/IMediaRouterService.aidl b/media/java/android/media/IMediaRouterService.aidl index 068f9689d06f..4b8a8adade1f 100644 --- a/media/java/android/media/IMediaRouterService.aidl +++ b/media/java/android/media/IMediaRouterService.aidl @@ -73,6 +73,8 @@ interface IMediaRouterService { void unregisterManager(IMediaRouter2Manager manager); void setRouteVolumeWithManager(IMediaRouter2Manager manager, int requestId, in MediaRoute2Info route, int volume); + void startScan(IMediaRouter2Manager manager); + void stopScan(IMediaRouter2Manager manager); void requestCreateSessionWithManager(IMediaRouter2Manager manager, int requestId, in RoutingSessionInfo oldSession, in @nullable MediaRoute2Info route); diff --git a/media/java/android/media/MediaRouter2Manager.java b/media/java/android/media/MediaRouter2Manager.java index 4b09a5f19fb0..68237de2ca98 100644 --- a/media/java/android/media/MediaRouter2Manager.java +++ b/media/java/android/media/MediaRouter2Manager.java @@ -146,6 +146,36 @@ public final class MediaRouter2Manager { } } + /** + * Starts scanning remote routes. + * @see #stopScan(String) + */ + public void startScan() { + Client client = getOrCreateClient(); + if (client != null) { + try { + mMediaRouterService.startScan(client); + } catch (RemoteException ex) { + Log.e(TAG, "Unable to get sessions. Service probably died.", ex); + } + } + } + + /** + * Stops scanning remote routes to reduce resource consumption. + * @see #startScan(String) + */ + public void stopScan() { + Client client = getOrCreateClient(); + if (client != null) { + try { + mMediaRouterService.stopScan(client); + } catch (RemoteException ex) { + Log.e(TAG, "Unable to get sessions. Service probably died.", ex); + } + } + } + /** * Gets a {@link android.media.session.MediaController} associated with the * given routing session. diff --git a/media/java/android/media/RouteDiscoveryPreference.java b/media/java/android/media/RouteDiscoveryPreference.java index 68f2964dbeb2..2f952474b7f0 100644 --- a/media/java/android/media/RouteDiscoveryPreference.java +++ b/media/java/android/media/RouteDiscoveryPreference.java @@ -153,6 +153,7 @@ public final class RouteDiscoveryPreference implements Parcelable { return false; } RouteDiscoveryPreference other = (RouteDiscoveryPreference) o; + //TODO: Make this order-free return Objects.equals(mPreferredFeatures, other.mPreferredFeatures) && mShouldPerformActiveScan == other.mShouldPerformActiveScan; } -- cgit v1.2.3