音频播放器初探

    技术2024-07-28  62

    开发环境:

    硬件平台:X86

    软件平台:Ubuntu 10.10 + gcc

    音频文件有多种格式,本播放器主要解析wav格式的音频,定义一个结构体存放wav文件的头部信息:

    struct wav_header { __u32 chunk_id; __u32 chunk_size; __u32 format; __u32 subchunk1_id; __u32 subchunk1_size; __u16 audio_format; __u16 num_channels; __u32 sample_rate; __u32 byte_rate; __u16 block_align; __u16 bits per sample; __u32 subchunk2_id; __u32 subchunk2_size; unsigned char data[0]; }; 

     

     

    wav文件头部的这么多信息,只须解析出sample_rate、num_channels、bits_per_sample的值,把这三个值传给OSS声卡驱动的ioctl()函数,其他的无非是打开声卡设备文件,往声卡设备文件写wav文件的data,这样即可实现一个非常简单的播放器。

     

     

    #include<stdio.h> #include<fcntl.h> #include<unistd.h> #include<sys/ioctl.h> #include<linux/types.h> #include<linux/soundcard.h> #define FILE_SIZE 512 struct wav_header { __u32 chunk_id; __u32 chunk_size; __u32 format; __u32 subchunk1_id; __u32 subchunk1_size; __u16 audio_format; __u16 num_channels; __u32 sample_rate; __u32 byte_rate; __u16 block_align; __u16 bits_per_sample; __u32 subchunk2_id; __u32 subchunk2_size; unsigned char data[0]; }; int main(int argc, char *argv[]) { int fdw,fds; int len; struct wav_header wav; char buffer[FILE_SIZE]; __u32 bsp; __u32 channels; __u32 speed; if ( argc < 2) { printf("Usage:/n/t%s filename!/n",argv[0]); return -1; } fdw = open(argv[1],O_RDONLY); if( fdw < 0) { printf("Open file error"); return -1; } if ( argc < 2) { printf("Usage:/n/t%s filename!/n",argv[0]); return -1; } read(fdw, &wav, sizeof(wav)); printf("Audio Format: %d, Channels: %d, Sample rate: %d/n",wav.bits_per_sample, wav.num_channels, wav.sample_rate); fds = open("/dev/dsp",O_RDWR); if(fds< 0) { perror("/dev/dsp"); close(fdw); return -1; } bsp = wav.bits_per_sample; channels = wav.num_channels; speed = wav.sample_Rate; ioctl(fds, SNDCTL_DSP_SETFMT, &bsp); ioctl(fds, SNDCTL_DSP_CHANNELS, &channels); ioctl(fds, SNDCTL_DSP_SPEED, &speed); while(1) { len = read(fdw, buffer, FILE_SIZE); if (len < 1) break; write(fds, buffer, len); } close(fds); close(fdw); return 0; } 

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    最新回复(0)