?? wav in linux.txt
字號:
#include <stdio.h>
#include <sys/soundcard.h>
#include <fcntl.h>
#include <errno.h>
#include <pthread.h>
#include <ncurses.h>
typedef struct BASIC_HEADFILE_WAV{
char ChunkID[3];
long ChunkSize;
char Format[4];
char Subchunk1ID[3];
long Subchunk1Size;
short AudioFormat;
short NumChannels;
long SampleRate;
long ByteRate;
short BlockAlign;
short BitsPerSample;
char Subchunk2ID[3];
long Subchunk2Size;
}BASIC_HEADFILE_WAV;
int setup_dsp(int handle,int rate, int channels);
int Thread_play_file_wav(FILE *musica);
int open_dsp();
int sync_dsp();
void Info_wav(BASIC_HEADFILE_WAV *basic_wav);
int dev_fd;
char pcmout[4608];
int player_control;
// MAIN
int main(int argc, char *argv[]){
int *file_sound;
pthread_t Thread;
int return_thread;
int input_control=0;
int loop=0;
int pause=0;
file_sound=(int*)fopen(argv[1],"r");
if(file_sound==0){
perror("fopen");
return -1;
}
initscr();
raw();
curs_set(0);
noecho();
return_thread=pthread_create(&Thread,NULL,(void*)Thread_play_file_wav,file_sound);
while(loop == 0){
input_control=getch();
switch(input_control){
case 'q' : player_control=1;
loop=1;
pthread_join(Thread,NULL);
break;
case 'f' : if(pause==0)
player_control=2;
break;
case 'b' : if(pause==0)
player_control=3;
break;
case 'p' : if(pause==0){
player_control=4;
pause=1;
}else{
player_control=0;
pause=0;
}
break;
default : break;
}
}
endwin();
close(file_sound);
return 0;
}
// THREAD PLAY FILE WAV
int Thread_play_file_wav(FILE *musica){
BASIC_HEADFILE_WAV basic_wav;
long ret;
long pos_file;
char teste_wav[4];
int i=0;
int play;
fread(&basic_wav,sizeof(BASIC_HEADFILE_WAV),1,musica);
memcpy(teste_wav,basic_wav.ChunkID,4);
teste_wav[4]='\0';
if(strcmp(teste_wav,"RIFF")!=0){
endwin();
printf("the file is not wav.\n");
fclose(musica);
exit(-1);
}
if(basic_wav.BitsPerSample == 32){
endwin();
printf("the player not suport 32 bit per sample\n");
fclose(musica);
exit(-1);
}
Info_wav(&basic_wav);
if(open_dsp()==-1){
endwin();
fclose(musica);
exit(-1);
}
if(setup_dsp(dev_fd,basic_wav.SampleRate,basic_wav.NumChannels-1))
{
perror("dsp");
close(musica);
close(dev_fd);
exit(-1);
}
if(sync_dsp()==1){
close(musica);
close(dev_fd);
exit(-1);
}
play=1;
while(i==0){
if(player_control!=0){
switch(player_control){
case 1: i=1;
break;
case 2: fseek(musica,16384,1);
usleep(1000);
player_control=0;
break;
case 3: fseek(musica,pos_file-16384,0);
usleep(1000);
player_control=0;
break;
case 4: mvprintw(3,19,"%s","Pause");
refresh();
play=1;
while(player_control==4){
usleep(100);}
break;
default :break;
}
}else{
if(play==1){
mvprintw(3,19,"%s","Play ");
refresh();
play=0;
}
pos_file=ftell(musica);
mvprintw(2,19,"%s"," ");
refresh();
mvprintw(2,19,"%d",pos_file);
refresh();
ret=fread(pcmout,sizeof(pcmout),1,musica);
if(ret<=0){
break;
}
write(dev_fd,pcmout,sizeof(pcmout));
}
}
endwin();
close(dev_fd);
fclose(musica);
exit(0);
}
// OPEN DSP
int open_dsp(){
if ( (dev_fd = open("/dev/dsp",O_WRONLY)) == -1 )
{
perror("open dsp");
return -1;;
}
}
// SETUP DSP
int setup_dsp(int handle,int rate, int channels)
{
int format;
if ( ioctl(handle, SNDCTL_DSP_STEREO,&channels) == -1 )
{
perror("ioctl stereo");
return errno;
}
if(channels==0){
format=AFMT_U8; // 8 bit sound
}
if(channels==1){
format=AFMT_S16_LE; // 16 bit sound
}
if ( ioctl(handle, SNDCTL_DSP_SETFMT,&format) == -1 )
{
perror("ioctl format");
return errno;
}
if ( ioctl(handle, SNDCTL_DSP_SPEED,&rate) == -1 )
{
perror("ioctl sample rate");
return errno;
}
return 0;
}
// SYNC DSP
int sync_dsp(){
int ret=0;
if (ioctl(dev_fd, SNDCTL_DSP_SYNC) == -1) {
perror("ioctl sync\n");
ret=1;
}
return ret;
}
// INFO WAV
void Info_wav(BASIC_HEADFILE_WAV *basic_wav){
printw("===============================================\n");
printw(" Bitstream is %d channel, %ldHz \n",basic_wav->NumChannels,basic_wav->SampleRate);
printw(" Decoded lengtph: \n");
printw("\n===============================================\n");
refresh();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -