公司最近让我调整项目(一款android智能机)的开机音量,研究了半天,总结一下方法:
开机音量是一个service播出的。这个service 应该在一个init.rc中:service playsound /system/bin/mplayer ...
于是想到音量的控制可能在这个bin文件中。于是找到bin文件的源码如下mplayer.c:
using namespace android;
#define DEFAULT_PATH_SOUND "/system/media/bootsound.mp3"
#define CTL_USE_FILE_EX_NAME (1 << 0)
static int binder_ipc(void *cookie)
{
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
return 0;
}
static void usage(void)
{
int main(int argc, char *argv[])
{
int arg;
time_t stime;
int ctl = 0;
int seconds_max = 0;
int msecond = 0;
float volume = 100.0f;
int fd = 0;
// static struct timeval tmv;/* = {.tv_sec = 0, .tv_usec = 500*1000}; [luther.gliethttp] */
static char path[512];
while ((arg = getopt(argc, argv, "l:s:v:e")) != EOF) {
switch (arg) {
case 'l': seconds_max = strtol(optarg, NULL, 0); break;
case 's': msecond = strtol(optarg, NULL, 0); break;
case 'v': volume = strtol(optarg, NULL, 0); break;
case 'e': ctl |= CTL_USE_FILE_EX_NAME; break;
default: usage(); return -1; break;
}
}
property_get("sys.mplayer.seconds", path, "0");
arg = strtol(path, NULL, 0);
if (arg != 0 && seconds_max == 0) seconds_max = arg;
property_get("sys.mplayer.volume", path, "100"); //这里是获得系统属性中音量的值,如果没有得到,取默认值100
arg = strtol(path, NULL, 0);
if (arg != 100 && volume == 100) volume = arg;
property_get("sys.mplayer.msecond", path, "0");
arg = strtol(path, NULL, 0);
if (arg != 0 && msecond == 0) msecond = arg;
if (argv[optind] != NULL)
strncpy(path, argv[optind], sizeof path);
else property_get("sys.mplayer.path", path, DEFAULT_PATH_SOUND);
if (seconds_max == 0)
seconds_max = INT_MAX - 50;
if (volume > 100) volume = 100;
volume /= 100.0f; //设置音量的百分比
if ((ctl & CTL_USE_FILE_EX_NAME) == 0) {
fd = open(path, O_RDONLY);
if (fd < 0) {
LOGE("File <%s> is not found.\n", path);
return -1;
}
}
sp<MediaPlayer> mp = new MediaPlayer();
createThreadEtc(binder_ipc, &mp, "mplayer binder ipc");
mp->reset();
if (ctl & CTL_USE_FILE_EX_NAME) {
mp->setDataSource(path, NULL);
} else {
mp->setDataSource(fd, 0, INT_MAX);
close(fd);
}
mp->prepare();
if (msecond) mp->seekTo(msecond);
mp->setVolume(volume, volume); //设置左右声道的音量大小
mp->start();
stime = time(NULL);
// tmv.tv_sec = 0; tmv.tv_usec = 500*1000;
while (mp->isPlaying()) {
sleep(1); // select(0, 0, 0, 0, &tmv);
if (difftime(time(NULL), stime) > seconds_max)
break;
}
mp->stop();
mp->disconnect();
return 0;
}
由于项目中sys.mplayer.volume没有设置,所以在get的时候得到默认值100,造成音量很大。于是在system.prop中添加:
sys.mplayer.volume=50
音量大小变成原来的一半。
这里提供两个方法,动态设置属性大小,方便大家调试用:
在adb shell中
获得属性: getprop sys.mplayer.volume
设置属性:setprop sys.mplayer.volume 50