当前位置: 首页 > news >正文

公司网站后台维护怎么做/站长工具网站

公司网站后台维护怎么做,站长工具网站,局域网内实现域名访问,网站建设方案流程驱动的同事在声卡的驱动层上做了一个功能, 需要提供一个接口开放给上层调用.每一步都有系统原来的代码作为参考, 添加起来也不算太难, 但是就是太麻烦了, 所以记录一下1驱动: android\hardware\libhardware\include\hardware\audio.h 的audio_hw_device 结构体添加声明:/* mic…

驱动的同事在声卡的驱动层上做了一个功能, 需要提供一个接口开放给上层调用.

每一步都有系统原来的代码作为参考, 添加起来也不算太难, 但是就是太麻烦了, 所以记录一下

1驱动:  android\hardware\libhardware\include\hardware\audio.h 的audio_hw_device 结构体添加声明:

/* mic mute */

int (*set_mic_mute)(struct audio_hw_device *dev, bool state);

int (*get_mic_mute)(const struct audio_hw_device *dev, bool *state);

//lwt

int (*set_vibrator_mode)(struct audio_hw_device *dev, bool state);

int (*get_vibrator_mode)(const struct audio_hw_device *dev, bool* state);

2. android\hardware\aw\audio\audio_hw.c 中添加实现:

static int adev_set_vibrator_mode(struct audio_hw_device *dev, bool state)

{

ALOGD("%s: state %d\n", __func__, state);

struct sunxi_audio_device *adev = (struct sunxi_audio_device *)dev;

//....具体功能略

return 0;

}

static int adev_get_vibrator_mode(const struct audio_hw_device *dev, bool *state)

{

struct sunxi_audio_device *adev = (struct sunxi_audio_device*)dev;

//...具体功能略

ALOGD("adev_get_vibrator_mode, ret:%d", state);

return 0;

}

并且在static int adev_open(const hw_module_t* module, const char* name, hw_device_t** device)函数中添加赋值

adev->device.set_vibrator_mode = adev_set_vibrator_mode;

adev->device.get_vibrator_mode = adev_get_vibrator_mode;

3. \android\frameworks\av\services\audioflinger\AudioFlinger.h 中添加声明:

//lwt

virtual status_t setVibratorMode(bool state);

virtual bool getVibratorMode() const;

android\frameworks\av\services\audioflinger\AudioFlinger.cpp 实现:

//lwt added

status_t AudioFlinger::setVibratorMode(bool state)

{

status_t ret = initCheck();

status_t result = NO_ERROR;

ALOGD("AudioFlinger.cpp, setVibratorMode:%d", state);

if (ret != NO_ERROR) {

return ret;

}

// check calling permissions

if (!settingsAllowed()) {

return PERMISSION_DENIED;

}

AutoMutex lock(mHardwareLock);

mHardwareStatus = AUDIO_HW_SET_MIC_MUTE;

for (size_t i = 0; i < mAudioHwDevs.size(); i++) {

audio_hw_device_t *dev = mAudioHwDevs.valueAt(i)->hwDevice();

if(dev != 0 && dev->set_vibrator_mode != 0)

{

result = dev->set_vibrator_mode(dev, state);

if (result != NO_ERROR) {

ret = result;

}

}

}

mHardwareStatus = AUDIO_HW_IDLE;

return ret;

}

bool AudioFlinger::getVibratorMode() const

{

status_t ret = initCheck();

if (ret != NO_ERROR) {

return false;

}

bool vibStat = true;

AutoMutex lock(mHardwareLock);

for (size_t i = 0; i < mAudioHwDevs.size(); i++) {

audio_hw_device_t *dev = mAudioHwDevs.valueAt(i)->hwDevice();

if(dev != 0 && dev->set_vibrator_mode != 0){

dev->get_vibrator_mode(dev, &vibStat);

}

}

ALOGD("AudioFlinger.cpp, getVibratorMode ret:%d", vibStat);

return vibStat;

}

//lwt added end

4. android\frameworks\av\include\media\IAudioFlinger.h

//lwt added

virtual status_t setVibratorMode(bool state) = 0;

virtual bool getVibratorMode() const = 0;

android\frameworks\av\media\libmedia\IAudioFlinger.cpp : 有三处修改:

1) 代码enum {

CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION,处, 添加枚举:

//lwt added

SET_VIB_MODE,

GET_VIB_MODE,

//lwt added end

2) 类中实现:

virtual status_t setVibratorMode(bool state)

{//lwt added

Parcel data, reply;

ALOGD("IAudioFlinger.cpp setVibratorMode");

data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());

data.writeInt32(state);

remote()->transact(SET_VIB_MODE, data, &reply);

return reply.readInt32();

}

virtual bool getVibratorMode() const

{//lwt added

Parcel data, reply;

ALOGD("IAudioFlinger.cpp getVibratorMode");

data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());

remote()->transact(GET_VIB_MODE, data, &reply);

return reply.readInt32();

}

3) status_t BnAudioFlinger::onTransact 函数中添加消息处理:

case SET_VIB_MODE: {

CHECK_INTERFACE(IAudioFlinger, data, reply);

int state = data.readInt32();

reply->writeInt32( setVibratorMode(state) );

return NO_ERROR;

} break;

case GET_VIB_MODE: {

CHECK_INTERFACE(IAudioFlinger, data, reply);

reply->writeInt32( getVibratorMode() );

return NO_ERROR;

} break;

5. \android\frameworks\av\include\media\AudioSystem.h

//lwt added

static status_t asSetVibratorMode(bool state);

static status_t asIsVibratorMode(bool *state);

\android\frameworks\av\media\libmedia\AudioSystem.cpp

//lwt added

status_t AudioSystem::asSetVibratorMode(bool state)

{

const sp& af = AudioSystem::get_audio_flinger();

if (af == 0) return PERMISSION_DENIED;

ALOGD("AudioSystem.cpp::asSetVibratorMode");

return af->setVibratorMode(state);

}

status_t AudioSystem::asIsVibratorMode(bool* state)

{

const sp& af = AudioSystem::get_audio_flinger();

if (af == 0) return PERMISSION_DENIED;

ALOGD("AudioSystem.cpp::asIsVibratorMode");

*state = af->getVibratorMode();

return NO_ERROR;

}

//lwt added end

6.\android\frameworks\base\core\jni\android_media_AudioSystem.cpp:

//lwt added

static jint

android_media_AudioSystem_asSetVibratorMode(JNIEnv *env, jobject thiz, jboolean on)

{

return (jint) check_AudioSystem_Command(AudioSystem::asSetVibratorMode(on));

}

static jboolean

android_media_AudioSystem_asIsVibratorMode(JNIEnv *env, jobject thiz)

{

bool state = false;

AudioSystem::asIsVibratorMode(&state);

return state;

}

//lwt added end

static const JNINativeMethod gMethods[] 数组中添加:

//lwt added

{"asSetVibratorMode","(Z)I", (void *)android_media_AudioSystem_asSetVibratorMode},

{"asIsVibratorMode", "()Z", (void *)android_media_AudioSystem_asIsVibratorMode},

//lwt added end

7.android\frameworks\base\media\java\android\media\AudioSystem.java:

//lwt added

public static native int asSetVibratorMode(boolean on);

public static native boolean asIsVibratorMode();

//lwt added end

8.\android\frameworks\base\services\core\java\com\android\server\audio\AudioService.java

//lwt added

public void AsSetVibratorMode(boolean on) {

Log.d(TAG, String.format("AudioService.java AsSetVibratorMode val: %s", on));

AudioSystem.asSetVibratorMode(on);

}

public boolean AsGetVibratorMode() {

boolean ret = AudioSystem.asIsVibratorMode();

Log.d(TAG, String.format("AudioService.java AsgetVibratorMode ret: %s", ret));

return ret;

}

//lwt added end

9.android\frameworks\base\media\java\android\media\IAudioService.aidl

//lwt added

void AsSetVibratorMode(boolean on) ;

boolean AsGetVibratorMode();

//lwt added end

10. \android\frameworks\base\media\java\android\media\AudioManager.java

//lwt added

public void AmSetVibratorMode(boolean on) {

IAudioService service = getService();

try {

Log.d(TAG, "AmSetVibratorMode:"+on);

service.AsSetVibratorMode(on);

} catch (RemoteException e) {

throw e.rethrowFromSystemServer();

}

}

public boolean AmGetVibratorMode() {

IAudioService service = getService();

boolean ret = false;

try {

ret = service.AsGetVibratorMode();

Log.d(TAG, "AmGetVibratorMode ret:"+ret);

} catch (RemoteException e) {

throw e.rethrowFromSystemServer();

}

return ret;

}

//lwt added end

11. 至此, 整个从上到下的通道就打通了.  使用:

AudioManager mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);;

mAudioManager.AmSetVibratorMode(true);

boolean ret = mAudioManager.AmGetVibratorMode();

12. 注意的地方: 因为修改了AudioManager 的对外接口, 所以需要在android 目录下执行  make update-api 命令, 来更新/frameworks/base/api/下面三个文件:

current.txt            system-current.txt         test-current.txt

标签:added,return,AudioManager,state,lwt,android8.1,bool,AudioService,android

来源: https://blog.csdn.net/liwentang12/article/details/100562141

http://www.lbrq.cn/news/1537561.html

相关文章:

  • 移动网站打不开/搜索引擎优化的办法有哪些
  • 婚纱摄影网站建设方案/竞价托管的注意事项
  • 给公司做网站/找关键词的三种方法
  • 网站静态化设计/电商平台链接怎么弄
  • 做网站有什么框架/网络营销策划方案怎么写
  • 深圳设计网站推荐/360优化大师app
  • access做网站数据方法/营销一体化平台
  • 哪个网站做的系统好/杭州云优化信息技术有限公司
  • 山东网站建设哪家公司好/seo培训学院
  • 哪个网站有ae免费模板/百度官网认证多少钱
  • 凡科建设网站安全吗/seo日常工作都做什么的
  • 音视频娱乐网站开发商/营销型网站建设方案
  • 网站代码修改/网络营销整合推广
  • 网站换名称域名/产品推广ppt范例
  • 郑州网站建设九零后/优化大师客服
  • 帮别人做网站犯法吗/网站百度权重
  • 什么样的网站流量容易做/帮我搜一下长沙做网络销售
  • 租外国服务器做的网站要备案吗/广东全网推广
  • 东莞网站设计哪家强/西安seo和网络推广
  • 郑州网站建设喝彩科技/百度手机助手下载安装
  • 电子商务网站设计与管理/网络营销是以什么为中心
  • 建设银行官方招聘网站/百度关键词的费用是多少
  • 版面设计图/seo点击软件手机
  • wordpress 极验/网站seo视频教程
  • 本地做网站顺序/网络seo是什么意思
  • 做网站只解析www的会怎么样/廊坊网站建设优化
  • 东莞网站建设方案推广/广州网站建设
  • 小众电商平台/白杨seo教程
  • 风景区网站建设项目建设可行性/教程seo推广排名网站
  • 驻马店360网站建设/什么是搜索引擎竞价推广
  • 基础笔记8.20
  • PowerShell脚本检查业务健康状态
  • 10M25DCF484C8G Altera FPGA MAX10
  • 基于提示词工程和MCP构建垂直Agent应用
  • 2943. 最大化网格图中正方形空洞的面积
  • 大模型 + 垂直场景:搜索/推荐/营销/客服领域开发新范式与技术实践