forked from felixpalmer/android-visualizer
-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement Tunnel Player workaround code
Issue: "Visualization does not work on the new Galaxy devices" felixpalmer#5
- Loading branch information
Showing
4 changed files
with
172 additions
and
0 deletions.
There are no files selected for viewing
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
/** | ||
* Copyright 2013, Haruki Hasegawa | ||
* | ||
* Licensed under the MIT license: | ||
* http://creativecommons.org/licenses/MIT/ | ||
*/ | ||
|
||
/** | ||
* from http://stackoverflow.com/questions/2641111/where-is-android-os-systemproperties | ||
*/ | ||
|
||
package com.pheelicks.utils; | ||
|
||
import java.lang.reflect.Method; | ||
|
||
import android.content.Context; | ||
import android.util.Log; | ||
|
||
public class SystemPropertiesProxy { | ||
private static final String TAG = "SystemPropertiesProxy"; | ||
|
||
/** | ||
* Get the value for the given key, returned as a boolean. Values 'n', 'no', | ||
* '0', 'false' or 'off' are considered false. Values 'y', 'yes', '1', 'true' | ||
* or 'on' are considered true. (case insensitive). If the key does not exist, | ||
* or has any other value, then the default result is returned. | ||
* | ||
* @param key the key to lookup | ||
* @param def a default value to return | ||
* @return the key parsed as a boolean, or def if the key isn't found or is | ||
* not able to be parsed as a boolean. | ||
* @throws IllegalArgumentException if the key exceeds 32 characters | ||
*/ | ||
public static Boolean getBoolean(Context context, String key, boolean def) | ||
throws IllegalArgumentException { | ||
return getBoolean(context.getClassLoader(), key, def); | ||
} | ||
|
||
public static Boolean getBoolean(ClassLoader cl, String key, boolean def) | ||
throws IllegalArgumentException { | ||
|
||
Boolean ret = def; | ||
|
||
try { | ||
@SuppressWarnings("rawtypes") | ||
Class SystemProperties = cl.loadClass("android.os.SystemProperties"); | ||
|
||
// Parameters Types | ||
@SuppressWarnings("rawtypes") | ||
Class[] paramTypes = new Class[2]; | ||
paramTypes[0] = String.class; | ||
paramTypes[1] = boolean.class; | ||
|
||
@SuppressWarnings("unchecked") | ||
Method getBoolean = SystemProperties.getMethod("getBoolean", paramTypes); | ||
|
||
// Parameters | ||
Object[] params = new Object[2]; | ||
params[0] = new String(key); | ||
params[1] = Boolean.valueOf(def); | ||
|
||
ret = (Boolean) getBoolean.invoke(SystemProperties, params); | ||
|
||
} catch (IllegalArgumentException iAE) { | ||
throw iAE; | ||
} catch (Exception e) { | ||
Log.e(TAG, "getBoolean(context, key: " + key + ", def:" + def + ")", e); | ||
ret = def; | ||
} | ||
|
||
return ret; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
/** | ||
* Copyright 2013, Haruki Hasegawa | ||
* | ||
* Licensed under the MIT license: | ||
* http://creativecommons.org/licenses/MIT/ | ||
*/ | ||
|
||
package com.pheelicks.utils; | ||
|
||
import java.io.IOException; | ||
|
||
import android.content.Context; | ||
import android.media.AudioManager; | ||
import android.media.MediaPlayer; | ||
import android.util.Log; | ||
|
||
import com.pheelicks.visualizer.R; | ||
|
||
public class TunnelPlayerWorkaround { | ||
private static final String TAG = "TunnelPlayerWorkaround"; | ||
|
||
private static final String SYSTEM_PROP_TUNNEL_DECODE_ENABLED = "tunnel.decode"; | ||
|
||
private TunnelPlayerWorkaround() | ||
{ | ||
} | ||
|
||
/** | ||
* Obtain "tunnel.decod" system property value | ||
* | ||
* @param context Context | ||
* @return Whether tunnel player is enabled | ||
*/ | ||
public static boolean isTunnelDecodeEnabled(Context context) | ||
{ | ||
return SystemPropertiesProxy.getBoolean( | ||
context, SYSTEM_PROP_TUNNEL_DECODE_ENABLED, false); | ||
} | ||
|
||
/** | ||
* Create silent MediaPlayer instance to avoid tunnel player issue | ||
* | ||
* @param context Context | ||
* @return MediaPlayer instance | ||
*/ | ||
public static MediaPlayer createSilentMediaPlayer(Context context) | ||
{ | ||
boolean result = false; | ||
|
||
MediaPlayer mp = null; | ||
try { | ||
mp = MediaPlayer.create(context, R.raw.workaround_1min); | ||
mp.setAudioStreamType(AudioManager.STREAM_MUSIC); | ||
|
||
// NOTE: start() is no needed | ||
// mp.start(); | ||
|
||
result = true; | ||
} catch (RuntimeException e) { | ||
Log.e(TAG, "createSilentMediaPlayer()", e); | ||
} finally { | ||
if (!result && mp != null) { | ||
try { | ||
mp.release(); | ||
} catch (IllegalStateException e) { | ||
} | ||
} | ||
} | ||
|
||
return mp; | ||
} | ||
} |