author | Sam Lantinga <slouken@libsdl.org> |
Mon, 04 Aug 2003 00:52:42 +0000 | |
changeset 663 | 8bedd6d61642 |
parent 424 | b82518082828 |
child 718 | cbc0f7fabd1c |
permissions | -rw-r--r-- |
0 | 1 |
/* |
2 |
SDL - Simple DirectMedia Layer |
|
297
f6ffac90895c
Updated copyright information for 2002
Sam Lantinga <slouken@libsdl.org>
parents:
283
diff
changeset
|
3 |
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga |
0 | 4 |
|
5 |
This library is free software; you can redistribute it and/or |
|
6 |
modify it under the terms of the GNU Library General Public |
|
7 |
License as published by the Free Software Foundation; either |
|
8 |
version 2 of the License, or (at your option) any later version. |
|
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 |
|
13 |
Library General Public License for more details. |
|
14 |
||
15 |
You should have received a copy of the GNU Library General Public |
|
16 |
License along with this library; if not, write to the Free |
|
17 |
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
18 |
||
19 |
Sam Lantinga |
|
252
e8157fcb3114
Updated the source with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents:
0
diff
changeset
|
20 |
slouken@libsdl.org |
0 | 21 |
*/ |
22 |
||
23 |
#include <stdlib.h> |
|
24 |
#include <stdio.h> |
|
25 |
#include <string.h> |
|
26 |
#include <errno.h> |
|
27 |
#include <unistd.h> |
|
28 |
#include <fcntl.h> |
|
29 |
#include <signal.h> |
|
30 |
#include <sys/types.h> |
|
31 |
#include <sys/time.h> |
|
32 |
#include <sched.h> |
|
33 |
#include <sys/asoundlib.h> |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
34 |
#include <sys/select.h> |
0 | 35 |
|
36 |
#include "SDL_audio.h" |
|
37 |
#include "SDL_error.h" |
|
38 |
#include "SDL_audiomem.h" |
|
39 |
#include "SDL_audio_c.h" |
|
40 |
#include "SDL_timer.h" |
|
41 |
#include "SDL_nto_audio.h" |
|
42 |
||
43 |
/* The tag name used by NTO audio */ |
|
44 |
#define DRIVER_NAME "nto" |
|
45 |
||
46 |
/* default channel communication parameters */ |
|
47 |
#define DEFAULT_CPARAMS_RATE 22050 |
|
48 |
#define DEFAULT_CPARAMS_VOICES 1 |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
49 |
#define DEFAULT_CPARAMS_FRAG_SIZE 4096 |
0 | 50 |
#define DEFAULT_CPARAMS_FRAGS_MIN 1 |
283
3d8b6b9f1e18
Date: Mon, 18 Feb 2002 16:46:59 +1200
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
51 |
#define DEFAULT_CPARAMS_FRAGS_MAX 1 |
0 | 52 |
|
53 |
/* Open the audio device for playback, and don't block if busy */ |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
54 |
#define OPEN_FLAGS SND_PCM_OPEN_PLAYBACK |
0 | 55 |
|
56 |
/* Audio driver functions */ |
|
57 |
static int NTO_OpenAudio(_THIS, SDL_AudioSpec *spec); |
|
58 |
static void NTO_WaitAudio(_THIS); |
|
59 |
static void NTO_PlayAudio(_THIS); |
|
60 |
static Uint8 *NTO_GetAudioBuf(_THIS); |
|
61 |
static void NTO_CloseAudio(_THIS); |
|
62 |
||
63 |
static snd_pcm_channel_status_t cstatus; |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
64 |
static snd_pcm_channel_params_t cparams; |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
65 |
static snd_pcm_channel_setup_t csetup; |
0 | 66 |
|
67 |
/* PCM transfer channel parameters initialize function */ |
|
68 |
static void init_pcm_cparams(snd_pcm_channel_params_t* cparams) |
|
69 |
{ |
|
70 |
memset(cparams,0,sizeof(snd_pcm_channel_params_t)); |
|
71 |
||
72 |
cparams->channel = SND_PCM_CHANNEL_PLAYBACK; |
|
73 |
cparams->mode = SND_PCM_MODE_BLOCK; |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
74 |
cparams->start_mode = SND_PCM_START_DATA; |
0 | 75 |
cparams->stop_mode = SND_PCM_STOP_STOP; |
76 |
cparams->format.format = SND_PCM_SFMT_S16_LE; |
|
77 |
cparams->format.interleave = 1; |
|
78 |
cparams->format.rate = DEFAULT_CPARAMS_RATE; |
|
79 |
cparams->format.voices = DEFAULT_CPARAMS_VOICES; |
|
80 |
cparams->buf.block.frag_size = DEFAULT_CPARAMS_FRAG_SIZE; |
|
81 |
cparams->buf.block.frags_min = DEFAULT_CPARAMS_FRAGS_MIN; |
|
82 |
cparams->buf.block.frags_max = DEFAULT_CPARAMS_FRAGS_MAX; |
|
83 |
} |
|
84 |
||
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
85 |
static int Audio_Available(void) |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
86 |
{ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
87 |
/* |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
88 |
See if we can open a nonblocking channel. |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
89 |
Return value '1' means we can. |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
90 |
Return value '0' means we cannot. |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
91 |
*/ |
0 | 92 |
|
93 |
int available; |
|
94 |
int rval; |
|
95 |
snd_pcm_t *handle; |
|
96 |
||
97 |
available = 0; |
|
98 |
handle = NULL; |
|
99 |
||
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
100 |
rval = snd_pcm_open_preferred(&handle, NULL, NULL, OPEN_FLAGS); |
0 | 101 |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
102 |
if (rval >= 0){ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
103 |
available = 1; |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
104 |
|
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
105 |
if ((rval = snd_pcm_close(handle)) < 0){ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
106 |
SDL_SetError("snd_pcm_close failed: %s\n",snd_strerror(rval)); |
0 | 107 |
available = 0; |
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
108 |
} |
0 | 109 |
} |
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
110 |
else{ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
111 |
SDL_SetError("snd_pcm_open failed: %s\n", snd_strerror(rval)); |
0 | 112 |
} |
113 |
||
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
114 |
#ifdef DEBUG_AUDIO |
0 | 115 |
fprintf(stderr,"AudioAvailable rtns %d\n", available); |
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
116 |
#endif |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
117 |
|
0 | 118 |
return(available); |
119 |
} |
|
120 |
||
121 |
static void Audio_DeleteDevice(SDL_AudioDevice *device) |
|
122 |
{ |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
123 |
#ifdef DEBUG_AUDIO |
0 | 124 |
fprintf(stderr,"Audio_DeleteDevice\n"); |
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
125 |
#endif |
0 | 126 |
|
127 |
free(device->hidden); |
|
128 |
free(device); |
|
129 |
} |
|
130 |
||
131 |
static SDL_AudioDevice *Audio_CreateDevice(int devindex) |
|
132 |
{ |
|
133 |
SDL_AudioDevice *this; |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
134 |
#ifdef DEBUG_AUDIO |
0 | 135 |
fprintf(stderr,"Audio_CreateDevice\n"); |
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
136 |
#endif |
0 | 137 |
/* Initialize all variables that we clean on shutdown */ |
138 |
this = (SDL_AudioDevice *)malloc(sizeof(SDL_AudioDevice)); |
|
139 |
if ( this ) { |
|
140 |
memset(this, 0, (sizeof *this)); |
|
141 |
this->hidden = (struct SDL_PrivateAudioData *) |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
142 |
malloc((sizeof *this->hidden)); |
0 | 143 |
} |
144 |
if ( (this == NULL) || (this->hidden == NULL) ) { |
|
145 |
SDL_OutOfMemory(); |
|
146 |
if ( this ) { |
|
147 |
free(this); |
|
148 |
} |
|
149 |
return(0); |
|
150 |
} |
|
151 |
memset(this->hidden, 0, (sizeof *this->hidden)); |
|
152 |
audio_handle = NULL; |
|
153 |
||
154 |
/* Set the function pointers */ |
|
155 |
this->OpenAudio = NTO_OpenAudio; |
|
156 |
this->WaitAudio = NTO_WaitAudio; |
|
157 |
this->PlayAudio = NTO_PlayAudio; |
|
158 |
this->GetAudioBuf = NTO_GetAudioBuf; |
|
159 |
this->CloseAudio = NTO_CloseAudio; |
|
160 |
||
161 |
this->free = Audio_DeleteDevice; |
|
162 |
||
163 |
return this; |
|
164 |
} |
|
165 |
||
663
8bedd6d61642
Date: Sat, 2 Aug 2003 16:22:51 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
424
diff
changeset
|
166 |
AudioBootStrap QNXNTOAUDIO_bootstrap = { |
8bedd6d61642
Date: Sat, 2 Aug 2003 16:22:51 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
424
diff
changeset
|
167 |
DRIVER_NAME, "QNX6 NTO PCM audio", |
0 | 168 |
Audio_Available, Audio_CreateDevice |
169 |
}; |
|
170 |
||
171 |
/* This function waits until it is possible to write a full sound buffer */ |
|
172 |
static void NTO_WaitAudio(_THIS) |
|
173 |
{ |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
174 |
fd_set wfds; |
0 | 175 |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
176 |
FD_SET( audio_fd, &wfds ); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
177 |
switch( select( audio_fd + 1, NULL, &wfds, NULL, NULL ) ) |
0 | 178 |
{ |
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
179 |
case -1: |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
180 |
case 0: |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
181 |
/* Error */ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
182 |
SDL_SetError("select() in NTO_WaitAudio failed: %s\n", strerror(errno)); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
183 |
break; |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
184 |
default: |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
185 |
if(FD_ISSET(audio_fd, &wfds)) |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
186 |
return; |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
187 |
} |
0 | 188 |
} |
189 |
||
190 |
static void NTO_PlayAudio(_THIS) |
|
191 |
{ |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
192 |
int written, rval; |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
193 |
int towrite; |
0 | 194 |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
195 |
#ifdef DEBUG_AUDIO |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
196 |
fprintf(stderr, "NTO_PlayAudio\n"); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
197 |
#endif |
0 | 198 |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
199 |
if( !this->enabled){ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
200 |
return; |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
201 |
} |
0 | 202 |
|
203 |
towrite = pcm_len; |
|
204 |
||
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
205 |
/* Write the audio data, checking for EAGAIN (buffer full) and underrun */ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
206 |
do { |
0 | 207 |
written = snd_pcm_plugin_write(audio_handle, pcm_buf, towrite); |
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
208 |
#ifdef DEBUG_AUDIO |
0 | 209 |
fprintf(stderr, "NTO_PlayAudio: written = %d towrite = %d\n",written,towrite); |
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
210 |
#endif |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
211 |
if (written != towrite){ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
212 |
if ((errno == EAGAIN) || (errno == EWOULDBLOCK)){ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
213 |
SDL_Delay(1); /* Let a little CPU time go by and try to write again */ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
214 |
#ifdef DEBUG_AUDIO |
0 | 215 |
fprintf(stderr, "errno == EAGAIN written %d\n", written); |
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
216 |
#endif |
0 | 217 |
towrite -= written; //we wrote some data |
218 |
continue; |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
219 |
} |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
220 |
else if((errno == EINVAL) || (errno == EIO)){ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
221 |
if(errno == EIO){ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
222 |
#ifdef DEBUG_AUDIO |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
223 |
fprintf(stderr,"snd_pcm_plugin_write failed EIO: %s\n", snd_strerror(written)); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
224 |
#endif |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
225 |
} |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
226 |
if(errno == EINVAL){ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
227 |
#ifdef DEBUG_AUDIO |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
228 |
fprintf(stderr,"snd_pcm_plugin_write failed EINVAL: %s\n", snd_strerror(written)); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
229 |
#endif |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
230 |
} |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
231 |
|
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
232 |
memset(&cstatus, 0, sizeof(cstatus)); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
233 |
if( (rval = snd_pcm_plugin_status(audio_handle, &cstatus)) < 0 ){ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
234 |
#ifdef DEBUG_AUDIO |
0 | 235 |
fprintf(stderr, "snd_pcm_plugin_status failed %s\n",snd_strerror(rval)); |
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
236 |
#endif |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
237 |
SDL_SetError("snd_pcm_plugin_status failed: %s\n", snd_strerror(rval)); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
238 |
return; |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
239 |
} |
0 | 240 |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
241 |
if ( (cstatus.status == SND_PCM_STATUS_UNDERRUN) || (cstatus.status == SND_PCM_STATUS_READY) ){ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
242 |
#ifdef DEBUG_AUDIO |
0 | 243 |
fprintf(stderr, "buffer underrun\n"); |
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
244 |
#endif |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
245 |
if ( (rval = snd_pcm_plugin_prepare (audio_handle,SND_PCM_CHANNEL_PLAYBACK)) < 0 ){ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
246 |
#ifdef DEBUG_AUDIO |
0 | 247 |
fprintf(stderr, "NTO_PlayAudio: prepare failed %s\n",snd_strerror(rval)); |
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
248 |
#endif |
0 | 249 |
SDL_SetError("snd_pcm_plugin_prepare failed: %s\n",snd_strerror(rval) ); |
250 |
return; |
|
251 |
} |
|
252 |
} |
|
253 |
continue; |
|
254 |
} |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
255 |
else{ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
256 |
#ifdef DEBUG_AUDIO |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
257 |
fprintf(stderr, "NTO_PlayAudio: snd_pcm_plugin_write failed unknown errno %d %s\n",errno, snd_strerror(rval)); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
258 |
#endif |
0 | 259 |
return; |
260 |
} |
|
261 |
||
262 |
} |
|
263 |
else |
|
264 |
{ |
|
265 |
towrite -= written; //we wrote all remaining data |
|
266 |
} |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
267 |
} while ( (towrite > 0) && (this->enabled) ); |
0 | 268 |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
269 |
/* If we couldn't write, assume fatal error for now */ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
270 |
if ( towrite != 0 ) { |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
271 |
this->enabled = 0; |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
272 |
} |
0 | 273 |
return; |
274 |
} |
|
275 |
||
276 |
static Uint8 *NTO_GetAudioBuf(_THIS) |
|
277 |
{ |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
278 |
#ifdef DEBUG_AUDIO |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
279 |
fprintf(stderr, "NTO_GetAudioBuf: pcm_buf %X\n",(Uint8 *)pcm_buf); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
280 |
#endif |
0 | 281 |
return(pcm_buf); |
282 |
} |
|
283 |
||
284 |
static void NTO_CloseAudio(_THIS) |
|
285 |
{ |
|
286 |
int rval; |
|
287 |
||
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
288 |
#ifdef DEBUG_AUDIO |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
289 |
fprintf(stderr, "NTO_CloseAudio\n"); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
290 |
#endif |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
291 |
|
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
292 |
this->enabled = 0; |
0 | 293 |
|
294 |
if ( audio_handle != NULL ) { |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
295 |
if ((rval = snd_pcm_plugin_flush(audio_handle,SND_PCM_CHANNEL_PLAYBACK)) < 0){ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
296 |
SDL_SetError("snd_pcm_plugin_flush failed: %s\n",snd_strerror(rval)); |
0 | 297 |
return; |
298 |
} |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
299 |
if ((rval = snd_pcm_close(audio_handle)) < 0){ |
0 | 300 |
SDL_SetError("snd_pcm_close failed: %s\n",snd_strerror(rval)); |
301 |
return; |
|
302 |
} |
|
303 |
audio_handle = NULL; |
|
304 |
} |
|
305 |
} |
|
306 |
||
307 |
static int NTO_OpenAudio(_THIS, SDL_AudioSpec *spec) |
|
308 |
{ |
|
309 |
int rval; |
|
310 |
int format; |
|
311 |
Uint16 test_format; |
|
312 |
int twidth; |
|
313 |
int found; |
|
314 |
||
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
315 |
#ifdef DEBUG_AUDIO |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
316 |
fprintf(stderr, "NTO_OpenAudio\n"); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
317 |
#endif |
0 | 318 |
|
319 |
audio_handle = NULL; |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
320 |
this->enabled = 0; |
0 | 321 |
|
322 |
if ( pcm_buf != NULL ) { |
|
323 |
free((Uint8 *)pcm_buf); |
|
324 |
pcm_buf = NULL; |
|
325 |
} |
|
326 |
||
327 |
/* initialize channel transfer parameters to default */ |
|
328 |
init_pcm_cparams(&cparams); |
|
329 |
||
330 |
/* Open the audio device */ |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
331 |
rval = snd_pcm_open_preferred(&audio_handle, NULL, NULL, OPEN_FLAGS); |
0 | 332 |
if ( rval < 0 ) { |
333 |
SDL_SetError("snd_pcm_open failed: %s\n", snd_strerror(rval)); |
|
334 |
return(-1); |
|
335 |
} |
|
336 |
||
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
337 |
/* enable count status parameter */ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
338 |
if ((rval = snd_pcm_plugin_set_disable(audio_handle, PLUGIN_DISABLE_MMAP))<0){ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
339 |
SDL_SetError("snd_pcm_plugin_set_disable failed: %s\n", snd_strerror(rval)); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
340 |
return(-1); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
341 |
} |
0 | 342 |
|
343 |
/* Try for a closest match on audio format */ |
|
344 |
format = 0; |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
345 |
found = 0; /* can't use format as SND_PCM_SFMT_U8 = 0 in nto */ |
0 | 346 |
for ( test_format = SDL_FirstAudioFormat(spec->format); !found ; ) |
347 |
{ |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
348 |
#ifdef DEBUG_AUDIO |
0 | 349 |
fprintf(stderr, "Trying format 0x%4.4x spec->samples %d\n", test_format,spec->samples); |
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
350 |
#endif |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
351 |
|
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
352 |
/* if match found set format to equivalent ALSA format */ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
353 |
switch ( test_format ) { |
0 | 354 |
case AUDIO_U8: |
355 |
format = SND_PCM_SFMT_U8; |
|
356 |
found = 1; |
|
357 |
break; |
|
358 |
case AUDIO_S8: |
|
359 |
format = SND_PCM_SFMT_S8; |
|
360 |
found = 1; |
|
361 |
break; |
|
362 |
case AUDIO_S16LSB: |
|
363 |
format = SND_PCM_SFMT_S16_LE; |
|
364 |
found = 1; |
|
365 |
break; |
|
366 |
case AUDIO_S16MSB: |
|
367 |
format = SND_PCM_SFMT_S16_BE; |
|
368 |
found = 1; |
|
369 |
break; |
|
370 |
case AUDIO_U16LSB: |
|
371 |
format = SND_PCM_SFMT_U16_LE; |
|
372 |
found = 1; |
|
373 |
break; |
|
374 |
case AUDIO_U16MSB: |
|
375 |
format = SND_PCM_SFMT_U16_BE; |
|
376 |
found = 1; |
|
377 |
break; |
|
378 |
default: |
|
379 |
break; |
|
380 |
} |
|
381 |
if ( ! found ) { |
|
382 |
test_format = SDL_NextAudioFormat(); |
|
383 |
} |
|
384 |
} |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
385 |
|
0 | 386 |
/* assumes test_format not 0 on success */ |
387 |
if ( test_format == 0 ) { |
|
388 |
SDL_SetError("Couldn't find any hardware audio formats"); |
|
389 |
return(-1); |
|
390 |
} |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
391 |
|
0 | 392 |
spec->format = test_format; |
393 |
||
394 |
/* Set the audio format */ |
|
395 |
cparams.format.format = format; |
|
396 |
||
397 |
/* Set mono or stereo audio (currently only two channels supported) */ |
|
398 |
cparams.format.voices = spec->channels; |
|
399 |
||
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
400 |
#ifdef DEBUG_AUDIO |
0 | 401 |
fprintf(stderr,"intializing channels %d\n", cparams.format.voices); |
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
402 |
#endif |
0 | 403 |
|
404 |
/* Set rate */ |
|
405 |
cparams.format.rate = spec->freq ; |
|
406 |
||
407 |
/* Setup the transfer parameters according to cparams */ |
|
408 |
rval = snd_pcm_plugin_params(audio_handle, &cparams); |
|
409 |
if (rval < 0) { |
|
410 |
SDL_SetError("snd_pcm_channel_params failed: %s\n", snd_strerror (rval)); |
|
411 |
return(-1); |
|
412 |
} |
|
413 |
||
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
414 |
/* Make sure channel is setup right one last time */ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
415 |
memset( &csetup, 0, sizeof( csetup ) ); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
416 |
csetup.channel = SND_PCM_CHANNEL_PLAYBACK; |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
417 |
if ( snd_pcm_plugin_setup( audio_handle, &csetup ) < 0 ) |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
418 |
{ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
419 |
SDL_SetError("Unable to setup playback channel\n" ); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
420 |
return(-1); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
421 |
} |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
422 |
else |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
423 |
{ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
424 |
#ifdef DEBUG_AUDIO |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
425 |
fprintf(stderr,"requested format: %d\n",cparams.format.format); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
426 |
fprintf(stderr,"requested frag size: %d\n",cparams.buf.block.frag_size); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
427 |
fprintf(stderr,"requested max frags: %d\n\n",cparams.buf.block.frags_max); |
0 | 428 |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
429 |
fprintf(stderr,"real format: %d\n", csetup.format.format ); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
430 |
fprintf(stderr,"real frag size : %d\n", csetup.buf.block.frag_size ); |
0 | 431 |
fprintf(stderr,"real max frags : %d\n", csetup.buf.block.frags_max ); |
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
432 |
#endif |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
433 |
} |
0 | 434 |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
435 |
/* |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
436 |
Allocate memory to the audio buffer and initialize with silence (Note that |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
437 |
buffer size must be a multiple of fragment size, so find closest multiple) |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
438 |
*/ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
439 |
|
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
440 |
twidth = snd_pcm_format_width(format); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
441 |
if (twidth < 0) { |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
442 |
printf("snd_pcm_format_width failed\n"); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
443 |
twidth = 0; |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
444 |
} |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
445 |
|
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
446 |
#ifdef DEBUG_AUDIO |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
447 |
fprintf(stderr,"format is %d bits wide\n",twidth); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
448 |
#endif |
0 | 449 |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
450 |
pcm_len = spec->size ; |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
451 |
|
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
452 |
#ifdef DEBUG_AUDIO |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
453 |
fprintf(stderr,"pcm_len set to %d\n", pcm_len); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
454 |
#endif |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
455 |
|
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
456 |
if (pcm_len == 0){ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
457 |
pcm_len = csetup.buf.block.frag_size; |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
458 |
} |
0 | 459 |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
460 |
pcm_buf = (Uint8*)malloc(pcm_len); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
461 |
if (pcm_buf == NULL) { |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
462 |
SDL_SetError("pcm_buf malloc failed\n"); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
463 |
return(-1); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
464 |
} |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
465 |
memset(pcm_buf,spec->silence,pcm_len); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
466 |
|
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
467 |
#ifdef DEBUG_AUDIO |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
468 |
fprintf(stderr,"pcm_buf malloced and silenced.\n"); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
469 |
#endif |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
470 |
|
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
471 |
/* get the file descriptor */ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
472 |
if( (audio_fd = snd_pcm_file_descriptor(audio_handle, SND_PCM_CHANNEL_PLAYBACK)) < 0){ |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
473 |
fprintf(stderr, "snd_pcm_file_descriptor failed with error code: %d\n", audio_fd); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
474 |
} |
0 | 475 |
|
476 |
/* Trigger audio playback */ |
|
477 |
rval = snd_pcm_plugin_prepare( audio_handle, SND_PCM_CHANNEL_PLAYBACK); |
|
478 |
if (rval < 0) { |
|
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
479 |
SDL_SetError("snd_pcm_plugin_prepare failed: %s\n", snd_strerror (rval)); |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
480 |
return(-1); |
0 | 481 |
} |
418
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
482 |
|
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
483 |
this->enabled = 1; |
337f3ec4c385
Updated the QNX audio code for QNX 6.2 (thanks Travis!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
484 |
|
0 | 485 |
/* Get the parent process id (we're the parent of the audio thread) */ |
486 |
parent = getpid(); |
|
487 |
||
488 |
/* We're ready to rock and roll. :-) */ |
|
489 |
return(0); |
|
490 |
} |