This is SimpleSound.c in view mode; [Download] [Up]
/////////////////////////////////////////////////////////////////////// // Most of the code in this file was simply copied from the play // program from the University of Minnesota Gopher client. #import "Sound.h" #define SOUNDBUFSIZE 1400 /* A pretty good value for ethernet */ // This is a flag indicating whether we are currently playing a sound. mutex_t soundIsPlaying; // This is a flag indicating that a currently playing sound should stop asap. mutex_t soundShouldStop; int soundShouldStopFlag; // Make it global so it can be freed by other functions. static ThreadArgument *threadArgument; static int currentsocket; // Put this here to avoid "warning: Objective-C text in `.c' file". extern int NXRunAlertPanel(const char *title, const char *msg, const char *defaultButton, const char *alternateButton, const char *otherButton, ...); //////////////////////////////////////////////////////////// // This function is thread-forked. It must free the argument // before leaving. int PlaySound(ThreadArgument *theArgument) { FILE *Play; int j; char buf[SOUNDBUFSIZE]; threadArgument = theArgument; // Check that we're the only thread. if (mutex_try_lock(soundIsPlaying) == 0) { fprintf(stderr, "Error : too many threads.\n"); free(theArgument); close(currentsocket); cthread_exit(0); } currentsocket = create_socket(theArgument->hostname, theArgument->portnumber); if ( currentsocket < 0) { switch (currentsocket) { case -1 : fprintf(stderr, "Unknown host\n"); break; case -2 : fprintf(stderr, "Socket call failed\n"); break; case -3 : fprintf(stderr, "Connect call failed\n"); break; default : fprintf(stderr, "Unknown network error\n"); break; } free(theArgument); close(currentsocket); mutex_unlock(soundIsPlaying); cthread_exit(0); } writestring(currentsocket, theArgument->filename); writestring(currentsocket, "\r\n"); Play = popen(PlayCommand, "w"); while(1) { j = read(currentsocket, buf, SOUNDBUFSIZE); if (j == 0) break; fwrite(buf, 1, j, Play); if (mutex_try_lock(soundShouldStop) != 0) if (soundShouldStopFlag) { soundShouldStopFlag = 0; mutex_unlock(soundShouldStop); break; } else mutex_unlock(soundShouldStop); } free(theArgument); close(currentsocket); fclose(Play); #ifdef DEBUG fprintf(stderr, "SoundPlay exiting.\n"); #endif /* DEBUG */ sleep(2); // Wait for play to exit mutex_unlock(soundIsPlaying); cthread_exit(0); return 0; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.