summaryrefslogtreecommitdiff
blob: f77f1acc66d7358c2ea1d8abe0c6334e60b9973a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
--- drivers/common/unixdsp.c	2003-06-20 12:37:26.000000000 -0500
+++ drivers/common/unixdsp.c	2003-07-06 21:58:21.000000000 -0500
@@ -36,6 +36,7 @@
 
 static int format;
 static int dspfd;
+static int fakestereo;
 
 // fsize is in samples, not bytes(gets translated before ioctl())
 int InitUNIXDSPSound(int *rate, int bits, int fsize, int nfrags, int dev)
@@ -89,9 +90,19 @@
 
  if(ioctl(dspfd,SNDCTL_DSP_SETFRAGMENT,&x)==-1)
   printf("ERROR (continuing anyway)\n");
- x=0;
+
+ // Set mono sound.
+ // Some sound cards can only do stereo, so simulate stereo for these cards.
+ x=1;
+ fakestereo=0;
  printf("\n   Setting mono sound...");  
- if(ioctl(dspfd,SNDCTL_DSP_STEREO,&x)==-1) goto __disperror;
+ if(ioctl(dspfd,SNDCTL_DSP_CHANNELS,&x)==-1) goto __disperror;
+ if(x == 2)
+ {
+  printf("\n   Couldn't set mono, faking stereo...\n");
+  fakestereo = 1;
+ }
+ 
  printf("\n   Setting playback rate of %d hz...",*rate);
  if(ioctl(dspfd,SNDCTL_DSP_SPEED,rate)==-1) goto __disperror;
  printf("Set to %d hz\n",*rate);
@@ -107,9 +119,10 @@
 }
 
 static int16 MBuffer[2048];
+static int16 fakebuffer[4098];
 void WriteUNIXDSPSound(int32 *Buffer, int Count, int noblocking)
 {
- int P,c;
+ int P,c,i;
  int32 *src=Buffer;
 
  if(format)
@@ -127,13 +140,35 @@
   c=Count<<1;
  }
 
-//  noblocking=!noblocking; // speed testing
- if(noblocking)
+ // If a device can only support stereo, fake stereo by duplicating each item in the buffer.
+ if(fakestereo)
+ {
+  for (i=0; i <= c; i++ )
+  {
+   fakebuffer[2*i] = MBuffer[i];
+   fakebuffer[2*i+1] = MBuffer[i];
+  }
+  c = c * 2;
+  //  noblocking=!noblocking; // speed testing
+  if(noblocking)
+   {
+     struct audio_buf_info ai;
+     if(!ioctl(dspfd,SNDCTL_DSP_GETOSPACE,&ai))
+     if(ai.bytes<c)
+     return;
+   }
+  write(dspfd,(uint8 *)fakebuffer,c);
+ }
+ else
  {
-  struct audio_buf_info ai;
-  if(!ioctl(dspfd,SNDCTL_DSP_GETOSPACE,&ai))
-   if(ai.bytes<c)
-    return;
+  // noblocking=!noblocking; // speed testing
+  if(noblocking)
+  {
+    struct audio_buf_info ai;
+    if(!ioctl(dspfd,SNDCTL_DSP_GETOSPACE,&ai))
+    if(ai.bytes<c)
+     return;
+  }
+   write(dspfd,(uint8 *)MBuffer,c);
  }
- write(dspfd,(uint8 *)MBuffer,c);
 }