首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Linux频道
Google
首页 入门 Linux编程 系统管理 网络管理 Linux认证 Unix/BSD Linux数据库 Linux集群 Linux手册 Linux下载 Ubuntu 论坛 专题 RSS
您现在的位置: 中国IT实验室 >> Linux >> 系统管理 >> 桌面应用 >> 正文

OSS--跨平台的音频接口简介


2) 打开设备


if ((audio_fd = open(DEVICE_NAME, open_mode, 0)) == -1) {
/* Open of device failed */
perror(DEVICE_NAME);
exit(1);
}
            


    open_mode有三种选择:O_RDONLY,O_WRONLY和O_RDWR,分别表示只读、只写和读写。OSS建议尽量使用只读或只写,只有在全双工的情况下(即录音和放音同时)才使用读写模式。

2. 录音


int len;
if ((len = read(audio_fd, audio_buffer, count)) == -1) {
perror("audio read");
exit(1);
}
            

    count为录音数据的字节个数(建议为2的指数),但不能超过audio_buffer的大小。从读字节的个数可以精确的测量时间,例如8kHZ 16-bit stereo的速率为8000*2*2=32000bytes/second,这是知道何时停止录音的唯一方法。

3. 放音

    放音实际上和录音很类似,只不过把read改成write即可,相应的audio_buffer中为音频数据,count为数据的长度。

    注意,用户始终要读/写一个完整的采样。例如一个16-bit的立体声模式下,每个采样有4个字节,所以应用程序每次必须读/写4的倍数个字节。

    另外,由于OSS是一个跨平台的音频接口,所以用户在编程的时候,要考虑到可移植性的问题,其中一个重要的方面是读/写时的字节顺序。

4. 设置参数

  • 设置采样格式
    
    int format;
    format = AFMT_S16_LE;
    if (ioctl(audio_fd, SNDCTL_DSP_SETFMT, &format) == -1) {
    /* fatal error */
    perror("SNDCTL_DSP_SETFMT");
    exit(1);
    }
    if (format != AFMT_S16_LE) {
    /* 本设备不支持选择的采样格式. */
    }
    在设置采样格式之前,可以先测试设备能够支持那些采样格式,方法如下:
    int mask;
    if (ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &mask) == -1) {
    /* Handle fatal error ... */
    }
    if (mask & AFMT_MPEG) {
    /* 本设备支持MPEG采样格式 ... */}
                

  • 设置通道数目
    
    int channels = 2; /* 1=mono, 2=stereo */
    if (ioctl(audio_fd, SNDCTL_DSP_CHANNELS, &channels) == -1) {
    /* Fatal error */
    perror("SNDCTL_DSP_CHANNELS");
    exit(1);
    }
    if (channels != 2)
    {/* 本设备不支持立体声模式 ... */}
                

  • 设置采样速率
    
    int speed = 11025;
    if (ioctl(audio_fd, SNDCTL_DSP_SPEED, &speed)==-1) {
    /* Fatal error */
    perror("SNDCTL_DSP_SPEED");
    exit(Error code);
    }
    if ( /* 返回的速率(即硬件支持的速率)与需要的速率差别很大... */ ) {
    /* 本设备不支持需要的速率... */
    }
                

    音频设备通过分频的方法产生需要的采样时钟,因此不可能产生所有的频率。驱动程序会计算出最接近要求的频率来,用户程序要检查返回的速率值,如果误差较小,可以忽略,但误差不能太大。

 

上一页  [1] [2] [3] 下一页

【责编:Peng】
中国IT教育
相关产品和培训
文章评论
 友情推荐链接
 专题推荐

 ·防范Linux病毒 打造没有病毒的乐土…
 ·Linux Shell编程实用指南…
 ·Linux日志分析与管理
 ·揭密Linux内存管理
 ·邮件服务Sendmail应用配置
 ·Linux 安全管理…
 ·Linux 下DNS服务器架设攻略…
 ·Linux 下的路由的配置与应用…
 ·专题:Apache实用手册
 ·全面剖析Linux文件系统
 今日更新
 认证培训
 频道精选
 Windows频道导航