ログイン
編集不可のページディスカッション情報添付ファイル
mernao/hyakuman2013springの添付ファイル:sound3.c

MMA

添付ファイル 'sound3.c'

ダウンロード

   1 #include <fcntl.h>
   2 #include <limits.h>
   3 #include <linux/soundcard.h>
   4 #include <math.h>
   5 #include <stdio.h>
   6 #include <sys/ioctl.h>
   7 #include <unistd.h>
   8 
   9 #define BUFSIZE 441000
  10 
  11 static int setup_dsp( int fd );
  12 
  13 int main( void )
  14 {
  15 	double freq = 600;
  16 	short  buf[ 2*BUFSIZE / sizeof(short) ];
  17 	int    fd, i, n;
  18 
  19 	if ( ( fd = open( "/dev/dsp", O_WRONLY ) ) == -1 ) {
  20 		perror( "open()" );
  21 		return 1;
  22 	}
  23 
  24 
  25 	/* /dev/dsp の設定 */
  26 	if ( setup_dsp( fd ) != 0 ) {
  27 		fprintf( stderr, "Setup /dev/dsp failed.\n" );
  28 		close( fd );
  29 		return 1;
  30 	}
  31 	
  32 	
  33 	/* 再生用の正弦波データ作成 */
  34 	for ( i = 0, n = 0; i < BUFSIZE / sizeof(short); i ++ , n ++ ) {
  35 	        if ( n < 44000 / ( 2 * freq ) ) {
  36 			buf[2*i] = SHRT_MAX ;
  37 			buf[2*i+1] = -SHRT_MAX;
  38 		} else {
  39 			buf[2*i] = - SHRT_MAX;
  40 			buf[2*i+1] = SHRT_MAX;
  41 		}
  42 		
  43 		if ( n > 44100 / freq ){
  44 			n = -1;
  45 			i --;
  46 		}
  47 
  48 	}
  49 
  50 	for(;;){
  51 	if ( write( fd, buf, BUFSIZE ) == -1 ) {
  52 		perror( "write()" );
  53 		close( fd );
  54 		return 1;
  55 	}
  56 	}
  57 	close( fd );
  58 	return 0;
  59 }
  60 
  61 
  62 /*
  63  * /dev/dsp を以下の様に設定する。
  64  *
  65  * 量子化ビット数     : 16   bits
  66  * サンプリング周波数 : 44.1 KHz
  67  * チャンネル数       : 1
  68  * PCM データは符号付き、リトルエンディアン
  69  *
  70  */
  71 static int
  72 setup_dsp( int fd )
  73 {
  74 	int fmt     = AFMT_S16_LE;
  75 	int freq    = 44100;
  76 	int channel = 2;
  77 
  78 	/* サウンドフォーマットの設定 */
  79 	if ( ioctl( fd, SOUND_PCM_SETFMT, &fmt ) == -1 ) {
  80 		perror( "ioctl( SOUND_PCM_SETFMT )" );
  81 		return -1;
  82 	}
  83 
  84 	/* チャンネル数の設定 */
  85 	if ( ioctl( fd, SOUND_PCM_WRITE_CHANNELS, &channel ) == -1 ) {
  86 		perror( "iotcl( SOUND_PCM_WRITE_CHANNELS )" );
  87 		return -1;
  88 	}
  89 
  90 	/* サンプリング周波数の設定 */
  91 	if ( ioctl( fd, SOUND_PCM_WRITE_RATE, &freq ) == -1 ) {
  92 		perror( "iotcl( SOUND_PCM_WRITE_RATE )" );
  93 		return -1;
  94 	}
  95 
  96 	return 0;
  97 }

添付ファイル

添付ファイルを参照するには、(下のファイル一覧にあるように)attachment:filenameと記述します。 [get]リンクのURLは変更される可能性が高いので、利用しないでください。
 All files | Selected Files: delete move to page copy to page

ファイルを添付する権限がありません。