音乐盒子mplayer问题review
背景:实现全志R16-linux开发板上的mplayer的调试
一、mplayer软件架构:

这里详细介绍了alsa的相关知识
二、问题解决1:播放卡顿
0.问题描述:播放过程中会突然发生卡顿,就是感觉声音突然快进了似的。
1.mplayer.c中的调用了fill_audio_out_buffers 这个函数:
这个代码主要是两个while循环:
循环1:while(1)这一部分主要是通过get_space()函数获取需要写的字节数,一直填充,直到其数值大于outburst才停止。这里还根据数据的大小算出sleep的时间,防止占用cpu过多。
循环2:while(bytes_to_write)这个地方根据上面的值进行数据的填充。

2.其中调用了get_space()这个函数
这里面调用了很多alsa驱动的函数。
snd_pcm_status_get_avail 来获取当前驱动缓冲区中可用的帧数。
就是这个函数主要是来从buffer中拿出一个帧的长度,如果buffer不够一针,就拿出那么多,如果超过了一针,那么久取出一针的长度。
ret = snd_pcm_status_get_avail(status) * bytes_per_sample;
// printf("aaa:buf=%d\n", ao_data.buffersize); // always 88200
// printf("aaa:bpS=%d\n", bytes_per_sample); // always 4
if (ret > ao_data.buffersize/){ // Buffer underrun?
// printf("aaa:ret\n");
ret = ao_data.buffersize; // never
}
// printf("aaa:getSpace=%d\n", ret); // 88200 when cracking
return ret;
音乐播放buffer层次:
三层buffer:应用程序buffer(mplayer使用的buffer)、alsa驱动buffer(ring uffer)、硬件buffer。
数据在这三层buffer中传输,
playsize = mpctx->audio_out->play(sh_audio->a_out_buffer, playsize, playflags);
这里需要打印一下看看到底每次传的一样吗?
问题分析:
猜测:有hw:0,0 只能write 8的倍数的数据,default数据则是随便的,需要实验验证一下。
暂时结论就是,由于每次都是好像跳过了一针,推测是因为写的时候把之前的buffer覆盖了,导致丢帧了。因为没有用HW:0,0导致写的时候不是8的倍数,
解决:扩大buffer,让后面的不能追上前面的。
https://blog.csdn.net/kickxxx/article/details/8291598
三、问题解决2:播放器有哒哒哒的声音:
下面是开发板开机的一个启动脚本,经过定位发现是加载一个gpio_key的时候会发生哒哒哒的声音。

因为加载的事案件驱动,尝试按了一下案件,发现只要按一下案件,就不会有噪声了。
首先看问题驱动的源码

(需要继续看一下源码更新一下)
二、问题解决3:音乐采样率和DAC采样率不匹配
void dsp_init(int sample_rate)
{
int fd;
int ret; //DSP start
long data = ;
fd = open("/dev/gpio_ctl_dsp",O_RDWR);
if(fd < ){
printf("cant't open the dsp device\n");
return -;
}
switch(sample_rate)
{
case :ret = ioctl(fd,SA441K,data);break;
case :ret = ioctl(fd,SA882K,data);break;
case :ret = ioctl(fd,SA1764K,data);break;
case :ret = ioctl(fd,SA48K,data);break;
case :ret = ioctl(fd,SA96K,data);break;
case :ret = ioctl(fd,SA192K,data);break;
default:break;
}
if(ret == )
close(fd);
//DSP end //DAC start
char buf[];
int regaddr, slaveaddr;
slaveaddr = 0x10;
regaddr = 0x00;
fd = open("/dev/i2c-2",O_RDWR);
if(fd < ){
printf("#########open i2c failed########\n");
return -;
}
ioctl(fd,I2C_TENBIT,);
ioctl(fd,I2C_SLAVE,slaveaddr);
buf[] = 0x07;
buf[] = 0x12;
buf[] = 0x00;
buf[] = 0xF9;
buf[] = 0xF9;
buf[] = 0x00;
buf[] = 0x00;
buf[] = 0x03;
buf[] = 0x01;
buf[] = 0x00;
buf[] = 0x0D;
buf[] = 0x0C;
buf[] = 0x00;
buf[] = 0x00;
buf[] = 0x50;
buf[] = 0xFF;
buf[] = 0xFF;
ret = iic_write(fd, buf, regaddr, );
if(ret > ){
;
}
close(fd);
//DAC end return ; }
音乐盒子mplayer问题review的更多相关文章
- html5——3D案例(音乐盒子、百度钱包)
1.音乐盒子:触碰盒子,盖子会打开 2.百度钱包:触碰钱包,钱包,会180度旋转 <!DOCTYPE html> <html lang="en"> < ...
- 我的音乐盒子(nodejs7 + koa2 + vue + vuex + vue-router)
你们知道的,nodejs对jser来说,是个好东西,快快的,自从接触nodejs后,总想弄点东西. 这弄个啥了,一天打开百度音乐盒,哟,自己弄一个如何了,好啊好啊. 后台: nodejs 7 + ko ...
- python 简易音乐盒子
#!/usr/bin/env python#-*- coding:utf-8 -*- from Tkinter import *import tkMessageBoximport urllib def ...
- Android Service AIDL 远程调用服务 【简单音乐播放实例】
Android Service是分为两种: 本地服务(Local Service): 同一个apk内被调用 远程服务(Remote Service):被另一个apk调用 远程服务需要借助AIDL来完成 ...
- 使用 原生js 制作插件 (javaScript音乐播放器)
1.引用页面 index.html <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- Archlinux添加MP3播放器
方法1: # pacman -S mplayer From: http://www.linuxdiyf.com/viewarticle.php?id=89207 用mplayer循环播放音乐:mpla ...
- Android_通过传感器抓小偷
package com.beyond.phonestolen; import android.hardware.Sensor; import android.hardware.SensorEvent; ...
- jQuery分析(3) - jQuery.fn.init
1.前言 上一篇jQuery分析(2)中了解了jQuery库的骨架实现原理,这就好比摇滚音乐,摇滚音乐不是某种音乐他就像一个音乐盒子,里面包含了各种不同的摇滚风格(山地.朋克.乡村.流行.硬摇.金属. ...
- 2019 Valentine's Day 圣地巡礼和WPR003N开箱刷U-boot记录
即兴打出这个标题,似乎性息量有点大,后面的内容真的和你想象的是一样的吗? 自上一篇blog告别这里有多少年了,掐指一算,今天是一个回归的日子,看着这里搭上云之路,渐渐的变成了云主机中的一员,感慨时事境 ...
随机推荐
- 最近更新电脑管家开机速度约慢很多木有?$计算机管理-废话$.qmgc
最近更新电脑管家开机速度约慢很多木有? 一旦开机速度是几十秒,由于前几天更新电脑管家,大约几十秒钟成为一个点开机时间! 同样在一个多垃圾清理桌面图标! 右键菜单也看不到属性 须要到下面位置查看: wa ...
- Scala Control Structures
Scala之Control Structures 一.前言 前面学习了Scala的Numbers,接着学习Scala的Control Structures(控制结构). 二.Control Struc ...
- php+mysql+nginx于linux部署对环境
始终linux在补锅匠,在尚未完成linux根据 - 型nginxserver环境进行部署,这些天来,无论它是什么部署,遇到的问题非常多,今天,我的环境中部署文档发行,够一起讨论一下,希望大家採用后遇 ...
- exponential family distribution(指数族分布)
1. exponential family 给定参数 η,关于 x 的指数族分布定义为如下的形式: p(x∣∣η)=h(x)g(η)exp{ηTu(x)} 其中 x 可以为标量也可以为矢量,可以为离散 ...
- 全栈工程师之路(二)—— JavaScript(网页前端脚本语言)
javascript 是可以运行在网页前端的脚本语言,可以基于 html 之上实现更丰富的交互(网页内容的交互显示).异步回调.多线程.定时器.动画等. hello_world.html <ht ...
- 使用XCA(X Certificate and key management)可视化项目经理SSL 凭证(4)--凭借自身的凭证管理中心的定义(Certificate Authority)签名证书申请
随着XCA(X Certificate and key management)可视化项目经理SSL 证书系列文章(2)和(3)中.我们学习了怎样用XCA(X Certificate and key m ...
- WPF中使用TranslateTransform3D修改CAD的3D旋转中心
原文:WPF中使用TranslateTransform3D修改CAD的3D旋转中心 前面一篇文章讲述了2D旋转功能的实现,文章提到了修改3D旋转中心,这一节主要总结一下具体的修改3D旋转 ...
- golang中jwt使用
golang 中jwt使用方式总结. 1. golang示例代码 import ( "fmt" "time" "github.com/dgrijalv ...
- 构建自己的PHP框架(ORM)
完整项目地址:https://github.com/Evai/Aier 我们选择 Laravel 的 illuminate/database 作为我们的 ORM 包. 在本系列教程里,每一个 Comp ...
- WPF 透明掩码 OpactiyMask
原文:WPF 透明掩码 OpactiyMask 在WPF中提供了Opacity属性使得元素的所有内容都是透明的.而OpacityMask属性可以使元素的特定区域变成透明. OpacityMask属性接 ...