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
 
