天嵌 ARM开发社区

 找回密码
 注册
查看: 7241|回复: 15

求/dev/dsp或其它声卡设备的采样率

[复制链接]
effendi 发表于 2010-9-7 22:47:26 | 显示全部楼层 |阅读模式
搜了下论坛,一般都是用cat /dev/dsp > aaa来进行录音的,
将生成文件分析了下,采样率是8000Hz(尚不知什么格式,PCM裸数据??),欲改为44100Hz采样率的,求解。感谢!


附一测试代码:
  1. /*
  2. * sound.c
  3. */
  4. #include <unistd.h>
  5. #include <fcntl.h>
  6. #include <sys/types.h>
  7. #include <sys/ioctl.h>
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. #include <linux/soundcard.h>
  11. #define LENGTH 3    /* 存储秒数 */
  12. #define RATE 8000   /* 采样频率 */
  13. #define SIZE 8      /* 量化位数 */
  14. #define CHANNELS 1  /* 声道数目 */
  15. /* 用于保存数字音频数据的内存缓冲区 */
  16. unsigned char buf[LENGTH*RATE*SIZE*CHANNELS/8];
  17. int main()
  18. {
  19.   int fd;        /* 声音设备的文件描述符 */
  20.   int arg;        /* 用于ioctl调用的参数 */
  21.   int status;   /* 系统调用的返回值 */
  22.   /* 打开声音设备 */
  23.   fd = open("/dev/dsp", O_RDWR);
  24.   if (fd < 0) {
  25.     perror("open of /dev/dsp failed");
  26.     exit(1);
  27.   }
  28.   /* 设置采样时的量化位数 */
  29.   arg = SIZE;
  30.   status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
  31.   if (status == -1)
  32.     perror("SOUND_PCM_WRITE_BITS ioctl failed");
  33.   if (arg != SIZE)
  34.     perror("unable to set sample size");
  35.   /* 设置采样时的声道数目 */
  36.   arg = CHANNELS;
  37.   status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
  38.   if (status == -1)
  39.     perror("SOUND_PCM_WRITE_CHANNELS ioctl failed");
  40.   if (arg != CHANNELS)
  41.     perror("unable to set number of channels");
  42.   /* 设置采样时的采样频率 */
  43.   arg = RATE;
  44.   status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
  45.   if (status == -1)
  46.     perror("SOUND_PCM_WRITE_WRITE ioctl failed");
  47.   /* 循环,直到按下Control-C */
  48.   while (1) {
  49.     printf("Say something:\n");
  50.     status = read(fd, buf, sizeof(buf)); /* 录音 */
  51.     if (status != sizeof(buf))
  52.       perror("read wrong number of bytes");
  53.     printf("You said:\n");
  54.     status = write(fd, buf, sizeof(buf)); /* 回放 */
  55.     if (status != sizeof(buf))
  56.       perror("wrote wrong number of bytes");
  57.     /* 在继续录音前等待回放结束 */
  58.     status = ioctl(fd, SOUND_PCM_SYNC, 0);
  59.     if (status == -1)
  60.       perror("SOUND_PCM_SYNC ioctl failed");
  61.   }
  62. }
复制代码
该代码在打开设备/dev/dsp的时候就开始报错了,不知何解。
 楼主| effendi 发表于 2010-9-8 12:24:17 | 显示全部楼层
若改采样率需改驱动,请问是更改以下的哪个文件?

s3c24xx_uda134x.c
sa11xx-uda1341.c
uda1341.c
uda134x.c


2.6.30.4的核。
天嵌_support1 发表于 2010-9-8 14:23:24 | 显示全部楼层
1# effendi


不能打开,也有个错误提示呀。
 楼主| effendi 发表于 2010-9-8 14:39:06 | 显示全部楼层
3# embedsky_lxt


斑竹大人终于出现了!

报错如下:

open of /dev/dsp failed: Invalid argument
 楼主| effendi 发表于 2010-9-8 14:42:07 | 显示全部楼层
汗~  又走佬了。
天嵌_support1 发表于 2010-9-8 18:11:14 | 显示全部楼层
2# effendi


这个文件就是:  sound/soc/s3c24xx/s3c24xx_uda134x.c
 楼主| effendi 发表于 2010-9-10 10:01:20 | 显示全部楼层
采样率问题尚未解决,请问斑竹有何好想法、建议、提示、启发、指引?
天嵌_support1 发表于 2010-9-10 12:22:19 | 显示全部楼层
7# effendi


你看看它的datasheet吧。
 楼主| effendi 发表于 2010-9-10 15:49:12 | 显示全部楼层
8# embedsky_lxt


好的,再看看。
一直以为是这个驱动:
opt\EmbedSky\linux-2.6.30.4\sound\arm\sa11xx-uda1341.c
zk_gx 发表于 2011-3-23 10:51:19 | 显示全部楼层
我想问一下busybox cat默认的采样率是多少?我不知道怎么去查
zk_gx 发表于 2011-3-23 10:54:42 | 显示全部楼层
busybox cat 默认采样率是多少?怎么查看?另外如果想修改该怎么做?
zk_gx 发表于 2011-3-23 12:01:55 | 显示全部楼层
根据我的计算,busybox cat默认的采样率是一定不是8k,我想改成8K,各位大虾有什么指导?
lyol33 发表于 2011-9-23 18:43:51 | 显示全部楼层
这dsp设备不支持全双工,只能分时复用,意思就是打开设备,不能同时有读和写的功能,不然操作设备失败。
yan160523 发表于 2013-5-9 17:19:03 | 显示全部楼层
effendi 发表于 2010-9-8 14:39
3# embedsky_lxt

没有看懂,这个问题最终是怎么解决的啊?
我也遇到这个问题了???
求解答………………
yan160523 发表于 2013-5-9 20:15:37 | 显示全部楼层
天嵌_support1 发表于 2010-9-10 12:22
7# effendi

datasheet

是什么呀?我也遇到 问题了,录制的音播放有问题,只有吱吱吱……的声音
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-10-5 22:26 , Processed in 1.034219 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表