/* * Copyright (C) 2016 Haruki Hasegawa * * 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 com.h6ah4i.android.media.hybrid; import android.content.Context; import com.h6ah4i.android.media.IBasicMediaPlayer; import com.h6ah4i.android.media.IMediaPlayerFactory; import com.h6ah4i.android.media.audiofx.IBassBoost; import com.h6ah4i.android.media.audiofx.IEnvironmentalReverb; import com.h6ah4i.android.media.audiofx.IEqualizer; import com.h6ah4i.android.media.audiofx.IHQVisualizer; import com.h6ah4i.android.media.audiofx.ILoudnessEnhancer; import com.h6ah4i.android.media.audiofx.IPreAmp; import com.h6ah4i.android.media.audiofx.IPresetReverb; import com.h6ah4i.android.media.audiofx.IVirtualizer; import com.h6ah4i.android.media.audiofx.IVisualizer; import com.h6ah4i.android.media.opensl.OpenSLMediaPlayer; import com.h6ah4i.android.media.opensl.OpenSLMediaPlayerContext; import com.h6ah4i.android.media.opensl.audiofx.OpenSLHQEqualizer; import com.h6ah4i.android.media.opensl.audiofx.OpenSLHQVisualizer; import com.h6ah4i.android.media.opensl.audiofx.OpenSLPreAmp; import com.h6ah4i.android.media.opensl.audiofx.OpenSLVisualizer; import com.h6ah4i.android.media.standard.audiofx.StandardBassBoost; import com.h6ah4i.android.media.standard.audiofx.StandardEnvironmentalReverb; import com.h6ah4i.android.media.standard.audiofx.StandardEqualizer; import com.h6ah4i.android.media.standard.audiofx.StandardLoudnessEnhancer; import com.h6ah4i.android.media.standard.audiofx.StandardPresetReverb; import com.h6ah4i.android.media.standard.audiofx.StandardVirtualizer; public class HybridMediaPlayerFactory implements IMediaPlayerFactory { private Context mContext; private OpenSLMediaPlayerContext mMediaPlayerContext; public HybridMediaPlayerFactory(Context context) { mContext = context; mMediaPlayerContext = new OpenSLMediaPlayerContext(context, getDefaultContextParams()); } public HybridMediaPlayerFactory(Context context, OpenSLMediaPlayerContext.Parameters params) { mContext = context; mMediaPlayerContext = new OpenSLMediaPlayerContext(context, params); } public OpenSLMediaPlayerContext getOpenSLMediaPlayerContext() { return mMediaPlayerContext; } @Override public void release() throws IllegalStateException, UnsupportedOperationException { if (mMediaPlayerContext != null) { mMediaPlayerContext.release(); mMediaPlayerContext = null; } mContext = null; } @Override public IBasicMediaPlayer createMediaPlayer() throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { return new OpenSLMediaPlayer(getOpenSLMediaPlayerContext(), getMediaPlayerOptions()); } @Override public IBassBoost createBassBoost(int audioSession) throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { return onCreateBassBoost(audioSession); } @Override public IBassBoost createBassBoost(IBasicMediaPlayer player) throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { checkIsOpenSLMediaPlayer(player); return onCreateBassBoost((OpenSLMediaPlayer) player); } @Override public IEqualizer createEqualizer(int audioSession) throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { return onCreateEqualizer(audioSession); } @Override public IEqualizer createEqualizer(IBasicMediaPlayer player) throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { checkIsOpenSLMediaPlayer(player); return onCreateEqualizer((OpenSLMediaPlayer) player); } @Override public IVirtualizer createVirtualizer(int audioSession) throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { return onCreateVirtualizer(audioSession); } @Override public IVirtualizer createVirtualizer(IBasicMediaPlayer player) throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { checkIsOpenSLMediaPlayer(player); return onCreateVirtualizer((OpenSLMediaPlayer) player); } @Override public IVisualizer createVisualizer(int audioSession) throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { return onCreateVisualizer(audioSession); } @Override public IVisualizer createVisualizer(IBasicMediaPlayer player) throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { checkIsOpenSLMediaPlayer(player); return onCreateVisualizer((OpenSLMediaPlayer) player); } @Override public ILoudnessEnhancer createLoudnessEnhancer(int audioSession) throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { return onCreateLoudnessEnhancer(audioSession); } @Override public ILoudnessEnhancer createLoudnessEnhancer(IBasicMediaPlayer player) throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { checkIsOpenSLMediaPlayer(player); return onCreateLoudnessEnhancer((OpenSLMediaPlayer) player); } @Override public IPresetReverb createPresetReverb() throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { return onCreatePresetReverb(); } @Override public IEnvironmentalReverb createEnvironmentalReverb() throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { return onCreateEnvironmentalReverb(); } @Override public IEqualizer createHQEqualizer() throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { return onCreateHQEqualizer(); } @Override public IHQVisualizer createHQVisualizer() throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { return onCreateHQVisualizer(); } @Override public IPreAmp createPreAmp() throws IllegalStateException, IllegalArgumentException, UnsupportedOperationException { return onCreatePreAmp(); } protected StandardBassBoost onCreateBassBoost(int audioSession) { return new StandardBassBoost(0, audioSession); } protected StandardBassBoost onCreateBassBoost(OpenSLMediaPlayer player) { return new StandardBassBoost(0, player.getAudioSessionId()); } protected StandardVirtualizer onCreateVirtualizer(int audioSession) { return new StandardVirtualizer(0, audioSession); } protected StandardVirtualizer onCreateVirtualizer(OpenSLMediaPlayer player) { return new StandardVirtualizer(0, player.getAudioSessionId()); } protected StandardEqualizer onCreateEqualizer(int audioSession) { return new StandardEqualizer(0, audioSession); } protected StandardEqualizer onCreateEqualizer(OpenSLMediaPlayer player) { return new StandardEqualizer(0, player.getAudioSessionId()); } protected OpenSLVisualizer onCreateVisualizer(int audioSession) { return new OpenSLVisualizer(getOpenSLMediaPlayerContext()); } protected OpenSLVisualizer onCreateVisualizer(OpenSLMediaPlayer player) { return new OpenSLVisualizer(getOpenSLMediaPlayerContext()); } protected StandardLoudnessEnhancer onCreateLoudnessEnhancer(int audioSession) { final StandardLoudnessEnhancer effect = new StandardLoudnessEnhancer(audioSession); if (effect == null) { throw new UnsupportedOperationException("StandardLoudnessEnhancer is not supported"); } return effect; } protected StandardLoudnessEnhancer onCreateLoudnessEnhancer(OpenSLMediaPlayer player) { final StandardLoudnessEnhancer effect = new StandardLoudnessEnhancer(player.getAudioSessionId()); if (effect == null) { throw new UnsupportedOperationException("StandardLoudnessEnhancer is not supported"); } return effect; } protected StandardPresetReverb onCreatePresetReverb() { // NOTE: Auxiliary effects can be created for session 0 only return new StandardPresetReverb(0, 0); } protected StandardEnvironmentalReverb onCreateEnvironmentalReverb() { // NOTE: Auxiliary effects can be created for session 0 only return new StandardEnvironmentalReverb(0, 0); } protected OpenSLHQEqualizer onCreateHQEqualizer() { return new OpenSLHQEqualizer(getOpenSLMediaPlayerContext()); } protected OpenSLHQVisualizer onCreateHQVisualizer() { return new OpenSLHQVisualizer(getOpenSLMediaPlayerContext()); } protected OpenSLPreAmp onCreatePreAmp() { return new OpenSLPreAmp(getOpenSLMediaPlayerContext()); } protected int getMediaPlayerOptions() { return OpenSLMediaPlayer.OPTION_USE_FADE; } protected static void checkIsOpenSLMediaPlayer(IBasicMediaPlayer player) { if (player == null) throw new IllegalArgumentException("The argument 'player' is null"); if (!(player instanceof OpenSLMediaPlayer)) throw new IllegalArgumentException("The player is not instance of OpenSLMediaPlayer"); } protected int getDefaultContextOptions() { int options = 0; options |= OpenSLMediaPlayerContext.OPTION_USE_VISUALIZER; options |= OpenSLMediaPlayerContext.OPTION_USE_HQ_EQUALIZER; options |= OpenSLMediaPlayerContext.OPTION_USE_PREAMP; options |= OpenSLMediaPlayerContext.OPTION_USE_HQ_VISUALIZER; return options; } protected OpenSLMediaPlayerContext.Parameters getDefaultContextParams() { final OpenSLMediaPlayerContext.Parameters params = new OpenSLMediaPlayerContext.Parameters(); // override parameters params.sinkBackEndType = OpenSLMediaPlayerContext.SINK_BACKEND_TYPE_AUDIO_TRACK; params.options = getDefaultContextOptions(); // FYI: Specify these options to get the best quality & result // // params.resamplerQuality = // OpenSLMediaPlayerContext.RESAMPLER_QUALITY_HIGH; // params.hqEqualizerImplType = // OpenSLMediaPlayerContext.HQ_EQUALIZER_IMPL_FLAT_GAIN_RESPONSE; return params; } }