背景:实现全志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. QWidget 之paint部分杂记(从Qt4.0到4.8的进化,在Qt 4.4中,Alien Widget诞生了)

    Qt 4.0 automatically double-buffers Qt 4.1 QWidget::autoFillBackground Qt 4.2 delayed widget creatio ...

  2. 开始使用Material UI

    Material-UI采用 Material Design风格的React UI组件,所以要想学习material ui先要了解react. material ui安装 Material-UI 可以使 ...

  3. 将枚举转成SelectListItem

    代码如下: /// <summary> /// 将一个枚举转化成一个List<SelectListItem> /// </summary> /// <type ...

  4. 使用batch批处理做目录及流程选择

    @echo off rem -- http://phpnow.org rem -- YinzCN_at_Gmail.com setlocal enableextensions if exist Pn\ ...

  5. silverlight,WPF动画终极攻略之番外 3D切换导航篇(Blend 4开发)

    原文:silverlight,WPF动画终极攻略之番外 3D切换导航篇(Blend 4开发) 这篇介绍的是3D导航,点击图标,页面360°翻转的效果!有什么不足的欢迎大家指出来. 1.新建一个user ...

  6. android该怎么办iphone那种画面抖动的动画效果(含有button和EditText)

    首先在效果图: 要做到抖动效果按钮,能够这样做.设定anim房源res以下.创建一个button_shake.xml <? xml version="1.0" encodin ...

  7. [Unity3D]Unity3D圣骑士模仿游戏开发传仙灵达到当局岛

    大家好,我是秦培.欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 在前面的文章中.我们分别实现了一个自己定义的角色控制器<[Unity3D]Unity3D游戏开 ...

  8. C++ 异常机制分析(C++标准库定义了12种异常,很多大公司的C++编码规范也是明确禁止使用异常的,如google、Qt)

    阅读目录 C++异常机制概述 throw 关键字 异常对象 catch 关键字 栈展开.RAII 异常机制与构造函数 异常机制与析构函数 noexcept修饰符与noexcept操作符 异常处理的性能 ...

  9. 【C#】wpf查找父子节点

    原文:[C#]wpf查找父子节点 using System; using System.Collections.Generic; using System.Linq; using System.Tex ...

  10. 一个让业务开发效率提高10倍的golang库

    一个让业务开发效率提高10倍的golang库 此文除了是标题党,没有什么其他问题. 这篇文章推荐一个库,https://github.com/jianfengye/collection. 这个库是我在 ...