音乐盒子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告别这里有多少年了,掐指一算,今天是一个回归的日子,看着这里搭上云之路,渐渐的变成了云主机中的一员,感慨时事境 ...
随机推荐
- jQuery在线选座订座(高铁版)
除了电影院在线选座,我们还会接触到飞机机舱选座,当然也有汽车票火车票选座的.假如有一天买火车票也提供在线选座,那么今天我来给大家介绍下如何使用jQuery选座插件完成高铁列车座位布置.选座.不同等级座 ...
- WPF去除边框的方法
原文:WPF去除边框的方法 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangsen600/article/details/81978125 W ...
- e.target e.currenttarget
概述 当事件穿过 DOM 时,识别事件的当前目标对象(Identifies the current target for the event, as the event traverses the D ...
- TCP 报文段结构
源端口.目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信.源端口.目标端口是用 ...
- 在efcore 中创建类 通过实现IEntityTypeConfiguration<T>接口 实现实体类的伙伴类 实现FluentApi
1 创建实体类: public partial class NewsCategory : IAggregationRoot { public NewsCategory() { } public Gui ...
- AvalonDock的基本用法
原文:AvalonDock的基本用法 AvalonDock是优秀的开源项目,用于创建可停靠式布局,能够在WPF中方便开发出类似VS2010的软件界面.对于复杂的软件系统,大量控件的使用 ...
- Android笔记--自定义控件仿遥控器的圆形上下左右OK圆盘按钮
原文:Android笔记--自定义控件仿遥控器的圆形上下左右OK圆盘按钮 上面就是几张预览图!代码在最底下 主要就两个步骤,画图.监听点击 1.整个控件基本上是一步步画出来的,重写onDraw方法开始 ...
- 格式字符串分配stl::string
代码非常easy,不解释,直接在代码: #include <cstdio> #include <cstdarg> #include <iostream> using ...
- boost::bind应用示例
// testBind.cpp : Defines the entry point for the console application. // #include "stdafx.h&qu ...
- crossplatform----文本编辑器工具Atom安装
1.简介 Atom 是 Github 专门为程序员推出的一个跨平台文本编辑器.具有简洁和直观的图形用户界面,并有很多有趣的特点:支持CSS,HTML,JavaScript等网页编程语言.它支持宏,自动 ...