ftp.nice.ch/pub/next/connectivity/infosystems/Gopher.1.13.s.tar.gz#/Gopher_1.13_Source/SimpleSound.c

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.