Yattm - unified GTK instant-messaging client | |
[Generated for version 0.2-17 - Mon Jan 6 19:01:23 GMT+1 2003] |
#include "intl.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <math.h>
#include <sys/wait.h>
#include <sys/signal.h>
#include "globals.h"
#include "util.h"
#include "dialog.h"
#include "sound.h"
#include "prefs.h"
Include dependency graph for sound.c:
Go to the source code of this file.
Defines | |
#define | ZEROTRAP |
#define | BIAS 0x84 |
#define | CLIP 32635 |
Functions | |
int | play_audio (gchar *soundfile) |
int | can_play_audio () |
unsigned char | linear2ulaw (int sample) |
int | _af_ulaw2linear (unsigned char ulawbyte) |
int | can_play_esd () |
int | play_esd_file (gchar *soundfile) |
int | can_play_arts () |
void | arts_shutdown () |
int | play_arts_file (gchar *soundfile) |
char * | auscale (char *infile, char *outfile, float scaling) |
gboolean | file_ok (gchar *soundfile) |
void | playsoundfile (gchar *soundfile) |
void | play_sound (int sound) |
void | sound_init () |
void | sound_shutdown () |
Variables | |
int(* | play_soundfile )(gchar *soundfile) |
void(* | shutdown_sounddrv )() |
|
Definition at line 142 of file sound.c. Referenced by linear2ulaw(). |
|
Definition at line 143 of file sound.c. Referenced by linear2ulaw(). |
|
|
|
Definition at line 223 of file sound.c. Referenced by auscale().
00224 { 00225 static int exp_lut[8] = {0,132,396,924,1980,4092,8316,16764}; 00226 int sign, exponent, mantissa, sample; 00227 00228 ulawbyte = ~ulawbyte; 00229 sign = (ulawbyte & 0x80); 00230 exponent = (ulawbyte >> 4) & 0x07; 00231 mantissa = ulawbyte & 0x0F; 00232 sample = exp_lut[exponent] + (mantissa << (exponent + 3)); 00233 if (sign != 0) sample = -sample; 00234 { 00235 return(sample); 00236 } 00237 } |
|
Definition at line 401 of file sound.c. Referenced by sound_init().
00402 { 00403 } |
|
Definition at line 411 of file sound.c. References _af_ulaw2linear(), DBG_CORE, eb_debug, and linear2ulaw(). Referenced by playsoundfile().
00412 { 00413 #ifndef __MINGW32__ 00414 FILE *fd_in, *fd_out; 00415 int bytes_read, x; 00416 guint32 header_size; 00417 size_t io_bytes; 00418 00419 typedef struct 00420 { 00421 /* NOTE: THE GUINT32 VALUES BELOW ARE IN THE FILE AS BIG-ENDIAN 00422 * FORMAT !!!! */ 00423 guchar magic[4]; /* magic number '.snd' */ 00424 guint32 dataloc; /* offset to start of data */ 00425 guint32 datasize; /* num bytes of data */ 00426 guint32 dataformat; /* data format code */ 00427 guint32 samplerate; /* sampling rate */ 00428 guint32 channelcount; /* num of channels */ 00429 guchar info; /* null terminated id string 00430 * (variable length) */ 00431 } SNDStruct; 00432 00433 SNDStruct auheader; /* first 28 bytes of .au header */ 00434 guchar buf, buf2[256]; 00435 guchar map[256]; /* 8-bit mapping */ 00436 00437 if (scaling == 0.0) return(infile); /* save time */ 00438 00439 if ((fd_in = fopen(infile, "rb")) == NULL) 00440 { 00441 fprintf(stderr,"Failed opening infile %s, errno=%d\n",infile, errno); 00442 return(infile); 00443 } 00444 /* see if this is .au file, if not then get out */ 00445 if ((io_bytes = fread((guchar *)&auheader, sizeof(guchar), sizeof(auheader), fd_in)) != 28) 00446 { 00447 fclose(fd_in); 00448 fprintf(stderr,"Auscale - header read failed\n"); 00449 return(infile); 00450 } 00451 if (strncmp(auheader.magic,".snd",4)) 00452 { 00453 eb_debug(DBG_CORE, "Not .au file,file type=%X%X%X%X\n",auheader.magic[0],auheader.magic[1],auheader.magic[2],auheader.magic[3]); 00454 fclose(fd_in); 00455 return(infile); 00456 } 00457 x = GUINT32_FROM_BE(auheader.dataformat); 00458 if (x!=1) /* only want ulaw-8 format files */ 00459 { 00460 eb_debug(DBG_CORE, "Not .au file,file type=%X%X%X%X\n",auheader.magic[0],auheader.magic[1],auheader.magic[2],auheader.magic[3]); 00461 fclose(fd_in); 00462 return(infile); 00463 } 00464 header_size= GUINT32_FROM_BE(auheader.dataloc); /* get offset to start of 00465 * data */ 00466 /* file is right type, reset to start */ 00467 rewind(fd_in); 00468 00469 if ((fd_out = fopen(outfile, "w+b")) == NULL) 00470 { 00471 fprintf(stderr,"Failed opening outfile %s, errno=%d\n",outfile, 00472 errno); 00473 fclose(fd_in); 00474 return(infile); 00475 } 00476 00477 eb_debug(DBG_CORE, "Scaling = %f dB\n",scaling); 00478 scaling = pow(10.0,scaling/20.0); 00479 00480 /* Build mapping */ 00481 for (x=0; x<256 ; x++) map[x]=linear2ulaw(scaling*_af_ulaw2linear(x)); 00482 00483 /* Shift the .au header */ 00484 /* copy the .au header */ 00485 /* Note: There are unusual situations when the 'info' field is VERY 00486 * large and the start of data can therefore be larger than buf2. 00487 * The following 'while' statement takes care of that problem. */ 00488 while(header_size >= (guint32)sizeof(buf2)) 00489 { 00490 if ((io_bytes = fread(buf2, sizeof(guchar), sizeof(buf2), fd_in)) == sizeof(buf2)) 00491 { 00492 if ((io_bytes = fwrite(buf2, sizeof(guchar), sizeof(buf2), fd_out)) != 00493 sizeof(buf2)) 00494 { 00495 eb_debug(DBG_CORE, "error copy au file"); 00496 fclose(fd_out); 00497 fclose(fd_in); 00498 return (infile); 00499 } 00500 } 00501 else 00502 { 00503 eb_debug(DBG_CORE, "error copying au file"); 00504 fclose(fd_in); 00505 fclose(fd_out); 00506 return (infile); 00507 } 00508 /* calc remaining amount of header */ 00509 header_size -= (guint32)sizeof(buf2); 00510 } 00511 /* copy rest of header (or in most cases - all of it) */ 00512 if ((io_bytes = fread(buf2, sizeof(guchar), header_size, fd_in)) == 00513 header_size) 00514 { 00515 if ((io_bytes = fwrite(buf2, sizeof(guchar), header_size, fd_out)) 00516 != header_size) 00517 { 00518 eb_debug(DBG_CORE, "error copying au file"); 00519 fclose(fd_out); 00520 fclose(fd_in); 00521 return (infile); 00522 } 00523 } 00524 else 00525 { 00526 eb_debug(DBG_CORE, "error copying au file"); 00527 fclose(fd_in); 00528 fclose(fd_out); 00529 return(infile); 00530 } 00531 00532 /* Write the mapped data out */ 00533 while((bytes_read = fread( &buf, sizeof(guchar), 1, fd_in)) > 0) 00534 { 00535 fwrite(map+buf, sizeof(guchar), 1, fd_out); 00536 } 00537 fclose(fd_in); 00538 fclose(fd_out); 00539 #endif 00540 00541 return outfile; 00542 } |
|
Definition at line 396 of file sound.c. Referenced by sound_init().
00397 {
00398 return FALSE;
00399 }
|
|
Definition at line 112 of file sound.c. Referenced by sound_init().
00113 { 00114 /* FIXME check for write access and such. */ 00115 /* do not change from return 1 for WIN32 */ 00116 return 1; 00117 00118 } |
|
Definition at line 268 of file sound.c. Referenced by sound_init().
00269 {
00270 return FALSE;
00271 }
|
|
Definition at line 558 of file sound.c. References do_error_dialog(). Referenced by playsoundfile().
00559 { 00560 gchar message[1024]; 00561 00562 if (access(soundfile, R_OK) == -1) /* use 'access' rather than 00563 * 'stat', so we also get access 00564 * results 00565 */ 00566 { 00567 /* find and report the error */ 00568 switch (errno) 00569 { 00570 case ENOENT: 00571 g_snprintf(message, 1024, "Sound file \'%s\', Not Found", soundfile); 00572 break; 00573 00574 case EACCES: 00575 g_snprintf(message, 1024, "Sound file \'%s\', Access Not Allowed", soundfile); 00576 break; 00577 00578 default: 00579 g_snprintf(message, 1024, "Error in opening sound file \'%s\', error code = %d", soundfile, errno); 00580 break; 00581 } 00582 00583 do_error_dialog(message, "Yattm-WARNING"); 00584 return FALSE; 00585 } 00586 return TRUE; 00587 } |
|
Definition at line 145 of file sound.c. Referenced by auscale().
00146 { 00147 static int exp_lut[256] = {0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3, 00148 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, 00149 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 00150 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 00151 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 00152 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 00153 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 00154 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 00155 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 00156 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 00157 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 00158 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 00159 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 00160 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 00161 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 00162 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7}; 00163 int sign, exponent, mantissa; 00164 unsigned char ulawbyte; 00165 00166 /* Get the sample into sign-magnitude. */ 00167 sign = (sample >> 8) & 0x80; /* set aside the sign */ 00168 if (sign != 0) sample = -sample; /* get magnitude */ 00169 if (sample > CLIP) sample = CLIP; /* clip the magnitude */ 00170 00171 /* Convert from 16 bit linear to ulaw. */ 00172 sample = sample + BIAS; 00173 exponent = exp_lut[(sample >> 7) & 0xFF]; 00174 mantissa = (sample >> (exponent + 3)) & 0x0F; 00175 ulawbyte = ~(sign | (exponent << 4) | mantissa); 00176 #ifdef ZEROTRAP 00177 if (ulawbyte == 0) ulawbyte = 0x02; /* optional CCITT trap */ 00178 #endif 00179 00180 return(ulawbyte); 00181 } |
|
Definition at line 405 of file sound.c. Referenced by sound_init().
00406 {
00407 return FALSE;
00408 }
|
|
Definition at line 75 of file sound.c. References DBG_CORE, and eb_debug. Referenced by sound_init().
00076 { 00077 int fd; 00078 struct stat info; 00079 char * buf; 00080 char * audio_device; 00081 00082 fd = open(soundfile,O_RDONLY); 00083 if (fd <= 0) 00084 { 00085 eb_debug(DBG_CORE, "Cannot open file %s\n", soundfile); 00086 return FALSE; 00087 } 00088 fstat(fd, &info); 00089 buf = alloca(info.st_size); 00090 read(fd,buf,24); 00091 read(fd,buf,info.st_size-24); 00092 close(fd); 00093 eb_debug(DBG_CORE, "File is %ld bytes\n", info.st_size); 00094 00095 audio_device = getenv("AUDIODEV"); 00096 if (audio_device == NULL) { 00097 /* OK, we're not running on a SunRay */ 00098 audio_device = "/dev/audio"; 00099 } 00100 00101 eb_debug(DBG_CORE, "sending to %s\n", audio_device); 00102 00103 fd = open(audio_device, O_WRONLY | O_EXCL); 00104 if (fd < 0) 00105 return FALSE; 00106 write(fd, buf, info.st_size-24); 00107 close(fd); 00108 00109 return TRUE; 00110 } |
|
Definition at line 273 of file sound.c. Referenced by sound_init().
00274 {
00275 return FALSE;
00276 }
|
|
Definition at line 658 of file sound.c. References BUDDY_ARRIVE, BUDDY_AWAY, BUDDY_LEAVE, cGetLocalPref(), FIRSTMSG, playsoundfile(), RECEIVE, and SEND. Referenced by contact_login(), contact_logoff(), eb_chat_room_show_message(), eb_chat_window_display_remote_message(), and send_message().
00659 { 00660 if (do_no_sound_when_away && is_away) 00661 return; 00662 switch(sound) 00663 { 00664 case BUDDY_AWAY: 00665 { 00666 playsoundfile(cGetLocalPref("BuddyAwayFilename")); 00667 } 00668 break; 00669 case BUDDY_ARRIVE: 00670 { 00671 playsoundfile(cGetLocalPref("BuddyArriveFilename")); 00672 } 00673 break; 00674 case BUDDY_LEAVE: 00675 { 00676 playsoundfile(cGetLocalPref("BuddyLeaveFilename")); 00677 } 00678 break; 00679 case SEND: 00680 { 00681 playsoundfile(cGetLocalPref("SendFilename")); 00682 } 00683 break; 00684 case RECEIVE: 00685 { 00686 playsoundfile(cGetLocalPref("ReceiveFilename")); 00687 break; 00688 } 00689 case FIRSTMSG: 00690 { 00691 playsoundfile(cGetLocalPref("FirstMsgFilename")); 00692 break; 00693 } 00694 default: 00695 return; 00696 } 00697 } |
|
Definition at line 590 of file sound.c. References auscale(), fGetLocalPref(), file_ok(), and play_soundfile. Referenced by do_trigger_action(), play_sound(), and testsoundfile().
00591 { 00592 00593 #ifdef _WIN32 00594 if(!play_soundfile) 00595 return; 00596 00597 if (!file_ok(soundfile)) 00598 return; 00599 00600 PlaySound(soundfile,NULL,SND_FILENAME|SND_SYNC); 00601 return; 00602 #endif 00603 #ifndef __MINGW32__ 00604 gint pid; 00605 00606 if(!play_soundfile) 00607 return; 00608 00609 if (!file_ok(soundfile)) 00610 return; 00611 00612 pid = fork(); 00613 if (pid < 0) 00614 { 00615 fprintf(stderr, "in playsoundfile(), fork failed!\n"); 00616 return; 00617 } 00618 else if (pid == 0) 00619 { 00620 /* we're the child process, play the sound... */ 00621 if(fGetLocalPref("SoundVolume") != 0.0) 00622 { 00623 gchar tmp_soundfile[9] = "ebXXXXXX"; 00624 00625 if (mkstemp(tmp_soundfile) == -1) /* create name for auscale */ 00626 { 00627 fprintf(stderr, "in playsoundfile(), mkstemp failed!\n"); 00628 return; 00629 } 00630 00631 soundfile = auscale(soundfile,tmp_soundfile,fGetLocalPref("SoundVolume")); 00632 00633 play_soundfile(soundfile); 00634 00635 if (unlink(tmp_soundfile)) 00636 fprintf(stderr, 00637 "in playsoundfile(), unlink failed!\n"); 00638 } 00639 else 00640 { 00641 play_soundfile(soundfile); 00642 } 00643 00644 _exit(0); 00645 00646 } 00647 else 00648 { 00649 /* We're the parent process... */ 00650 gtk_timeout_add(100, (GtkFunction)clean_pid, NULL); 00651 } 00652 #endif 00653 00654 } |
|
Definition at line 699 of file sound.c. References arts_shutdown(), can_play_arts(), can_play_audio(), can_play_esd(), DBG_CORE, eb_debug, play_arts_file(), play_audio(), play_esd_file(), play_soundfile, and shutdown_sounddrv. Referenced by main().
00700 { 00701 /* Determine which sound module will be used to play sounds */ 00702 00703 00704 if(can_play_arts()) 00705 { 00706 eb_debug(DBG_CORE,"Using arts sound\n"); 00707 play_soundfile = play_arts_file; 00708 shutdown_sounddrv = arts_shutdown; 00709 } 00710 else if(can_play_esd()) 00711 { 00712 eb_debug(DBG_CORE,"Using esd sound\n"); 00713 play_soundfile = play_esd_file; 00714 shutdown_sounddrv = NULL; 00715 } 00716 /* handle sound direct to /dev/audio */ 00717 else if (can_play_audio()) 00718 { 00719 eb_debug(DBG_CORE,"Using raw audio\n"); 00720 play_soundfile = play_audio; 00721 shutdown_sounddrv = NULL; 00722 } 00723 else 00724 { 00725 eb_debug(DBG_CORE,"Sound not available\n"); 00726 play_soundfile = NULL; 00727 shutdown_sounddrv = NULL; 00728 } 00729 } |
|
Definition at line 731 of file sound.c. References shutdown_sounddrv. Referenced by main().
00732 { 00733 if(shutdown_sounddrv != NULL) { 00734 shutdown_sounddrv(); 00735 } 00736 } |
|
Definition at line 72 of file sound.c. Referenced by playsoundfile(), and sound_init(). |
|
Definition at line 73 of file sound.c. Referenced by sound_init(), and sound_shutdown(). |