4256|10

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

QQ2440录音放音问题 [复制链接]

找不到合适的版块发这贴...就在这里向大家请教了,请不吝赐教

小弟想在QQ2440板上做一个语音采集与压缩程序,现在用一段测试代码在我的主机上可以正常录音放音,但重新编译后转到板上就不行了,测试代码如下:

  1. /** record.c **/

  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. #include

  9. #define LENGTH 5    /* 存储秒数 */
  10. #define RATE 48000   /* 采样频率 */
  11. #define SIZE 16     /* 量化位数 */
  12. #define CHANNELS 1  /* 声道数目 */

  13. /* 用于保存数字音频数据的内存缓冲区 */
  14. unsigned char buf[LENGTH*RATE*SIZE*CHANNELS/8];

  15. int main()
  16. {
  17.         int fd;        /* 声音设备的文件描述符 */
  18.         int arg;        /* 用于ioctl调用的参数 */
  19.         int status;   /* 系统调用的返回值 */

  20.         /* 打开声音设备 */
  21.         fd = open("/dev/dsp", O_RDWR); //O_RDONLY,O_WRONLY,O_RDWR
  22.         if (fd < 0)
  23.         {
  24.                 perror("open of /dev/dsp failed");
  25.                 exit(1);
  26.         }

  27.         /* 设置采样时的量化位数 */
  28.         arg = SIZE;
  29.         status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
  30.         if (status == -1)
  31.                 perror("SOUND_PCM_READ_BITS ioctl failed");
  32.         if (arg != SIZE)
  33.                 perror("unable to set sample size");

  34.         /* 设置采样时的声道数目 */
  35.         arg = CHANNELS;
  36.         status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
  37.         if (status == -1)
  38.                 perror("SOUND_PCM_READ_CHANNELS ioctl failed");
  39.         if (arg != CHANNELS)
  40.                 perror("unable to set number of channels");

  41.         /* 设置采样时的采样频率 */
  42.         arg = RATE;
  43.         status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
  44.         if (status == -1)
  45.                 perror("SOUND_PCM_READ_RATE ioctl failed");


  46.         /* 循环,直到按下Control-C */
  47.         //while (1)
  48.         int i = 0;       
  49.         for (i=0; i<1; i++)
  50.         {

  51.                 #if 0 //test ok
  52.                 int fdwav;
  53.                 fdwav = open("stereo_48_16.wav", O_RDONLY);
  54.                 if (fdwav < 0)
  55.                 {
  56.                         perror("open of wav failed");
  57.                         exit(1);               
  58.                 }

  59.                 status = read(fdwav, buf, sizeof(buf));
  60.                 if (status != sizeof(buf))
  61.                         perror("read wrong number of bytes");

  62.                 printf("music testing...\n");
  63.        
  64.                 status = write(fd, buf, sizeof(buf));
  65.                 if (status != sizeof(buf))
  66.                         perror("wrote wrong number of bytes");
  67.                 #endif
  68.                
  69.                 //#if 0
  70.                        
  71.                 printf("Say something: \n");
  72.                 status = read(fd, buf, sizeof(buf)); /* 录音 */
  73.                 if (status != sizeof(buf))
  74.                         perror("read wrong number of bytes");
  75.                 else
  76.                         printf("Said! \n");
  77.                 //#endif


  78.                 //#if 0
  79.                 printf("You said:\n");
  80.                 status = write(fd, buf, sizeof(buf)); /* 回放 */
  81.                 if (status != sizeof(buf))
  82.                         perror("wrote wrong number of bytes");
  83.                
  84.                 /* 在继续录音前等待回放结束 */
  85.                 status = ioctl(fd, SOUND_PCM_SYNC, 0);
  86.                 if (status == -1)
  87.                         perror("SOUND_PCM_SYNC ioctl failed");
  88.                 //#endif

  89.         }

  90.         close(fd);
  91.        
  92.         return 0;
  93. }
复制代码


在板子上运行是出现以下信息:
read wrong number of bytes: Illegal seek
dma2:loadbuffer:timeout loading buffer

在板子上可以正常播放stereo_48_16.wav(一段音乐),但是mp3就不行了
初来乍到,请大侠多多指教
板子内核是linux2.6.13

最新回复

uping  详情 回复 发表于 2009-5-6 09:19
点赞 关注

回复
举报

57

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
貌似 linux 没有对 mp3 解码哦...
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
恩,但我主要是想知道录音问题
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

4
 
主机和目标板的录音放音的硬件设备应该不一样吧...
是不是目标板的硬件设备的驱动或硬件有问题呢...
 
 
 

回复

48

帖子

0

TA的资源

一粒金砂(初级)

5
 
gdb一下 看是哪個調用出錯了
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
...偶还是菜鸟...弱弱问一句,请问怎么gdb...
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

7
 
经了解,是开发板的录音驱动问题...
请大侠指教这个驱动的问题出在哪...
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

8
 
通过参考网上资料,问题已经部分解决
除了把
driver/oss/sbc2440-audio.c
function: sbc2440_audio_read这个函数里面的
if (ppos != &file->f_pos)
    return -ESPIPE
这两句注释掉之外
function:audio_init_dma这个函数中ai_dcon与ao_dcon的赋值也有问题
改为:
ao_dcon = 0xa0800000;
ai_dcon = 0xa2900000;

据了解,原来的好像是寄存器配置错误,再具体我也不太清楚了,呵呵,还是小白菜


现在有cat录音和放音都正常,不过还有个问题,当调用read()函数录音后调用write()回放时会连续输出下面几条信息
dma2:loadbuffer:timeout loading buffer
同时程序陷入死锁,需要按ctrl+c退出,这个问题大家有没有遇到?或者说是我程序的错误?
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

9
 
这样的描述大家都没法...
貌似你应该将代码贴出来嘛...
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

10
 
那是开发板linux内核kernel2.6.13的uda1341音频驱动...
那是开源的,大家可以去下载,应该要遇到问题才知道...
解压后在kernel2.6.13/sound/dirver/oss/文件夹里
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

11
 
uping
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表