Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 是否可以动态链接到libcsd-client.so以在Galaxy S4 I9505上启用通话中语音录制_Android_Audio_Android Ndk_Alsa - Fatal编程技术网

Android 是否可以动态链接到libcsd-client.so以在Galaxy S4 I9505上启用通话中语音录制

Android 是否可以动态链接到libcsd-client.so以在Galaxy S4 I9505上启用通话中语音录制,android,audio,android-ndk,alsa,Android,Audio,Android Ndk,Alsa,I9505在APQ8064T上运行,与上一代MSM8960相比,HAL层在芯片组上设置通话中录音音频路径的方式发生了变化。现在,除了在内核中设置正确的混音器控件外,还需要通过libcsd-client.so(高通公司专有的封闭源代码)库向基带调制解调器发送某种“神奇”命令 Google通过dlsym-libcsd-client.so(参见函数)在HAL层为Nexus4(运行APQ8064)执行此操作。但是,在应用程序级别将AudioRecord API与MediaRecorder.AudioSo

I9505在APQ8064T上运行,与上一代MSM8960相比,HAL层在芯片组上设置通话中录音音频路径的方式发生了变化。现在,除了在内核中设置正确的混音器控件外,还需要通过libcsd-client.so(高通公司专有的封闭源代码)库向基带调制解调器发送某种“神奇”命令

Google通过dlsym-libcsd-client.so(参见函数)在HAL层为Nexus4(运行APQ8064)执行此操作。但是,在应用程序级别将AudioRecord API与MediaRecorder.AudioSource.VOICE_下行链路一起使用将不起作用,因为已硬编码为仅使用通道掩码“AUDIO_channel_in_MONO”或“AUDIO_channel_in_STEREO”的IOProfile,而在通话中的语音录制用例中,正在使用的信道掩码必须是音频信道中的语音上行链路或音频信道中的语音DNLINK。谷歌和三星似乎都无意纠正这个问题。奇怪的是,用于记录调用的公共android API从来都不能保证正常工作

因此,为了克服这个问题,我决定编写一个NDK可执行文件来dlsym csd_start_recording/csd_stop_recording,就像Google为Nexus 4所做的那样,并使用amix/arec实用程序在根设备上进行本机录制。但现在问题来了

在我的可执行文件中,我调用了csd_client_init和csd_start_record,这两个调用都没有返回错误,但logcat显示libcsd-client中出现了一些QMI(Qualcomm MSM Interface)错误。因此,记录的wave文件只有静默。有没有人尝试过类似的事情?我现在完全不知道如何在不将修改过的ROM闪存到设备上的情况下让通话录音正常工作

更新

我再次重复了测试,但似乎QMI错误消失了。我想我上次遇到的QMI错误是因为我在测试期间弄乱了机器的状态。然而,录制仍然不起作用。结果仍然只是沉默。下面是“csd”grep的logcat输出:

PID 217是设备上的原始csd_客户端,PID 6801是我的可执行文件

我的可执行文件执行客户端初始化,并在libcsd-client.so上调用“csd\u start\u recording”。因此,在建立调用后,一起调用。从日志中可以看出,“真正的”csd客户端显然是通过在设备启动时注册一些回调并从那时起调节音频设置来与调制解调器进行双向通信的。例如,“csd_客户端_开始_语音”在呼叫接通时由HAL呼叫。我怀疑我的冒牌csd客户错过了所有这些中间状态,结果,没有达到目的


无论如何,在这个阶段信息是非常有限的,我感觉就像在黑暗中拍摄。希望有人能帮上忙。

我有解决办法。基本上,您必须调用MediaServer,因为除非您是该语音会话的所有者,否则libcsd中的任何东西都不会起作用。avs234.net/temp/csd_calls.c

您在QMI日志中看到了什么?我已确认
csd_客户端服务\u init:无效的接收设备0,设置为手持设备
csd_客户端服务\u init:无效的发送设备0,设置为handset
并不重要,因为由/system/bin/mediaserver初始化的csd客户端在启动时也会发出它们。您确定该设备正在使用您链接到的AudioPolicyManagerBase版本吗?因为它是高通公司的平台,所以它更有可能运行基于的东西。@Michael是的,我想我很确定三星不是基于CodeAurora的
AudioPolicyManagerBase
。相反,我认为他们引用了谷歌git的特定版本,该版本用于Nexus4的实现。我可以肯定地说,因为如果我在音频记录上使用
MediaRecorder.AudioSource.VOICE_DOWNLINK
AudioPolicyManagerBase
会抱怨错误日志说“无法获取输入配置文件…”,它会打印出请求中的频道掩码,该掩码不是CodeAurora上定义的,而是Google源代码中定义的。
D/        (  217): csd_client_disable_device: rx 7, tx 4, client_state=1
E/        (  217): csd_client_disable_device: Disable received in invalid state:1
D/        (  217): csd_client_enable_device: APQ rx 7, tx 34, ec 43, tty 0x10012 state 1
D/        (  217): csd_client_enable_device: Remote rx -1, tx -1
E/        (  217): csd_client_enable_device: Enable received in invalid state 1
D/        (  217): csd_client_start_voice: State 1
D/        (  217): csd_client_async_cb: msg_id 0x33 result 0 error 0
D/        (  217): csd_client_async_cb: msg_id 0x34 result 0 error 0
D/        (  217): csd_client_async_cb: msg_id 0x55 result 0 error 0
D/        (  217): csd_client_async_cb: msg_id 0x5c result 0 error 0
D/        (  217): csd_client_async_cb: msg_id 0x4c result 0 error 0
D/        (  217): csd_client_async_cb: msg_id 0x4c result 0 error 0
D/        (  217): csd_client_async_cb: msg_id 0x57 result 0 error 0
D/        (  217): csd_client_async_cb: msg_id 0x36 result 0 error 0
D/        (  217): csd_client_async_cb: msg_id 0x3e result 0 error 0
D/        (  217): csd_client_async_cb: msg_id 0x36 result 0 error 0
D/        (  217): csd_client_volume: volume 0, state 2, rc 0
D/        (  217): csd_client_async_cb: msg_id 0x37 result 0 error 0
D/        (  217): csd_client_set_rx_mute: mute 0, state 2, rc 0
D/        (  217): csd_client_async_cb: msg_id 0x3e result 0 error 0
D/        (  217): csd_client_mic_mute: mute 0, state 2, rc 0
D/        (  217): csd_client_async_cb: msg_id 0x36 result 0 error 0
D/        (  217): csd_client_volume: volume 4, state 2, rc 0
D/        ( 6801): csd_client_init
E/        ( 6801): csd_client_service_init: Invalid rx device 0, setting to handset
E/        ( 6801): csd_client_service_init: Invalid tx device 0, setting to handset
D/        (  217): csd_client_stop_voice: State 2
D/        (  217): csd_client_async_cb: msg_id 0x58 result 1 error 3
E/        (  217): csd_client_stop_voice: Error -1 stopping voice manager
E/ALSADevice(  217): s_close: csd_client error -1