如何dump audio資料定位雜音問題
我們在分析雜音等問題的時候, 只抓adb log是不夠的, dump audio的資料能直觀快速的判斷是哪一塊出了問題, 這裡只針對高通平臺。
1. dump audioflinger的資料
/frameworks/av/services/audioflinger/Tracks.cpp#getNextBuffer
// AudioBufferProvider interface
status_t AudioFlinger::PlaybackThread::Track::getNextBuffer(
AudioBufferProvider::Buffer* buffer)
{
ServerProxy::Buffer buf;
size_t desiredFrames = buffer->frameCount;
buf.mFrameCount = desiredFrames;
status_t status = mServerProxy->obtainBuffer(&buf);
buffer->frameCount = buf.mFrameCount;
buffer->raw = buf.mRaw;
if (buf.mFrameCount == 0) {
mAudioTrackServerProxy->tallyUnderrunFrames(desiredFrames);
} else {
mAudioTrackServerProxy->tallyUnderrunFrames(0);
}
//JaychouNote: dump audio flinger data begin.
int tmpFd = ::open("/data/misc/audio/dumpTrack.pcm", O_CREAT | O_WRONLY | O_APPEND, 0777);
if ( tmpFd < 0 ) {
ALOGE("Tracks.cpp Fail to open dumpTrack file");
} else {
::write(tmpFd, buffer->raw, buffer->frameCount * TrackBase::mChannelCount * 2);
::close(tmpFd);
}
//JaychouNote: dump audio flinger data end.
return status;
}
2. dump hal層的資料
/hardware/qcom/audio/hal/audio_hw.c#out_write
static ssize_t out_write(struct audio_stream_out *stream, const void *buffer,size_t bytes)
{
struct stream_out *out = (struct stream_out *)stream;
struct audio_device *adev = out->dev;
ssize_t ret = 0;
......
} else {
if (out->pcm) {
if (out->muted)
memset((void *)buffer, 0, bytes);
ALOGVV("%s: writing buffer (%d bytes) to pcm device", __func__, bytes);
//JaychouNote: dump hal data begin.
int tmpFd = open("/data/misc/audio/dumpTrack_hal.pcm", O_CREAT | O_WRONLY | O_APPEND, 0777);
if ( tmpFd < 0 ) {
ALOGE("Fail to open dumpTrack_hal file");
} else {
write(tmpFd, buffer, bytes);
close(tmpFd);
}
//JaychouNote: dump hal data end.
if (adev->adm_request_focus)
adev->adm_request_focus(adev->adm_data, out->handle);
if (out->usecase == USECASE_AUDIO_PLAYBACK_AFE_PROXY) {
ret = pcm_mmap_write(out->pcm, (void *)buffer, bytes);
}
else
ret = pcm_write(out->pcm, (void *)buffer, bytes);
if (ret == 0)
out->written += bytes / (out->config.channels * sizeof(short));
if (adev->adm_abandon_focus)
adev->adm_abandon_focus(adev->adm_data, out->handle);
}
}
exit:
pthread_mutex_unlock(&out->lock);
if (ret != 0) {
if (out->pcm)
ALOGE("%s: error %zu - %s", __func__, ret, pcm_get_error(out->pcm));
out_standby(&out->stream.common);
usleep(bytes * 1000000 / audio_stream_out_frame_size(stream) /
out_get_sample_rate(&out->stream.common));
}
return bytes;
}
3. 用Audacity分析dump出來的資料
用Audacity來聽dump出來的資料. 這裡聽hal的資料:
這裡聽到是正常的話, 就說明是DSP的問題了, 如果有問題, 說明雜音在AP層就出現了.
這裡聽到Hal層的資料是正常的,所以就要往驅動層去分析了。
用QXDM抓取log, 再用QCAT解析, 發現0x1531的資料聽到了雜音, 也就是在 DSP的ADM出了問題。
相關文章
- 如何解決直播中雜音、噪音和回聲問題 | 直播疑難雜症安排
- [SceneKit專題]17-Audio音訊音訊
- 執行緒安全引起的錄音雜音電流音問題執行緒
- dump 解決問題
- 如何定位瀏覽器卡死問題瀏覽器
- 問題定位 | XtraBackup 8.0 資料重建避坑事件始末事件
- 如何優雅地定位外網問題?
- EXECL無法開啟,問題定位資料,識別不了
- 如何dump某個表的資料快
- Windows7播放高畫質電影時的爆音雜音問題Windows
- dump資料塊
- MySQL 中如何定位 DDL 被阻塞的問題MySql
- 如何利用執行緒堆疊定位問題執行緒
- 實戰 | Hive 資料傾斜問題定位排查及解決Hive
- 定位和居中問題
- JVM問題定位工具JVM
- MySQL 5.6中如何定位DDL被阻塞的問題MySql
- 如何在 60 秒內去分析和定位問題?
- 基於程式覆蓋資訊的資料庫核心問題定位工具資料庫
- 如何解決大資料安全問題大資料
- 如何解決資料庫配置問題資料庫
- Mysql資料庫是如何通過索引定位資料MySql資料庫索引
- 微信audio音訊不能播放音訊
- ios XCUIElement 元素定位問題iOSUI
- 滑鼠定位問題總結
- 【Mysql】MySQL 5.6中如何定位DDL被阻塞的問題MySql
- 如何定位瀏覽器頁面崩潰的問題瀏覽器
- 在Linux中,mysql的innodb如何定位鎖問題?LinuxMySql
- 曲折的dump匯入及問題分析
- dump表的資料塊
- react 專案 使用react-audio-player,避免chrome無法自動開啟聲音問題ReactChrome
- Flutter Flame教程5 -- Audio 音訊Flutter音訊
- Core Audio音訊基礎概述音訊
- OpenHarmony 3.2 Beta Audio——音訊渲染音訊
- MindSpore模型精度調優實戰:如何更快定位精度問題模型
- 儲存裝置異常告警,如何秒速定位問題?
- OOM分析之問題定位(二)OOM
- 解決高度塌陷、定位問題