⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wav in linux.txt

📁 c code for linux (wav reader)
💻 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 + -