Merge "Extend "media" shell command for volume control"
This commit is contained in:
committed by
Android (Google) Code Review
commit
3e51510960
@@ -64,13 +64,15 @@ public class Media extends BaseCommand {
|
||||
" media dispatch KEY\n" +
|
||||
" media list-sessions\n" +
|
||||
" media monitor <tag>\n" +
|
||||
" media volume [options]\n" +
|
||||
"\n" +
|
||||
"media dispatch: dispatch a media key to the system.\n" +
|
||||
" KEY may be: play, pause, play-pause, mute, headsethook,\n" +
|
||||
" stop, next, previous, rewind, record, fast-forword.\n" +
|
||||
"media list-sessions: print a list of the current sessions.\n" +
|
||||
"media monitor: monitor updates to the specified session.\n" +
|
||||
" Use the tag from list-sessions.\n"
|
||||
" Use the tag from list-sessions.\n" +
|
||||
"media volume: " + VolumeCtrl.USAGE
|
||||
);
|
||||
}
|
||||
|
||||
@@ -92,6 +94,8 @@ public class Media extends BaseCommand {
|
||||
runListSessions();
|
||||
} else if (op.equals("monitor")) {
|
||||
runMonitor();
|
||||
} else if (op.equals("volume")) {
|
||||
runVolume();
|
||||
} else {
|
||||
showError("Error: unknown command '" + op + "'");
|
||||
return;
|
||||
@@ -322,4 +326,10 @@ public class Media extends BaseCommand {
|
||||
System.out.println("***Error listing sessions***");
|
||||
}
|
||||
}
|
||||
|
||||
//=================================
|
||||
// "volume" command for stream volume control
|
||||
private void runVolume() throws Exception {
|
||||
VolumeCtrl.run(this);
|
||||
}
|
||||
}
|
||||
|
||||
178
cmds/media/src/com/android/commands/media/VolumeCtrl.java
Executable file
178
cmds/media/src/com/android/commands/media/VolumeCtrl.java
Executable file
@@ -0,0 +1,178 @@
|
||||
/*
|
||||
**
|
||||
** Copyright 2016, 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.
|
||||
*/
|
||||
|
||||
package com.android.commands.media;
|
||||
|
||||
import android.content.Context;
|
||||
import android.media.AudioManager;
|
||||
import android.media.AudioSystem;
|
||||
import android.media.IAudioService;
|
||||
import android.os.ServiceManager;
|
||||
import android.util.AndroidException;
|
||||
|
||||
import com.android.internal.os.BaseCommand;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.PrintStream;
|
||||
import java.lang.ArrayIndexOutOfBoundsException;
|
||||
|
||||
/**
|
||||
* Command line tool to exercise AudioService.setStreamVolume()
|
||||
* and AudioService.adjustStreamVolume()
|
||||
*/
|
||||
public class VolumeCtrl {
|
||||
|
||||
private final static String TAG = "VolumeCtrl";
|
||||
|
||||
public final static String USAGE = new String(
|
||||
"the options are as follows: \n" +
|
||||
"\t\t--stream STREAM selects the stream to control, see AudioManager.STREAM_*\n" +
|
||||
"\t\t controls AudioManager.STREAM_MUSIC if no stream is specified\n"+
|
||||
"\t\t--index INDEX sets the volume index value\n" +
|
||||
"\t\t--adj DIRECTION adjusts the volume, use raise|same|lower for the direction\n" +
|
||||
"\t\t--show shows the UI during the volume change \n" +
|
||||
"\texamples:\n" +
|
||||
"\t\tadb shell media volume --show --stream 3 --index 11 \n" +
|
||||
"\t\tadb shell media volume --stream 0 --adj lower \n"
|
||||
);
|
||||
|
||||
private final static int VOLUME_CONTROL_MODE_SET = 0;
|
||||
private final static int VOLUME_CONTROL_MODE_ADJUST = 1;
|
||||
|
||||
private final static String ADJUST_LOWER = "lower";
|
||||
private final static String ADJUST_SAME = "same";
|
||||
private final static String ADJUST_RAISE = "raise";
|
||||
|
||||
public static void run(BaseCommand cmd) throws Exception {
|
||||
//----------------------------------------
|
||||
// Default parameters
|
||||
int stream = AudioManager.STREAM_MUSIC;
|
||||
int volIndex = 5;
|
||||
int mode = VOLUME_CONTROL_MODE_SET;
|
||||
int adjDir = AudioManager.ADJUST_RAISE;
|
||||
boolean showUi = false;
|
||||
|
||||
//----------------------------------------
|
||||
// read options
|
||||
String option;
|
||||
String adjustment = null;
|
||||
while ((option = cmd.nextOption()) != null) {
|
||||
switch (option) {
|
||||
case "--show":
|
||||
showUi = true;
|
||||
break;
|
||||
case "--set":
|
||||
mode = VOLUME_CONTROL_MODE_SET;
|
||||
log(LOG_V, "will set volume");
|
||||
break;
|
||||
case "--adjust":
|
||||
mode = VOLUME_CONTROL_MODE_ADJUST;
|
||||
log(LOG_V, "will adjust volume");
|
||||
break;
|
||||
case "--stream":
|
||||
stream = Integer.decode(cmd.nextArgRequired()).intValue();
|
||||
log(LOG_V, "will control stream=" + stream + " (" + streamName(stream) + ")");
|
||||
break;
|
||||
case "--index":
|
||||
volIndex = Integer.decode(cmd.nextArgRequired()).intValue();
|
||||
mode = VOLUME_CONTROL_MODE_SET;
|
||||
log(LOG_V, "will set volume to index=" + volIndex);
|
||||
break;
|
||||
case "--adj":
|
||||
mode = VOLUME_CONTROL_MODE_ADJUST;
|
||||
adjustment = cmd.nextArgRequired();
|
||||
log(LOG_V, "will adjust volume");
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("Unknown argument " + option);
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------
|
||||
// Read options: validation
|
||||
if (mode == VOLUME_CONTROL_MODE_ADJUST) {
|
||||
if (adjustment == null) {
|
||||
cmd.showError("Error: no valid volume adjustment (null)");
|
||||
return;
|
||||
}
|
||||
switch (adjustment) {
|
||||
case ADJUST_RAISE: adjDir = AudioManager.ADJUST_RAISE; break;
|
||||
case ADJUST_SAME: adjDir = AudioManager.ADJUST_SAME; break;
|
||||
case ADJUST_LOWER: adjDir = AudioManager.ADJUST_LOWER; break;
|
||||
default:
|
||||
cmd.showError("Error: no valid volume adjustment, was " + adjustment
|
||||
+ ", expected " + ADJUST_LOWER + "|" + ADJUST_SAME + "|"
|
||||
+ ADJUST_RAISE);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// Test initialization
|
||||
log(LOG_V, "Connecting to AudioService");
|
||||
IAudioService audioService = IAudioService.Stub.asInterface(ServiceManager.checkService(
|
||||
Context.AUDIO_SERVICE));
|
||||
if (audioService == null) {
|
||||
System.err.println(BaseCommand.NO_SYSTEM_ERROR_CODE);
|
||||
throw new AndroidException(
|
||||
"Can't connect to audio service; is the system running?");
|
||||
}
|
||||
|
||||
if (mode == VOLUME_CONTROL_MODE_SET) {
|
||||
if ((volIndex > audioService.getStreamMaxVolume(stream))
|
||||
|| (volIndex < audioService.getStreamMinVolume(stream))) {
|
||||
cmd.showError(String.format("Error: invalid volume index %d for stream %d "
|
||||
+ "(should be in [%d..%d])", volIndex, stream,
|
||||
audioService.getStreamMinVolume(stream),
|
||||
audioService.getStreamMaxVolume(stream)));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
// Non-interactive test
|
||||
final int flag = showUi? AudioManager.FLAG_SHOW_UI : 0;
|
||||
final String pack = cmd.getClass().getPackage().getName();
|
||||
if (mode == VOLUME_CONTROL_MODE_SET) {
|
||||
audioService.setStreamVolume(stream, volIndex, flag, pack/*callingPackage*/);
|
||||
} else if (mode == VOLUME_CONTROL_MODE_ADJUST) {
|
||||
audioService.adjustStreamVolume(stream, adjDir, flag, pack);
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------
|
||||
// Utilities
|
||||
|
||||
static final String LOG_V = "[v]";
|
||||
static final String LOG_W = "[w]";
|
||||
static final String LOG_OK = "[ok]";
|
||||
|
||||
static void log(String code, String msg) {
|
||||
System.out.println(code + " " + msg);
|
||||
}
|
||||
|
||||
static String streamName(int stream) {
|
||||
try {
|
||||
return AudioSystem.STREAM_NAMES[stream];
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
return "invalid stream";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user