FM点击关机按钮的时候:
FMplay.java :
public boolean onCheckedChanged(View view, boolean checked) {
switch(view.getId()) {
case R.id.power_toggle:
Log.d("yzy","onCheckedChanged");
if (checked) {
ismPhoneStateListener = false;
mPhone = true;
mHandler.sendEmptyMessage(MSG_OPEN);
} else if (mService.isFmOn()){
ismPhoneStateListener = true;
mHandler.removeMessages(MSG_ABLED);
mHandler.sendEmptyMessage(MSG_CLOSE);
closeAudioPipe();
}
break;
Handler:
case MSG_CLOSE:
Log.d("yzy", "FMplay:fmOff");
removeMessages(MSG_CLOSE);
if (mReady) {
if(StationSearch.isSearching()){
StationSearch.mSearcher.stopSearching();
try {
StationSearch.mSearcher.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (mService.isFmOn()) {
mService.fmOff();
}
if(msg.getData().containsKey(KEY_CLOSE_REASON)){
Toast.makeText(FMPlay.this, msg.getData()
.getString(KEY_CLOSE_REASON), Toast.LENGTH_LONG).show();
}
if(routeDevices == 1){
audiodevices = true;
}
setUiPower(false, false);
} else {
Message message = mHandler.obtainMessage(MSG_CLOSE);
sendMessageDelayed(message, CHECK_DELAY);
}
break;
FMplayService.java
public boolean fmOff() {
Log.d(LOGTAG, "fmOff");
Log.d("yzy", "FMplayService:fmOff");
mNeedShutdown = false;
if (mReceiver != null) {
mReceiver.disable();
mReceiver.release();
}
stopNotification();
AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
am.abandonAudioFocus(mAudioFocusListener);
return true;
}
framework/base/core/java/android/hardware/fmradio/FmRxControls.java
/*
* Turn off FM Rx/Tx
*/
public void fmOff(int fd){
FmReceiverJNI.setControlNative(fd, V4L2_CID_PRIVATE_TAVARUA_STATE, 0 );
}
frameworks/base/core/jni/android_hardware_fm.cpp
static jint android_hardware_fmradio_FmReceiverJNI_setControlNative
(JNIEnv * env, jobject thiz, jint fd, jint id, jint value)
{
int err = -1;
switch(id) {
case V4L2_CID_PRIVATE_TAVARUA_STATE:
{
err = ioctl(fd, FM_IOCTL_ENABLE, &value);
}
break;
case V4L2_CID_AUDIO_VOLUME:
{
gVolume = value;
err = ioctl(fd, FM_IOCTL_SET_VOLUME, &value);
}
break;
case V4L2_CID_AUDIO_MUTE:
{
if (value == 0) {
err = ioctl(fd, FM_IOCTL_SET_VOLUME, &gVolume);
} else {
int volume = -1;
err = ioctl(fd, FM_IOCTL_GET_VOLUME, &volume);
if (err >= 0) {
gVolume = volume;
volume = 0;
err = ioctl(fd, FM_IOCTL_SET_VOLUME, &volume);
}
}
}
break;
}
V4L2(video for Linux 2)驱动
V4L2(video for linux) 可以支持多种设备,它可以有以下5种接口:
1、视频采集接口(video capture interface):这种应用的设备可以是高频头或者摄像头.V4L2的最初设计就是应用于这种功能的.下面也是着重讲解这种应用;
2、视频输出接口(video output interface):可以驱动计算机的外围视频图像设备——像可以输出电视信号格式的设备;
3、直接传输视频接口(video overlay interface):它的主要工作是把从视频采集设备采集过来的信号直接输出到输出设备之上,而不用经过系统的CPU;
4、视频间隔消隐信号接口(VBI interface):它可以使应用可以访问传输消隐期的视频信号;
5、收音机接口(radio interface):可用来处理从AM或FM高频头设备接收来的音频流;
V4L2驱动的主要功能是使程序有发现设备的能力和操作设备.它主要是用过一系列的回调函数来实现这些功能.像设置高频头的频率,帧频,视频压缩格式和图像像参数等等.
分享到:
相关推荐
`/Zc:wchar_t` 确保`wchar_t`是原生类型,而不是简单地作为`int`的别名。`/Za` 禁用语言扩展,使得代码更符合ANSI C++标准。 八、模块和预编译头 `/Fm` 生成映射文件,记录段的内存位置。`/Yc` 用于创建预编译...
【知识点详解】 1. **Electron框架**: Electron是GitHub推出的一个开源框架,用于构建跨平台的桌面应用程序。它结合了Chromium(Google Chrome浏览器的渲染引擎)和Node.js,使得开发者可以用HTML、CSS和...
《使用Appcelerator Titanium开发iOS版CUAC FM应用详解》 在移动应用开发领域,JavaScript以其易学性和灵活性,已经成为跨平台开发的重要工具之一。本文将深入探讨如何使用Appcelerator Titanium这一基于JavaScript...
### 修改和定制Android...通过对Android原生音频策略的修改和定制,可以有效地解决这些问题,为用户提供更加丰富和个性化的音频体验。随着技术的进步和市场需求的变化,未来车载导航仪的音频策略还将持续进化和发展。
- **使用原生打包工具**:例如使用`Native-image`等工具,可以将JAR包转换为原生可执行文件,通常可以显著提升启动速度。 - **清单文件优化**:在清单文件中合理设置`Main-Class`和`Class-Path`等属性,避免不必要...
- 下载Android源代码:可以从AOSP(Android Open Source Project)官方仓库获取最新的源代码。 - 准备开发环境:包括编译工具链、交叉编译环境等。 - 获取MOTO A1200的硬件规格和技术文档。 2. **修改或编写驱动...
1. **Sony Ericsson T707**:这是一款由Sony Ericsson制造的时尚翻盖手机,发布于2009年,主要特点包括3.2英寸显示屏、320万像素摄像头、蓝牙和FM收音机等功能。 2. **TPA文件格式**:TPA是Sony Ericsson手机固件...
**AdPlug 开源库详解** AdPlug 是一个强大的开源项目,致力于实现跨平台的 OPL2 音频播放器库。这个库的核心功能是播放那些最初设计为在 AdLib(OPL2)音频板上播放的音乐。AdLib,全称Oakwood Polynomial Logic,...
### HTC系统程序可删列表详解 #### 概述 在Android设备中,为了实现系统精简,提升设备性能,很多用户会寻求通过删除不必要的预装应用程序来“瘦身”。特别是对于那些不再使用的应用或认为没有必要存在的功能,...
【华硕F1A55主板BIOS驱动程序详解】 华硕F1A55主板是基于AMD A55芯片组设计的一款主板,专为搭配AMD Socket FM1接口的APU处理器而设计。BIOS(Basic Input/Output System)是主板上的一个重要组成部分,负责在...