Mercurial > sdl-ios-xcode
annotate src/audio/SDL_audiodev.c @ 1551:02e19471a694
Fixed bug #4
[Note: I'm applying this patch since it's a cleaner version of what's already implemented, and supports this controller on older kernels. I'll ask to make sure this doesn't break on the new kernels where it's no longer necessary]
Date: Mon, 21 Mar 2005 09:41:11 -0500
From: Chris Nelson
Subject: SDL Patch
Hey, Ryan.
I submitted the following patch about a year ago. It's just a simple
patch for the linux port, to make multiple joysticks each appear to SDL
as their own device, if they are on the same USB port (specifically,
these guys
<http://www.consoleplus.co.uk/product_info.php?pName=super-joybox-5-quad-joypad-converter>,
which allow 4 Playstation2 controllers to be accessed via a single USB
port). Without this patch, SDL pretty much drops the ball, and reports
that there are 4 joysticks available when less than that number are
plugged in.
My work built upon the work of another person with the same device. When
I submitted the patch to the list, he tested it, but it didn't work for
him, so the patch was never accepted. Maybe about 3 times in the past
year, I've tried to email the guy, to see if he couldn't run my new
version, complete with debug code to diagnose the problem he was having.
He never got back to me.
So, I'm attaching the patch. I wish I knew why it didn't work for him,
but I've been using it for the last year with no problems. Let me know
if you need any more information, or have any ideas as to how I could
test it. I'd like to see it in the tree, but I want to make sure it works.
-Chris
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sun, 19 Mar 2006 06:31:34 +0000 |
parents | d910939febfa |
children | 12b6d331d82a |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1138
diff
changeset
|
3 Copyright (C) 1997-2006 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1138
diff
changeset
|
6 modify it under the terms of the GNU Lesser General Public |
0 | 7 License as published by the Free Software Foundation; either |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1138
diff
changeset
|
8 version 2.1 of the License, or (at your option) any later version. |
0 | 9 |
10 This library is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1138
diff
changeset
|
13 Lesser General Public License for more details. |
0 | 14 |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1138
diff
changeset
|
15 You should have received a copy of the GNU Lesser General Public |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1138
diff
changeset
|
16 License along with this library; if not, write to the Free Software |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1138
diff
changeset
|
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 18 |
19 Sam Lantinga | |
252
e8157fcb3114
Updated the source with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents:
94
diff
changeset
|
20 slouken@libsdl.org |
0 | 21 */ |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
22 #include "SDL_config.h" |
0 | 23 |
24 /* Get the name of the audio device we use for output */ | |
25 | |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
26 #if SDL_AUDIO_DRIVER_OPENBSD || SDL_AUDIO_DRIVER_OSS || SDL_AUDIO_DRIVER_SUNAUDIO |
0 | 27 |
28 #include <fcntl.h> | |
29 #include <sys/types.h> | |
30 #include <sys/stat.h> | |
31 | |
1358
c71e05b4dc2e
More header massaging... works great on Windows. ;-)
Sam Lantinga <slouken@libsdl.org>
parents:
1338
diff
changeset
|
32 #include "SDL_stdinc.h" |
0 | 33 #include "SDL_audiodev_c.h" |
34 | |
35 #ifndef _PATH_DEV_DSP | |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
36 #if defined(__NETBSD__) || defined(__OPENBSD__) |
94
ae6e6b73333f
Cleaned up the OpenBSD port, thanks to Peter Valchev
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
37 #define _PATH_DEV_DSP "/dev/audio" |
ae6e6b73333f
Cleaned up the OpenBSD port, thanks to Peter Valchev
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
38 #else |
ae6e6b73333f
Cleaned up the OpenBSD port, thanks to Peter Valchev
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
39 #define _PATH_DEV_DSP "/dev/dsp" |
ae6e6b73333f
Cleaned up the OpenBSD port, thanks to Peter Valchev
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
40 #endif |
0 | 41 #endif |
42 #ifndef _PATH_DEV_DSP24 | |
43 #define _PATH_DEV_DSP24 "/dev/sound/dsp" | |
44 #endif | |
45 #ifndef _PATH_DEV_AUDIO | |
46 #define _PATH_DEV_AUDIO "/dev/audio" | |
47 #endif | |
48 | |
49 | |
50 int SDL_OpenAudioPath(char *path, int maxlen, int flags, int classic) | |
51 { | |
52 const char *audiodev; | |
53 int audio_fd; | |
54 char audiopath[1024]; | |
55 | |
56 /* Figure out what our audio device is */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
57 if ( ((audiodev=SDL_getenv("SDL_PATH_DSP")) == NULL) && |
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
58 ((audiodev=SDL_getenv("AUDIODEV")) == NULL) ) { |
0 | 59 if ( classic ) { |
60 audiodev = _PATH_DEV_AUDIO; | |
61 } else { | |
62 struct stat sb; | |
63 | |
64 /* Added support for /dev/sound/\* in Linux 2.4 */ | |
1138
fcfb783a3ca2
Commercial-OSS-on-Solaris patch...
Ryan C. Gordon <icculus@icculus.org>
parents:
1035
diff
changeset
|
65 if ( ((stat("/dev/sound", &sb) == 0) && S_ISDIR(sb.st_mode)) && |
fcfb783a3ca2
Commercial-OSS-on-Solaris patch...
Ryan C. Gordon <icculus@icculus.org>
parents:
1035
diff
changeset
|
66 ((stat(_PATH_DEV_DSP24, &sb) == 0) && S_ISCHR(sb.st_mode)) ) { |
0 | 67 audiodev = _PATH_DEV_DSP24; |
68 } else { | |
69 audiodev = _PATH_DEV_DSP; | |
70 } | |
71 } | |
72 } | |
73 audio_fd = open(audiodev, flags, 0); | |
74 | |
75 /* If the first open fails, look for other devices */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
76 if ( (audio_fd < 0) && (SDL_strlen(audiodev) < (sizeof(audiopath)-3)) ) { |
0 | 77 int exists, instance; |
78 struct stat sb; | |
79 | |
80 instance = 1; | |
81 do { /* Don't use errno ENOENT - it may not be thread-safe */ | |
1338
604d73db6802
Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
82 SDL_snprintf(audiopath, SDL_arraysize(audiopath), |
604d73db6802
Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
83 "%s%d", audiodev, instance++); |
0 | 84 exists = 0; |
85 if ( stat(audiopath, &sb) == 0 ) { | |
86 exists = 1; | |
87 audio_fd = open(audiopath, flags, 0); | |
88 } | |
89 } while ( exists && (audio_fd < 0) ); | |
90 audiodev = audiopath; | |
91 } | |
92 if ( path != NULL ) { | |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
93 SDL_strlcpy(path, audiodev, maxlen); |
0 | 94 path[maxlen-1] = '\0'; |
95 } | |
96 return(audio_fd); | |
97 } | |
98 | |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
99 #elif SDL_AUDIO_DRIVER_PAUD |
0 | 100 |
101 /* Get the name of the audio device we use for output */ | |
102 | |
103 #include <sys/types.h> | |
104 #include <sys/stat.h> | |
105 | |
1358
c71e05b4dc2e
More header massaging... works great on Windows. ;-)
Sam Lantinga <slouken@libsdl.org>
parents:
1338
diff
changeset
|
106 #include "SDL_stdinc.h" |
0 | 107 #include "SDL_audiodev_c.h" |
108 | |
109 #ifndef _PATH_DEV_DSP | |
110 #define _PATH_DEV_DSP "/dev/%caud%c/%c" | |
111 #endif | |
112 | |
113 char devsettings[][3] = | |
114 { | |
115 { 'p', '0', '1' }, { 'p', '0', '2' }, { 'p', '0', '3' }, { 'p', '0', '4' }, | |
116 { 'p', '1', '1' }, { 'p', '1', '2' }, { 'p', '1', '3' }, { 'p', '1', '4' }, | |
117 { 'p', '2', '1' }, { 'p', '2', '2' }, { 'p', '2', '3' }, { 'p', '2', '4' }, | |
118 { 'p', '3', '1' }, { 'p', '3', '2' }, { 'p', '3', '3' }, { 'p', '3', '4' }, | |
119 { 'b', '0', '1' }, { 'b', '0', '2' }, { 'b', '0', '3' }, { 'b', '0', '4' }, | |
120 { 'b', '1', '1' }, { 'b', '1', '2' }, { 'b', '1', '3' }, { 'b', '1', '4' }, | |
121 { 'b', '2', '1' }, { 'b', '2', '2' }, { 'b', '2', '3' }, { 'b', '2', '4' }, | |
122 { 'b', '3', '1' }, { 'b', '3', '2' }, { 'b', '3', '3' }, { 'b', '3', '4' }, | |
123 { '\0', '\0', '\0' } | |
124 }; | |
125 | |
126 static int OpenUserDefinedDevice(char *path, int maxlen, int flags) | |
127 { | |
128 const char *audiodev; | |
129 int audio_fd; | |
130 | |
131 /* Figure out what our audio device is */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
132 if ((audiodev=SDL_getenv("SDL_PATH_DSP")) == NULL) { |
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
133 audiodev=SDL_getenv("AUDIODEV"); |
0 | 134 } |
135 if ( audiodev == NULL ) { | |
136 return -1; | |
137 } | |
138 audio_fd = open(audiodev, flags, 0); | |
139 if ( path != NULL ) { | |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
140 SDL_strlcpy(path, audiodev, maxlen); |
0 | 141 path[maxlen-1] = '\0'; |
142 } | |
143 return audio_fd; | |
144 } | |
145 | |
146 int SDL_OpenAudioPath(char *path, int maxlen, int flags, int classic) | |
147 { | |
148 struct stat sb; | |
149 int audio_fd; | |
150 char audiopath[1024]; | |
151 int cycle; | |
152 | |
153 audio_fd = OpenUserDefinedDevice(path,maxlen,flags); | |
154 if ( audio_fd != -1 ) { | |
155 return audio_fd; | |
156 } | |
157 | |
158 cycle = 0; | |
159 while( devsettings[cycle][0] != '\0' ) { | |
1338
604d73db6802
Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
160 SDL_snprintf( audiopath, SDL_arraysize(audiopath), |
0 | 161 _PATH_DEV_DSP, |
162 devsettings[cycle][0], | |
163 devsettings[cycle][1], | |
164 devsettings[cycle][2]); | |
165 | |
166 if ( stat(audiopath, &sb) == 0 ) { | |
167 audio_fd = open(audiopath, flags, 0); | |
168 if ( audio_fd > 0 ) { | |
169 if ( path != NULL ) { | |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
170 SDL_strlcpy( path, audiopath, maxlen ); |
0 | 171 } |
172 return audio_fd; | |
173 } | |
174 } | |
175 } | |
176 return -1; | |
177 } | |
178 | |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
179 #endif /* Audio driver selection */ |