--- a/SoundStream.st Mon Dec 15 11:35:37 1997 +0100
+++ b/SoundStream.st Mon Dec 15 11:54:20 1997 +0100
@@ -31,8 +31,16 @@
#endif
#ifdef LINUX
+# define DEV_AUDIO
+# include <sys/soundcard.h>
+#endif
+
+#if defined(sunos) || defined(solaris)
+# define DEV_AUDIO
+#endif
+
+#ifdef DEV_AUDIO
# include <stdio.h>
-# include <sys/soundcard.h>
#endif
%}
! !
@@ -576,7 +584,8 @@
int __stereo = 0;
int __channels = 0;
-#ifdef LINUX
+#if defined(DEV_AUDIO)
+# if defined(LINUX)
if (ioctl(f, SNDCTL_DSP_GETBLKSIZE, &__blockSize) >= 0) {
blockSize = __MKSMALLINT(__blockSize);
}
@@ -592,8 +601,8 @@
if (ioctl(f, SNDCTL_DSP_GETFMTS, &__audioFormatMask) >= 0) {
audioFormatMask = __MKSMALLINT(__audioFormatMask);
}
-
-#endif
+# endif /* LINUX */
+#endif /* DEV_AUDIO */
%}.
blockSize notNil ifTrue:[
Transcript show:'blockSize: '; showCR:blockSize
@@ -653,7 +662,8 @@
int f = __intVal(fd);
int __audioFormatMask = 0;
-#ifdef LINUX
+#if defined(DEV_AUDIO)
+# if defined(LINUX)
if (ioctl(f, SNDCTL_DSP_GETFMTS, &__audioFormatMask) >= 0) {
audioFormatMask = __MKSMALLINT(__audioFormatMask);
@@ -668,7 +678,9 @@
supports_U16_BE = (__audioFormatMask & AFMT_U16_BE) ? true : false;
supports_MPEG = (__audioFormatMask & AFMT_MPEG) ? true : false;
}
-#endif
+# endif
+#endif /* DEV_AUDIO */
+
#ifdef IRIS_AUDIO
supports_U8 = true;
supports_U16_BE = true;
@@ -738,7 +750,7 @@
int f = __intVal(fd);
int __dummy;
-#ifdef LINUX
+#if defined(DEV_AUDIO) && defined(LINUX)
if (ioctl(f, SNDCTL_DSP_RESET, &__dummy) >= 0) {
RETURN (true);
}
@@ -770,7 +782,7 @@
unsigned char ub[2];
} u;
-#ifdef LINUX
+#if defined(DEV_AUDIO) && defined(LINUX)
if (__isSymbol(aSymbol)) {
if (aSymbol == @symbol(U16)) {
@@ -843,7 +855,7 @@
int f = __intVal(fd);
int __nCh = 0;
-#ifdef LINUX
+#if defined(DEV_AUDIO) && defined(LINUX)
if (__isSmallInteger(nChannels)) {
__nCh = __intVal(nChannels);
if (ioctl(f, SOUND_PCM_WRITE_CHANNELS, &__nCh) >= 0) {
@@ -878,7 +890,7 @@
int f = __intVal(fd);
int __blockSize = 0;
-#ifdef LINUX
+#if defined(DEV_AUDIO) && defined(LINUX)
if (__isSmallInteger(blockSize)) {
__blockSize = __intVal(blockSize);
if (ioctl(f, SNDCTL_DSP_SETFRAGMENT, &__blockSize) >= 0) {
@@ -908,7 +920,7 @@
int __rate = 0;
int __rateWant;
-#ifdef LINUX
+#if defined(DEV_AUDIO) && defined(LINUX)
if (__isSmallInteger(hz)) {
__rate = __rateWant = __intVal(hz);
if (ioctl(f, SOUND_PCM_WRITE_RATE, &__rate) >= 0) {
@@ -1026,38 +1038,35 @@
closeFile
"a stream has been collected - close the file"
- OperatingSystem getOSType = 'irix' ifTrue:[
-%{
+%{
#ifdef IRIS_AUDIO
- ALcloseport(_ALportVal(__INST(filePointer)));
+ ALcloseport(_ALportVal(__INST(filePointer)));
#endif
-%}
- ] ifFalse:[
-%{
- OBJ fp;
- int fd;
- FILE *f;
+#if defined(DEV_AUDIO)
+ OBJ fp;
+ int fd;
+ FILE *f;
- if ((fp = __INST(filePointer)) != nil) {
- f = __FILEVal(fp);
- __INST(filePointer) = nil;
-#ifdef LINUX
- sigsetmask(~0);
-#endif
- if (__INST(buffered) == true) {
- fflush(f);
- fclose(f);
- } else {
- fd = fileno(f);
- close(fd);
- fclose(f);
- }
-#ifdef LINUX
- sigsetmask(0);
-#endif
+ if ((fp = __INST(filePointer)) != nil) {
+ f = __FILEVal(fp);
+ __INST(filePointer) = nil;
+# ifdef LINUX
+ sigsetmask(~0);
+# endif
+ if (__INST(buffered) == true) {
+ fflush(f);
+ fclose(f);
+ } else {
+ fd = fileno(f);
+ close(fd);
+ fclose(f);
}
+# ifdef LINUX
+ sigsetmask(0);
+# endif
+ }
+#endif /* DEV_AUDIO */
%}
- ]
!
flush
@@ -1079,7 +1088,7 @@
RETURN(self);
#endif
-#ifdef LINUX
+#if defined(DEV_AUDIO) && defined(LINUX)
if (__isSmallInteger(fd)) {
int f = __intVal(fd);
/* ... */
@@ -1171,7 +1180,7 @@
}
#endif
-#ifdef LINUX
+#if defined(DEV_AUDIO)
/*
* redefine to work around a bug in the linux sound driver;
* if a write is interrupted (EINTR), it is not defined, how many
@@ -1199,7 +1208,9 @@
if ( (offs >= 0) && (cnt >= 0) && (objSize >= (cnt + offs)) ) {
cp = (char *)__InstPtr(anObject) + OHDR_SIZE + offs;
+# ifdef LINUX
sigsetmask(~0);
+# endif
do {
n = cnt;
if (n > 4096) n = 4096;
@@ -1214,7 +1225,9 @@
cnt -= n;
}
} while (cnt);
+# ifdef LINUX
sigsetmask(0);
+# endif
}
RETURN (count);
}
@@ -1227,11 +1240,6 @@
!
openWithMode:aMode
- OperatingSystem getOSType = 'irix' ifFalse:[
- "its a regular file open"
- ^ super openWithMode:aMode
- ].
-
((aMode = 'r') or:[aMode = 'w']) ifFalse:[
self error:'invalid mode'.
^ nil
@@ -1302,10 +1310,12 @@
__INST(sampleRate) = __MKSMALLINT(params[3]);
ALfreeconfig(config);
+ RETURN (self);
}
#endif
%}.
- ^ self
+ "its a regular file open (i.e. /dev/audio) "
+ ^ super openWithMode:aMode
! !
!SoundStream methodsFor:'sine wave generation'!
@@ -1378,4 +1388,4 @@
!SoundStream class methodsFor:'documentation'!
version
-^ '$Header: /cvs/stx/stx/libbasic2/SoundStream.st,v 1.27 1997-12-15 10:35:37 cg Exp $'! !
+^ '$Header: /cvs/stx/stx/libbasic2/SoundStream.st,v 1.28 1997-12-15 10:54:20 cg Exp $'! !