class: SoundStream
authorStefan Vogel <sv@exept.de>
Thu, 03 Apr 2014 15:21:31 +0200
changeset 3216 fdbf3212c1e9
parent 3215 342d793d938c
child 3217 6950d2d3aecf
class: SoundStream fix error processing
SoundStream.st
--- a/SoundStream.st	Fri Mar 28 09:00:39 2014 +0100
+++ b/SoundStream.st	Thu Apr 03 15:21:31 2014 +0200
@@ -2098,7 +2098,7 @@
 !
 
 openWithMode:aMode attributes:attributeSpec
-    |ok|
+    |ok error|
 
 %{
 #ifdef IRIS_AUDIO
@@ -2106,33 +2106,33 @@
     ALconfig config;
     ALport p;
     long params[] = {
-	AL_INPUT_SOURCE, AL_INPUT_MIC,
-	AL_INPUT_RATE, 8000,
-	AL_OUTPUT_RATE, 8000,
+        AL_INPUT_SOURCE, AL_INPUT_MIC,
+        AL_INPUT_RATE, 8000,
+        AL_OUTPUT_RATE, 8000,
     };
 
     config = ALnewconfig();
     if (__INST(numberOfChannels) == __MKSMALLINT(2))
-	ALsetchannels(config, AL_STEREO);
+        ALsetchannels(config, AL_STEREO);
     else
-	ALsetchannels(config, AL_MONO);
+        ALsetchannels(config, AL_MONO);
     if (__INST(bitsPerSample) == __MKSMALLINT(16))
-	ALsetwidth(config, AL_SAMPLE_16);
+        ALsetwidth(config, AL_SAMPLE_16);
     else
-	ALsetwidth(config, AL_SAMPLE_8);
+        ALsetwidth(config, AL_SAMPLE_8);
 
     if (__isSmallInteger(__INST(sampleRate)))
-	params[3] = params[5] = __intVal(__INST(sampleRate));
+        params[3] = params[5] = __intVal(__INST(sampleRate));
 
     ALsetparams(AL_DEFAULT_DEVICE, params, 6);
     p = ALopenport("smallchat", (char *)_stringVal(aMode), config);
     if (p) {
-	OBJ t;
+        OBJ t;
 
-	t = __MKEXTERNALADDRESS(p); __INST(alPort) = t; __STORE(self, t);
+        t = __MKEXTERNALADDRESS(p); __INST(alPort) = t; __STORE(self, t);
     } else {
-	__INST(alPort) = nil;
-	goto out;
+        __INST(alPort) = nil;
+        goto out;
     }
     __INST(binary) = true;
 
@@ -2142,27 +2142,27 @@
      */
     config = ALgetconfig(p);
     switch (ALgetchannels(config)) {
-	default:
-	    /* cannot happen */
-	case AL_MONO:
-	    __INST(numberOfChannels) = __MKSMALLINT(1);
-	    break;
-	case AL_STEREO:
-	    __INST(numberOfChannels) = __MKSMALLINT(2);
-	    break;
+        default:
+            /* cannot happen */
+        case AL_MONO:
+            __INST(numberOfChannels) = __MKSMALLINT(1);
+            break;
+        case AL_STEREO:
+            __INST(numberOfChannels) = __MKSMALLINT(2);
+            break;
     }
     switch (ALgetwidth(config)) {
-	default:
-	    /* cannot happen */
-	case AL_SAMPLE_8:
-	    __INST(bitsPerSample) = __MKSMALLINT(8);
-	    break;
-	case AL_SAMPLE_16:
-	    __INST(bitsPerSample) = __MKSMALLINT(16);
-	    break;
-	case AL_SAMPLE_24:
-	    __INST(bitsPerSample) = __MKSMALLINT(24);
-	    break;
+        default:
+            /* cannot happen */
+        case AL_SAMPLE_8:
+            __INST(bitsPerSample) = __MKSMALLINT(8);
+            break;
+        case AL_SAMPLE_16:
+            __INST(bitsPerSample) = __MKSMALLINT(16);
+            break;
+        case AL_SAMPLE_24:
+            __INST(bitsPerSample) = __MKSMALLINT(24);
+            break;
     }
     ALgetparams(AL_DEFAULT_DEVICE, params, 6);
     __INST(sampleRate) = __MKSMALLINT(params[3]);
@@ -2186,8 +2186,8 @@
 
     /* Create the DS object */
     if ((result = DirectSoundCreate(NULL, &t_pDirectSound, NULL)) != DS_OK) {
-	console_fprintf(stderr,"SoundStream: Cannot open default sound device!!\n");
-	goto out;
+        console_fprintf(stderr,"SoundStream: Cannot open default sound device!!\n");
+        goto out;
     }
 
     /* Define the wave format structure */
@@ -2208,20 +2208,20 @@
 
     /* Create the primary DS buffer */
     if ((result = IDirectSound_CreateSoundBuffer(t_pDirectSound, &primarydsbDesc,
-						 &t_pDSPrimeBuffer, NULL)) != DS_OK) {
-	console_fprintf(stderr,"SoundStream: Cannot get the primary DS buffer address!\n");
-	IDirectSound_Release(t_pDirectSound);
-	goto out;
+                                                 &t_pDSPrimeBuffer, NULL)) != DS_OK) {
+        console_fprintf(stderr,"SoundStream: Cannot get the primary DS buffer address!\n");
+        IDirectSound_Release(t_pDirectSound);
+        goto out;
     }
 
     /* Set the primary DS buffer sound format.  We have to do this because
        the default primary buffer is 8-bit, 22kHz! */
     if ((result = IDirectSoundBuffer_SetFormat(t_pDSPrimeBuffer, &wfFormat)) != DS_OK) {
-	console_fprintf(stderr,"SoundStream: Cannot set the primary DS buffer to proper sound format (%x) (%d)!\n", result, result);
-	IDirectSoundBuffer_Stop(t_pDSPrimeBuffer);
-	IDirectSoundBuffer_Release(t_pDSPrimeBuffer);
-	IDirectSound_Release(t_pDirectSound);
-	goto out;
+        console_fprintf(stderr,"SoundStream: Cannot set the primary DS buffer to proper sound format (%x) (%d)!\n", result, result);
+        IDirectSoundBuffer_Stop(t_pDSPrimeBuffer);
+        IDirectSoundBuffer_Release(t_pDSPrimeBuffer);
+        IDirectSound_Release(t_pDirectSound);
+        goto out;
     }
 #  endif /* 0 */
 
@@ -2237,22 +2237,22 @@
 
     /* Create the secondary DS buffer */
     if ((result = IDirectSound_CreateSoundBuffer(t_pDirectSound, &dsbdDesc, &t_pDSBuffer, NULL)) != DS_OK) {
-	console_fprintf(stderr,"SoundStream: couldn't create sound buffer!\n");
-	IDirectSoundBuffer_Stop(t_pDSPrimeBuffer);
-	IDirectSoundBuffer_Release(t_pDSPrimeBuffer);
-	IDirectSound_Release(t_pDirectSound);
-	goto out;
+        console_fprintf(stderr,"SoundStream: couldn't create sound buffer!\n");
+        IDirectSoundBuffer_Stop(t_pDSPrimeBuffer);
+        IDirectSoundBuffer_Release(t_pDSPrimeBuffer);
+        IDirectSound_Release(t_pDirectSound);
+        goto out;
     }
 
     /* Lock the DS buffer */
     if ((result = IDirectSoundBuffer_Lock(t_pDSBuffer, 0, t_cbBufSize, (LPLPVOID)&pDSBuffData,
-					  &dwDataLen, NULL, NULL, 0)) != DS_OK) {
-	console_fprintf(stderr,"SoundStream: couldn't lock sound buffer!\n");
-	IDirectSoundBuffer_Stop(t_pDSBuffer);
-	IDirectSoundBuffer_Stop(t_pDSPrimeBuffer);
-	IDirectSoundBuffer_Release(t_pDSPrimeBuffer);
-	IDirectSound_Release(t_pDirectSound);
-	goto out;
+                                          &dwDataLen, NULL, NULL, 0)) != DS_OK) {
+        console_fprintf(stderr,"SoundStream: couldn't lock sound buffer!\n");
+        IDirectSoundBuffer_Stop(t_pDSBuffer);
+        IDirectSoundBuffer_Stop(t_pDSPrimeBuffer);
+        IDirectSoundBuffer_Release(t_pDSPrimeBuffer);
+        IDirectSound_Release(t_pDirectSound);
+        goto out;
     }
 
     /* Zero the DS buffer */
@@ -2260,32 +2260,32 @@
 
     /* Unlock the DS buffer */
     if ((result = IDirectSoundBuffer_Unlock(t_pDSBuffer, pDSBuffData, dwDataLen, NULL, 0)) != DS_OK) {
-	console_fprintf(stderr,"SoundStream: couldn't unlock sound buffer!\n");
-	IDirectSoundBuffer_Stop(t_pDSBuffer);
-	IDirectSoundBuffer_Stop(t_pDSPrimeBuffer);
-	IDirectSoundBuffer_Release(t_pDSPrimeBuffer);
-	IDirectSound_Release(t_pDirectSound);
-	goto out;
+        console_fprintf(stderr,"SoundStream: couldn't unlock sound buffer!\n");
+        IDirectSoundBuffer_Stop(t_pDSBuffer);
+        IDirectSoundBuffer_Stop(t_pDSPrimeBuffer);
+        IDirectSoundBuffer_Release(t_pDSPrimeBuffer);
+        IDirectSound_Release(t_pDirectSound);
+        goto out;
     }
 
     __INST(bufferOffset) = __MKSMALLINT(0);  // reset last write position to start of buffer
 
     /* Start the buffer playback */
     if ((result = IDirectSoundBuffer_Play(t_pDSBuffer, 0, 0, DSBPLAY_LOOPING) != DS_OK)) {
-	console_fprintf(stderr,"SoundStream: couldn't play sound buffer!\n");
-	IDirectSoundBuffer_Stop(t_pDSBuffer);
-	IDirectSoundBuffer_Stop(t_pDSPrimeBuffer);
-	IDirectSoundBuffer_Release(t_pDSPrimeBuffer);
-	IDirectSound_Release(t_pDirectSound);
-	ok = false;
-	goto out;
+        console_fprintf(stderr,"SoundStream: couldn't play sound buffer!\n");
+        IDirectSoundBuffer_Stop(t_pDSBuffer);
+        IDirectSoundBuffer_Stop(t_pDSPrimeBuffer);
+        IDirectSoundBuffer_Release(t_pDSPrimeBuffer);
+        IDirectSound_Release(t_pDirectSound);
+        ok = false;
+        goto out;
     }
 
     {
-	OBJ t;
+        OBJ t;
 
-	t = __MKEXTERNALADDRESS(t_pDSBuffer); __INST(pDSBuffer) = t; __STORE(self, t);
-	t = __MKEXTERNALADDRESS(t_pDirectSound); __INST(pDirectSound) = t; __STORE(self, t);
+        t = __MKEXTERNALADDRESS(t_pDSBuffer); __INST(pDSBuffer) = t; __STORE(self, t);
+        t = __MKEXTERNALADDRESS(t_pDirectSound); __INST(pDirectSound) = t; __STORE(self, t);
     }
     ok = true;
     goto out;
@@ -2300,8 +2300,8 @@
     OBJ oWaveHandle;
 
     if ((oWaveHandle = __INST(waveHandle)) != nil) {
-	ok = false;
-	goto out;
+        ok = false;
+        goto out;
     }
 
     waveFormat.wf.wFormatTag = WAVE_FORMAT_PCM;
@@ -2312,15 +2312,15 @@
     waveFormat.wf.nAvgBytesPerSec = waveFormat.wf.nSamplesPerSec * waveFormat.wf.nBlockAlign;
 
     r = waveOutOpen(&t_waveHandle,
-		    WAVE_MAPPER,
-		    (WAVEFORMAT *)&waveFormat,
-		    (DWORD_PTR)waveCallBack,
-		    (DWORD_PTR)0,
-		    CALLBACK_FUNCTION);
+                    WAVE_MAPPER,
+                    (WAVEFORMAT *)&waveFormat,
+                    (DWORD_PTR)waveCallBack,
+                    (DWORD_PTR)0,
+                    CALLBACK_FUNCTION);
     if (r != 0) {
-	console_printf("waveOutOpen\n");
-	ok = false;
-	goto out;
+        console_printf("waveOutOpen\n");
+        ok = false;
+        goto out;
     }
 
     (void)waveOutReset(t_waveHandle);
@@ -2332,9 +2332,9 @@
     total_buffers = 0;
 
     {
-	OBJ t;
+        OBJ t;
 
-	t = __MKEXTERNALADDRESS(t_waveHandle); __INST(waveHandle) = t; __STORE(self, t);
+        t = __MKEXTERNALADDRESS(t_waveHandle); __INST(waveHandle) = t; __STORE(self, t);
     }
 
 # if 0
@@ -2345,12 +2345,12 @@
      * why - DAC
      */
     {
-	char null[DATALEN];
-	int i;
-	for (i = 0; i < DATALEN; i++) {
-	    null[i] = 127;
-	}
-	audioWrite(null, DATALEN);
+        char null[DATALEN];
+        int i;
+        for (i = 0; i < DATALEN; i++) {
+            null[i] = 127;
+        }
+        audioWrite(null, DATALEN);
     }
 # endif /* 0 */
     ok = true;
@@ -2365,49 +2365,52 @@
       FILE *f;
 
       if (strcmp(__stringVal(aMode), "w") == 0) {
-	  __mode = O_WRONLY;
+          __mode = O_WRONLY;
       } else if (strcmp(__stringVal(aMode), "r") == 0) {
-	  __mode = O_RDONLY;
+          __mode = O_RDONLY;
       } else {
-	  __mode = O_RDWR;
+          __mode = O_RDWR;
       }
       do {
-	  __BEGIN_INTERRUPTABLE__
-	  __fd = open((char *) __stringVal(__INST(pathName)), __mode /* |O_NDELAY */);
-	  __END_INTERRUPTABLE__
-      } while ((__fd < 0) && (__threadErrno == EINTR));
+          __BEGIN_INTERRUPTABLE__
+          __fd = open((char *) __stringVal(__INST(pathName)), __mode /* |O_NDELAY */);
+          __END_INTERRUPTABLE__
+      } while ((__fd < 0) && (errno == EINTR));
 
       if (__fd >= 0) {
-	  /*
-	   * make it a FILE *
-	   */
-	  f = fdopen(__fd, __stringVal(aMode));
-	  if (! f) {
-	      __BEGIN_INTERRUPTABLE__
-	      close(__fd);
-	      __END_INTERRUPTABLE__
-	      ok = false;
-	      goto out;
-	  }
-	  setbuf(f, NULL);
-	  __INST(buffered) = false;
-	  __INST(handle) = __MKEXTERNALADDRESS(f);
-	  __STORESELF(handle);
+          /*
+           * make it a FILE *
+           */
+          f = fdopen(__fd, __stringVal(aMode));
+          if (! f) {
+              error = __mkSmallInteger(errno);
+              __BEGIN_INTERRUPTABLE__
+              close(__fd);
+              __END_INTERRUPTABLE__
+              ok = false;
+              goto out;
+          }
+          setbuf(f, NULL);
+          __INST(buffered) = false;
+          __INST(handle) = __MKEXTERNALADDRESS(f);
+          __STORESELF(handle);
 
 #if defined(PCM_ENABLE_OUTPUT) && defined(PCM_ENABLE_INPUT)
 # if defined(SNDCTL_DSP_SETTRIGGER)
-	  if (__mode == O_RDWR) {
-	      int enable_bits = ~(PCM_ENABLE_OUTPUT|PCM_ENABLE_INPUT);
+          if (__mode == O_RDWR) {
+              int enable_bits = ~(PCM_ENABLE_OUTPUT|PCM_ENABLE_INPUT);
 
-	      if (ioctl(__fd, SNDCTL_DSP_SETTRIGGER, &enable_bits) == -1)
-	      {
-		  console_fprintf(stderr, "can't request synchronous start of fullduplex operation");
-	      }
-	  }
+              if (ioctl(__fd, SNDCTL_DSP_SETTRIGGER, &enable_bits) == -1)
+              {
+                  console_fprintf(stderr, "can't request synchronous start of fullduplex operation");
+              }
+          }
 # endif
 #endif
-	  ok = true;
-	  goto out;
+          ok = true;
+          goto out;
+      } else {
+          error = __mkSmallInteger(errno);
       }
   }
 #endif /* DEV_AUDIO */
@@ -2415,14 +2418,15 @@
 out:;
 %}.
     ok == false ifTrue:[
-	self openError:lastErrorNumber.
-	"normally not reached"
-	^ nil.
+        lastErrorNumber := error.
+        self openError:error.
+        "normally not reached"
+        ^ nil.
     ].
 
     ok isNil ifTrue:[
-	"its a regular file open (i.e. /dev/audio) "
-	^ super openWithMode:aMode attributes:attributeSpec.
+        "its a regular file open (i.e. /dev/audio) "
+        ^ super openWithMode:aMode attributes:attributeSpec.
     ].
 
     Lobby register:self.
@@ -2701,11 +2705,11 @@
 !SoundStream class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic2/SoundStream.st,v 1.78 2014-01-29 13:35:28 stefan Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic2/SoundStream.st,v 1.79 2014-04-03 13:21:31 stefan Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libbasic2/SoundStream.st,v 1.78 2014-01-29 13:35:28 stefan Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic2/SoundStream.st,v 1.79 2014-04-03 13:21:31 stefan Exp $'
 ! !