背景:实现全志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的时候会发生哒哒哒的声音。

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

首先看问题驱动的源码

/mnt/hdd2/scc153/Tina-V2/lichee/linux-3.4/drivers/input/keyboard /
1.首先是初始化代码先进这里

通过event_rest确定是因为有一个key1 一直在传回event信息。
在lichee/linux/include/linux/input.h 中找到key(1)是KEY_ESC
 
2.问题解决:原来是多设置了一个按键,然后没有删除。我在sun8i.c 中注释掉就好了

(需要继续看一下源码更新一下)

二、问题解决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的更多相关文章

  1. html5——3D案例(音乐盒子、百度钱包)

    1.音乐盒子:触碰盒子,盖子会打开 2.百度钱包:触碰钱包,钱包,会180度旋转 <!DOCTYPE html> <html lang="en"> < ...

  2. 我的音乐盒子(nodejs7 + koa2 + vue + vuex + vue-router)

    你们知道的,nodejs对jser来说,是个好东西,快快的,自从接触nodejs后,总想弄点东西. 这弄个啥了,一天打开百度音乐盒,哟,自己弄一个如何了,好啊好啊. 后台: nodejs 7 + ko ...

  3. python 简易音乐盒子

    #!/usr/bin/env python#-*- coding:utf-8 -*- from Tkinter import *import tkMessageBoximport urllib def ...

  4. Android Service AIDL 远程调用服务 【简单音乐播放实例】

    Android Service是分为两种: 本地服务(Local Service): 同一个apk内被调用 远程服务(Remote Service):被另一个apk调用 远程服务需要借助AIDL来完成 ...

  5. 使用 原生js 制作插件 (javaScript音乐播放器)

    1.引用页面 index.html <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  6. Archlinux添加MP3播放器

    方法1: # pacman -S mplayer From: http://www.linuxdiyf.com/viewarticle.php?id=89207 用mplayer循环播放音乐:mpla ...

  7. Android_通过传感器抓小偷

    package com.beyond.phonestolen; import android.hardware.Sensor; import android.hardware.SensorEvent; ...

  8. jQuery分析(3) - jQuery.fn.init

    1.前言 上一篇jQuery分析(2)中了解了jQuery库的骨架实现原理,这就好比摇滚音乐,摇滚音乐不是某种音乐他就像一个音乐盒子,里面包含了各种不同的摇滚风格(山地.朋克.乡村.流行.硬摇.金属. ...

  9. 2019 Valentine's Day 圣地巡礼和WPR003N开箱刷U-boot记录

    即兴打出这个标题,似乎性息量有点大,后面的内容真的和你想象的是一样的吗? 自上一篇blog告别这里有多少年了,掐指一算,今天是一个回归的日子,看着这里搭上云之路,渐渐的变成了云主机中的一员,感慨时事境 ...

随机推荐

  1. ASP.NET Page执行顺序(ASP.NET生命周期)

    此部分说明的生命周期只有部分: ---引用MSDN 阶段 说明 页请求 页请求发生在页生命周期开始之前.用户请求页时,ASP.NET 将确定是否需要分析和编译页(从而开始页的生命周期),或者是否可以在 ...

  2. la4080 Warfare And Logistics 罗列+最短

    为了图.计算最短随机分ans1.和删除边缘.免费才能够获得最大和短路之间的最大分ans2,如果这两个不沟通.看作是两个点之间的最短距离l. 第一个想法是枚举每个边缘,然后运行n最短时间.但是,这种复杂 ...

  3. 半监督学习(semi-supervised learning)

    P(x)P(x,y)}⇒P(y|x) 自 P(x) 生成的无标签样本: 自 P(x,y) 生成的标记样本:

  4. 安德鲁斯Launcher得到的装在手机的应用程序列表

    Launcher最基本的是让所有的应用程序和入口图标的列表.有两种方法来获得,一般: PackageInfo ResolveInfo 执行获取全部APP的Launcher而且同意进行点击事件,进入到应 ...

  5. C++:怎样把一个int转成4个字节?

    大家都知道,一个int 或 unsigned int是由4个字节组成的,(<C/C++学习指南>,第3章,第3.2.3节:变量的内存视图) 比如, int   n  =  sizeof( ...

  6. golang中jwt使用

    golang 中jwt使用方式总结. 1. golang示例代码 import ( "fmt" "time" "github.com/dgrijalv ...

  7. Why aren't more desktop apps written with Qt?(quora.com系列文章)

    As far as I know and have understood in my experience with Qt, it's a very good and easy to learn li ...

  8. Java之"Mozilla Rhino"引擎(二)

    在Java中使用Rhino, 能让你使用类似Groovy, ECMAScript...等等之类的不同动态脚本语言, 其中值得推荐的是ECMAScript, 它是Rhino的默认实现, 同时也在JDK1 ...

  9. Prism框架在项目中使用

    本文大纲 1.Prism框架下载和说明 2.Prism项目预览及简单介绍. 3.Prism框架如何在项目中使用. Prism框架下载和说明 Prism框架是针对WPF和Silverlight的MVVM ...

  10. c#中的访问修饰符Protected,privet ,public, internal,和internal protected

    Protected,privet ,public, internal,和internal protected的区别 Private修饰的,只能值类内部使用,外部不可以使用,子类不能直接访问,但可以通过 ...