音乐盒子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告别这里有多少年了,掐指一算,今天是一个回归的日子,看着这里搭上云之路,渐渐的变成了云主机中的一员,感慨时事境 ...
随机推荐
- Android——Intent详解
Intent组件虽然不是四大组件,但却是连接四大组件的桥梁,学习好这个知识,也非常的重要. 一.什么是Intent 1.Intent的概念: Android中提供了Intent机制来协助应用间的交互与 ...
- Tagging Physical Resources in a Cloud Computing Environment
A cloud system may create physical resource tags to store relationships between cloud computing offe ...
- matlab 工具函数 —— logdet(A)
当参数 A 是正定矩阵(positive definite)时,logdet 利用相关矩阵分解的性质,将比 log(det(A)) 获得更快的效率: function y = logdet(A) tr ...
- Blend_技巧篇_淡入淡出
原文:Blend_技巧篇_淡入淡出 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010265681/article/details/766517 ...
- python win32api 使用小技巧
前些日子,由于需要,用python写了个小插件,通过win32api 访问外部程序的窗口 并且做些小操作. 因为原来对win32api 不怎么熟悉 所以只好求救.群里有个QQ:32034767 唐骁勇 ...
- Cocos2d-x 3.1 一步一步地做改编
本文并不想谈论的屏幕改编或真理的概念.假设不知道cocos2d-x的,请先看这篇文章:http://www.cocoachina.com/gamedev/cocos/2014/0516/8451.ht ...
- NS2网络模拟(1)-延迟
1: #NS2_有线部分\EndDelay.awk 2: 3: BEGIN { 4: #Initialize the variable 5: MaxID = 0; 6: i = 0; 7: } 8: ...
- Apache和Tomcat的整合
1.web架构 首先上图,解释web通用架构 通常情况下分为三大块 : ★ Web server : 通常情况下由 Apache Http Server . IBM Http Server .I ...
- cross-compile-openssl-windows.sh,cross-compile-curl-windows.sh,cross-compile-zlib-windows.sh,build-zlib-visual-studio-2015-cli.bat
https://gist.github.com/artynet build zlib with Visual Studio CLI toolhttps://gist.github.com/artyne ...
- 解决引用 System.Windows.Interactivity程序集生成多国语言文件夹fr、es、ja等问题
原文:解决引用 System.Windows.Interactivity程序集生成多国语言文件夹fr.es.ja等问题 通过以下方式对 System.Windows.Interactivity程序集添 ...