/* sivann@REMOVEME.cs.ntua.gr 1996 */ /* Command-line and interactive program to control audio levels on solaris. An alternative for Solaris's /usr/openwin/bin/audiocontrol */ #include #include #include #include #include #include #include #include #include #include #ifdef SUNOS4 #include #else #include #endif void no_wait () { int fd; struct termio test; fd = open (ttyname (0), O_WRONLY); ioctl (fd, TCGETA, &test); test.c_cc[VMIN] = 1; test.c_lflag = ISIG; ioctl (fd, TCSETA, &test); close (fd); } char device[30]; audio_info_t ai; int fd; int main (int argc, char **argv) { int chr,val = 0; /* open the device */ if ((fd = open("/dev/audioctl",O_RDWR)) < 0 ) { perror ("opening /dev/audioctl for write"); return errno; } /* fill in the structure */ if (ioctl (fd, AUDIO_GETINFO, &ai)< 0) { perror ("AUDIO_GETINFO"); return errno; } while ((chr=getopt (argc, argv, "86Ss12345p:r:m:d:")) != EOF) { switch (chr) { case 'p': val=atoi(optarg); if (val<1 || val > 255) { fprintf(stderr,"play gain should be between 1 and 255 (was %s)", optarg); exit(10); } ai.play.gain = val; break; case 'm': val=atoi(optarg); if (val<1 || val > 255) { fprintf(stderr,"monitor gain should be between 1 and 255 (was %s)", optarg); exit(11); } ai.monitor_gain = val; break; case 'd': val=atoi(optarg); if (val<1 || val > 255) { fprintf(stderr,"rec gain should be between 1 and 255 (was %s)", optarg); exit(12); } ai.record.gain = val; break; case '6': ai.play.sample_rate = (uint_t) 8000; ai.play.channels = (uint_t) 1; ai.play.precision = (uint_t) 8; ai.play.encoding = AUDIO_ENCODING_ULAW; ai.record.sample_rate = (uint_t) 8000; ai.record.channels = (uint_t) 1; ai.record.precision = (uint_t) 8; ai.record.encoding = AUDIO_ENCODING_ULAW; break; case '8': ai.record.sample_rate = 48000; ai.record.channels = 2; ai.record.precision = 16; ai.record.encoding = AUDIO_ENCODING_LINEAR; ai.play.sample_rate = 48000; ai.play.channels = 2; ai.play.precision = 16; ai.play.encoding = AUDIO_ENCODING_LINEAR; break; case 's': ai.output_muted = 0; break; case 'S': ai.output_muted = 1; break; case '1': ai.play.port = AUDIO_SPEAKER; break; case '2': ai.play.port = AUDIO_HEADPHONE; break; case '3': ai.play.port = AUDIO_LINE_OUT; break; case '4': ai.record.port = AUDIO_LINE_IN; break; case '5': ai.record.port = AUDIO_MICROPHONE; break; default: printf("Usage: audioctl [-8|6] [-s|S] [-1|2|3|4|5] -[p <1-255>] [-r <1-255>] [-m <1-255>] [-d <1-255>]\n\n" ); break; } //switch }//while /* AUDIO_INITINFO sets all the fields to a special "no-change" value */ if (optind >1) { if (ioctl (fd, AUDIO_SETINFO, &ai) < 0) perror ("AUDIO_SETINFO"); return 0; } else interactive(); } interactive() { unsigned int c=0; char ss,sS,slout,shead,spout,slin,smicin,s8,s16; char term[32],clear[32]; if (ioctl (fd, AUDIO_GETINFO, &ai)< 0) perror ("AUDIO_GETINFO"); no_wait (); strcpy(term,getenv("TERM")); if (strstr(term,"xterm")||!strncmp(term,"vt",2)) strcpy(clear,"\033[H\033[2J"); else clear[0]=0; do { if (ioctl (fd, AUDIO_GETINFO, &ai) < 0) perror ("AUDIO_GETINFO"); switch (c) { case '-': if (ai.play.gain > 8) ai.play.gain -= 8; break; case 'P': if (ai.play.gain < 247) ai.play.gain += 8; break; case 'p': if (ai.play.gain > 8) ai.play.gain -= 8; break; case '+': if (ai.play.gain < 247) ai.play.gain += 8; break; case 'R': if (ai.record.gain < 247) ai.record.gain += (uint_t) 8; break; case 'r': if (ai.record.gain > 8) ai.record.gain -= (uint_t) 16; break; case 'M': if (ai.monitor_gain < 247) ai.monitor_gain += 8; break; case 'm': if (ai.monitor_gain > 8) ai.monitor_gain -= 8; break; case 'S': ai.output_muted = 1; break; case 's': ai.output_muted = 0; break; case '8': ai.play.sample_rate = (uint_t) 8000; ai.record.sample_rate = (uint_t) 8000; ai.play.encoding = AUDIO_ENCODING_ULAW; ai.record.channels = (uint_t) 1; ai.play.channels = (uint_t) 1; ai.record.encoding = AUDIO_ENCODING_ULAW; ai.play.precision = (uint_t) 8; ai.record.precision = (uint_t) 8; break; case '6': ai.record.sample_rate = 48000; ai.record.channels = 2; ai.record.precision = 16; ai.record.encoding = AUDIO_ENCODING_LINEAR; ai.play.sample_rate = 48000; ai.play.channels = 2; ai.play.precision = 16; ai.play.encoding = AUDIO_ENCODING_LINEAR; break; case '1': ai.play.port = AUDIO_SPEAKER; break; case '2': ai.play.port = AUDIO_HEADPHONE; break; case '3': ai.play.port = AUDIO_LINE_OUT; break; case '4': ai.record.port = AUDIO_LINE_IN; break; case '5': ai.record.port = AUDIO_MICROPHONE; break; default: break; } if (ioctl (fd, AUDIO_SETINFO, &ai) < 0) perror ("AUDIO_SETINFO"); if (ioctl (fd, AUDIO_GETINFO, &ai)< 0) perror ("AUDIO_GETINFO"); if (ai.record.precision == 16) { s8=' '; s16='*'; } else { s8='*'; s16=' '; } if (ai.output_muted) { sS='*'; ss=' '; } else { ss='*'; sS=' '; } if (ai.play.port&AUDIO_LINE_OUT) slout='*'; else slout=' '; if (ai.play.port&AUDIO_HEADPHONE) shead='*'; else shead=' '; if (ai.play.port&AUDIO_SPEAKER) spout='*'; else spout=' '; if (ai.record.port&AUDIO_LINE_IN) slin='*'; else slin=' '; if (ai.record.port&AUDIO_MICROPHONE) smicin='*' ; else smicin=' '; //system("tput clear"); printf(clear); printf ("\n\nAudiocontrol V3 * sivann@cs.ece.ntua.gr 1996-2001\n\n"); printf ("\nCommands are: \n\n"); printf (" P (play volume up) p : (play volume down)\n"); printf (" R (rec volume up) r : (record volume down)\n"); printf (" M (play volume up) m : (monitor volume down)\n\n"); printf (" %c8 (8-bit,8khz ulaw) %c6 : (16-bit,16-khz linear )\n",s8,s16); printf (" %cS (Silence on) %cs : (silence off)\n",sS,ss); printf (" %c1 (Speaker OUT) %c2 : (Headphones OUT)\n",spout,shead); printf (" %c3 (LINE_OUT) \n",slout); printf (" %c4 (LINE_IN) %c5 : (MIC_IN)\n\n",slin,smicin); if (errno) printf(strerror(errno)); printf (" q to quit\n\n"); printf ("\r " " \r"); printf ("\r%cPlay:%d Rec:%d Mon:%d Bits:%d KHZ:%d Silence:%d Select:", 21, ai.play.gain, ai.record.gain, ai.monitor_gain, ai.record.precision, ai.record.sample_rate, ai.output_muted); /* printf ("\r%cPlay:%d Rec:%d Mon:%d Bits:%d KHZ:%d Silence:%d Select:", 21, ai.play.gain, ai.record.gain, ai.monitor_gain, ai.record.precision, ai.record.sample_rate, ai.output_muted); */ } while ((c = getchar ()) != 'q') ; printf ("\nBye!\n"); return 0; }