Merge "fix b/62040757 - bad pointer to native audioplayer in 32-bit builds." into oc-dev
diff --git a/src/Android.mk b/src/Android.mk
index 0e42bc1..1b7024b 100644
--- a/src/Android.mk
+++ b/src/Android.mk
@@ -92,7 +92,6 @@
android/android_GenericMediaPlayer.cpp\
android/android_GenericPlayer.cpp \
android/android_LocAVPlayer.cpp \
- android/android_TrackPlayerBase.cpp \
android/android_StreamPlayer.cpp \
android/android_Effect.cpp \
android/util/AacAdtsExtractor.cpp \
@@ -192,7 +191,9 @@
libdl \
libandroid_runtime
-LOCAL_EXPORT_SHARED_LIBRARY_HEADERS := libmedia
+LOCAL_EXPORT_SHARED_LIBRARY_HEADERS := \
+ libmedia \
+ libaudioclient
# For Brillo, we do not want this dependency as it significantly increases the
# size of the checkout. Also, the library is dependent on Java (which is not
diff --git a/src/android/AudioPlayer_to_android.cpp b/src/android/AudioPlayer_to_android.cpp
index cda9976..13301ca 100644
--- a/src/android/AudioPlayer_to_android.cpp
+++ b/src/android/AudioPlayer_to_android.cpp
@@ -281,7 +281,7 @@
if (ap->mAPlayer != 0) {
ap->mAPlayer->setVolume(leftVol, rightVol);
} else if (ap->mTrackPlayer != 0) {
- ap->mTrackPlayer->setSlPlayerVolume(leftVol, rightVol);
+ ap->mTrackPlayer->setPlayerVolume(leftVol, rightVol);
}
// changes in the AudioPlayer volume must be reflected in the send level:
diff --git a/src/android/android_TrackPlayerBase.cpp b/src/android/android_TrackPlayerBase.cpp
deleted file mode 100644
index a41fed8..0000000
--- a/src/android/android_TrackPlayerBase.cpp
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Copyright (C) 2017 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 "sles_allinclusive.h"
-
-#include <media/stagefright/foundation/ADebug.h>
-#include <sys/stat.h>
-#include <inttypes.h>
-#include <audiomanager/IPlayer.h>
-#include <audiomanager/AudioManager.h>
-#include <audiomanager/IAudioManager.h>
-#include <binder/IServiceManager.h>
-#include "utils/RefBase.h"
-
-#define max(a, b) ((a) > (b) ? (a) : (b))
-#define min(a, b) ((a) < (b) ? (a) : (b))
-
-namespace android {
-
-//--------------------------------------------------------------------------------------------------
-TrackPlayerBase::TrackPlayerBase() : BnPlayer(),
- mPIId(PLAYER_PIID_INVALID), mLastReportedEvent(PLAYER_STATE_UNKNOWN),
- mSlPlayerVolumeL(1.0f), mSlPlayerVolumeR(1.0f),
- mPanMultiplierL(1.0f), mPanMultiplierR(1.0f),
- mVolumeMultiplierL(1.0f), mVolumeMultiplierR(1.0f)
-{
- SL_LOGD("TrackPlayerBase::TrackPlayerBase()");
- // use checkService() to avoid blocking if audio service is not up yet
- sp<IBinder> binder = defaultServiceManager()->checkService(String16("audio"));
- if (binder == 0) {
- SL_LOGE("TrackPlayerBase(): binding to audio service failed, service up?");
- } else {
- mAudioManager = interface_cast<IAudioManager>(binder);
- }
-}
-
-
-TrackPlayerBase::~TrackPlayerBase() {
- SL_LOGV("TrackPlayerBase::~TrackPlayerBase()");
- destroy();
-}
-
-void TrackPlayerBase::init(AudioTrack* pat, player_type_t playerType, audio_usage_t usage) {
- mAudioTrack = pat;
- if (mAudioManager == 0) {
- SL_LOGE("AudioPlayer realize: no audio service, player will not be registered");
- } else {
- mPIId = mAudioManager->trackPlayer(playerType, usage, AUDIO_CONTENT_TYPE_UNKNOWN, this);
- }
-}
-
-void TrackPlayerBase::destroy() {
- if (mAudioTrack != 0) {
- mAudioTrack->stop();
- // Note that there may still be another reference in post-unlock phase of SetPlayState
- mAudioTrack.clear();
- }
- serviceReleasePlayer();
- if (mAudioManager != 0) {
- mAudioManager.clear();
- }
-}
-
-void TrackPlayerBase::setSlPlayerVolume(float vl, float vr) {
- float tl, tr = 1.0f;
- {
- Mutex::Autolock _l(mSettingsLock);
- mSlPlayerVolumeL = vl;
- mSlPlayerVolumeR = vr;
- tl = mSlPlayerVolumeL * mPanMultiplierL * mVolumeMultiplierL;
- tr = mSlPlayerVolumeR * mPanMultiplierR * mVolumeMultiplierR;
- }
- if (mAudioTrack != 0) {
- mAudioTrack->setVolume(tl, tr);
- }
-}
-
-//------------------------------------------------------------------------------
-void TrackPlayerBase::servicePlayerEvent(player_state_t event) {
- if (mAudioManager != 0) {
- // only report state change
- Mutex::Autolock _l(mPlayerStateLock);
- if (event != mLastReportedEvent
- && mPIId != PLAYER_PIID_INVALID) {
- mLastReportedEvent = event;
- mAudioManager->playerEvent(mPIId, event);
- }
- }
-}
-
-void TrackPlayerBase::serviceReleasePlayer() {
- if (mAudioManager != 0
- && mPIId != PLAYER_PIID_INVALID) {
- mAudioManager->releasePlayer(mPIId);
- }
-}
-
-//FIXME temporary method while some AudioTrack state is outside of this class
-void TrackPlayerBase::reportEvent(player_state_t event) {
- servicePlayerEvent(event);
-}
-
-//------------------------------------------------------------------------------
-// Implementation of IPlayer
-void TrackPlayerBase::start() {
- if (mAudioTrack != 0) {
- SL_LOGD("TrackPlayerBase::start() from IPlayer");
- //FIXME pipe this to SL player, not AudioTrack directly
- if (mAudioTrack->start() == NO_ERROR) {
- servicePlayerEvent(PLAYER_STATE_STARTED);
- }
- } else {
- SL_LOGD("TrackPlayerBase::start() no AudioTrack to start from IPlayer");
- }
-}
-
-void TrackPlayerBase::pause() {
- if (mAudioTrack != 0) {
- SL_LOGD("TrackPlayerBase::pause() from IPlayer");
- //FIXME pipe this to SL player, not AudioTrack directly
- mAudioTrack->pause();
- servicePlayerEvent(PLAYER_STATE_PAUSED);
- } else {
- SL_LOGD("TrackPlayerBase::pause() no AudioTrack to pause from IPlayer");
- }
-}
-
-
-void TrackPlayerBase::stop() {
- if (mAudioTrack != 0) {
- SL_LOGD("TrackPlayerBase::stop() from IPlayer");
- //FIXME pipe this to SL player, not AudioTrack directly
- mAudioTrack->stop();
- servicePlayerEvent(PLAYER_STATE_STOPPED);
- } else {
- SL_LOGD("TrackPlayerBase::stop() no AudioTrack to stop from IPlayer");
- }
-}
-
-void TrackPlayerBase::setVolume(float vol) {
- float tl, tr = 1.0f;
- {
- Mutex::Autolock _l(mSettingsLock);
- mVolumeMultiplierL = vol;
- mVolumeMultiplierR = vol;
- tl = mSlPlayerVolumeL * mPanMultiplierL * mVolumeMultiplierL;
- tr = mSlPlayerVolumeR * mPanMultiplierR * mVolumeMultiplierR;
- }
- if (mAudioTrack != 0) {
- SL_LOGD("TrackPlayerBase::setVolume() from IPlayer");
- mAudioTrack->setVolume(tl, tr);
- } else {
- SL_LOGD("TrackPlayerBase::setVolume() no AudioTrack for volume control from IPlayer");
- }
-}
-
-void TrackPlayerBase::setPan(float pan) {
- float tl, tr = 1.0f;
- {
- Mutex::Autolock _l(mSettingsLock);
- pan = min(max(-1.0f, pan), 1.0f);
- if (pan >= 0.0f) {
- mPanMultiplierL = 1.0f - pan;
- mPanMultiplierR = 1.0f;
- } else {
- mPanMultiplierL = 1.0f;
- mPanMultiplierR = 1.0f + pan;
- }
- tl = mSlPlayerVolumeL * mPanMultiplierL * mVolumeMultiplierL;
- tr = mSlPlayerVolumeR * mPanMultiplierR * mVolumeMultiplierR;
- }
- if (mAudioTrack != 0) {
- SL_LOGD("TrackPlayerBase::setPan() from IPlayer");
- mAudioTrack->setVolume(tl, tr);
- } else {
- SL_LOGD("TrackPlayerBase::setPan() no AudioTrack for volume control from IPlayer");
- }
-}
-
-void TrackPlayerBase::setStartDelayMs(int32_t delayMs) {
- //FIXME not supported for SLES
- SL_LOGW("setStartDelay() is not supported in OpenSL ES");
-}
-
-void TrackPlayerBase::applyVolumeShaper(
- const sp<VolumeShaper::Configuration>& configuration,
- const sp<VolumeShaper::Operation>& operation) {
- if (mAudioTrack != 0) {
- SL_LOGD("TrackPlayerBase::applyVolumeShaper() from IPlayer");
- VolumeShaper::Status status = mAudioTrack->applyVolumeShaper(configuration, operation);
- if (status < 0) { // a non-negative value is the volume shaper id.
- SL_LOGE("TrackPlayerBase::applyVolumeShaper() failed with status %d", status);
- }
- } else {
- SL_LOGD("TrackPlayerBase::applyVolumeShaper()"
- " no AudioTrack for volume control from IPlayer");
- }
-}
-
-status_t TrackPlayerBase::onTransact(
- uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
-{
- return BnPlayer::onTransact(code, data, reply, flags);
-}
-
-} // namespace android
diff --git a/src/android/android_TrackPlayerBase.h b/src/android/android_TrackPlayerBase.h
deleted file mode 100644
index f20a87c..0000000
--- a/src/android/android_TrackPlayerBase.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2017 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_TRACK_PLAYER_BASE_H__
-#define __ANDROID_TRACK_PLAYER_BASE_H__
-
-#include <media/stagefright/foundation/AHandler.h>
-#include <media/stagefright/foundation/ALooper.h>
-#include <media/stagefright/foundation/AMessage.h>
-#include <audiomanager/IPlayer.h>
-#include <audiomanager/AudioManager.h>
-#include <audiomanager/IAudioManager.h>
-#include "utils/RefBase.h"
-
-
-namespace android {
-
-class TrackPlayerBase : public BnPlayer
-{
-public:
- explicit TrackPlayerBase();
- virtual ~TrackPlayerBase();
-
- void init(AudioTrack* pat, player_type_t playerType, audio_usage_t usage);
- void destroy();
-
- //IPlayer implementation
- virtual void start();
- virtual void pause();
- virtual void stop();
- virtual void setVolume(float vol);
- virtual void setPan(float pan);
- virtual void setStartDelayMs(int32_t delayMs);
- virtual void applyVolumeShaper(
- const sp<VolumeShaper::Configuration>& configuration,
- const sp<VolumeShaper::Operation>& operation) override;
-
- virtual status_t onTransact(
- uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
-
- //FIXME move to protected field, so far made public to minimize changes to AudioTrack logic
- sp<AudioTrack> mAudioTrack;
-
- //FIXME temporary method while some AudioTrack state is outside of this class
- void reportEvent(player_state_t event);
-
- void setSlPlayerVolume(float vl, float vr);
-
-protected:
- // native interface to AudioService
- android::sp<android::IAudioManager> mAudioManager;
-
- // report events to AudioService
- void servicePlayerEvent(player_state_t event);
- void serviceReleasePlayer();
-
- // player interface ID, uniquely identifies the player in the system
- audio_unique_id_t mPIId;
-
- // Mutex for state reporting
- Mutex mPlayerStateLock;
- player_state_t mLastReportedEvent;
-
- // mutex for IPlayer volume and pan, and SL volume
- Mutex mSettingsLock;
- // volume coming from the SL ES volume API
- float mSlPlayerVolumeL, mSlPlayerVolumeR;
- // volume multipliers coming from the IPlayer volume and pan controls
- float mPanMultiplierL, mPanMultiplierR;
- float mVolumeMultiplierL, mVolumeMultiplierR;
-
- DISALLOW_EVIL_CONSTRUCTORS(TrackPlayerBase);
-};
-
-} // namespace android
-
-#endif /* __ANDROID_TRACK_PLAYER_BASE_H__ */
diff --git a/src/classes.h b/src/classes.h
index 0ce1742..fc64f25 100644
--- a/src/classes.h
+++ b/src/classes.h
@@ -19,7 +19,7 @@
#include "android/CallbackProtector.h"
#include "android/android_Effect.h"
#include "android/android_GenericPlayer.h"
-#include "android/android_TrackPlayerBase.h"
+#include <media/TrackPlayerBase.h>
#include <audiomanager/IAudioManager.h>
#endif