annotate libao2/ao_sdl.c @ 13219:f7efa10d3e91

man page review part VIII
author diego
date Wed, 01 Sep 2004 15:05:34 +0000
parents 7b9b4f07d2c4
children c1955840883d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
1 /*
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
2 * ao_sdl.c - libao2 SDLlib Audio Output Driver for MPlayer
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
3 *
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
4 * This driver is under the same license as MPlayer.
11750
9b6e480622c4 URL updated.
diego
parents: 10838
diff changeset
5 * (http://www.mplayerhq.hu)
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
6 *
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
7 * Copyleft 2001 by Felix Bünemann (atmosfear@users.sf.net)
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
8 *
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
9 * Thanks to Arpi for nice ringbuffer-code!
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
10 *
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
11 */
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
12
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
13 #include <stdio.h>
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
14 #include <stdlib.h>
12093
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 12027
diff changeset
15 #include <string.h>
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
16
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7908
diff changeset
17 #include "../config.h"
b9da278e4c92 verbose can be negative
arpi
parents: 7908
diff changeset
18 #include "../mp_msg.h"
b9da278e4c92 verbose can be negative
arpi
parents: 7908
diff changeset
19
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
20 #include "audio_out.h"
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
21 #include "audio_out_internal.h"
1066
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
22 #include "afmt.h"
6184
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
23 #include <SDL.h>
12093
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 12027
diff changeset
24 #include "osdep/timer.h"
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
25
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
26 #include "../libvo/fastmemcpy.h"
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
27
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
28 static ao_info_t info =
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
29 {
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
30 "SDLlib audio output",
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
31 "sdl",
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
32 "Felix Buenemann <atmosfear@users.sourceforge.net>",
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
33 ""
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
34 };
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
35
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
36 LIBAO_EXTERN(sdl)
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
37
12673
c1371fce7267 make the internal sdl mixer optional, idea by Reimar Doffinger
alex
parents: 12440
diff changeset
38 // turn this on if you want to use the slower SDL_MixAudio
12908
7b9b4f07d2c4 automatic loading of af_volume, original patch by Dan Christiansen (danchr (at) daimi (dot) au (dot) dk)
reimar
parents: 12714
diff changeset
39 #undef USE_SDL_INTERNAL_MIXER
12673
c1371fce7267 make the internal sdl mixer optional, idea by Reimar Doffinger
alex
parents: 12440
diff changeset
40
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
41 // Samplesize used by the SDLlib AudioSpec struct
12113
07d9c8fa6897 restore old SAMPLESIZE
faust3
parents: 12093
diff changeset
42 #ifdef WIN32
12019
6ede5366bc47 fix compilation with sdl on mingw patch by Nehal <nehalmistry at gmx.net>
faust3
parents: 11750
diff changeset
43 #define SAMPLESIZE 2048
12113
07d9c8fa6897 restore old SAMPLESIZE
faust3
parents: 12093
diff changeset
44 #else
07d9c8fa6897 restore old SAMPLESIZE
faust3
parents: 12093
diff changeset
45 #define SAMPLESIZE 1024
07d9c8fa6897 restore old SAMPLESIZE
faust3
parents: 12093
diff changeset
46 #endif
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
47
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
48 // General purpose Ring-buffering routines
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
49
974
0d4e4da7c126 -abs support
arpi_esp
parents: 972
diff changeset
50 #define BUFFSIZE 4096
12093
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 12027
diff changeset
51 #define NUM_BUFS 8
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
52
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
53 static unsigned char *buffer[NUM_BUFS];
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
54
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
55 static unsigned int buf_read=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
56 static unsigned int buf_write=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
57 static unsigned int buf_read_pos=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
58 static unsigned int buf_write_pos=0;
12673
c1371fce7267 make the internal sdl mixer optional, idea by Reimar Doffinger
alex
parents: 12440
diff changeset
59 #ifdef USE_SDL_INTERNAL_MIXER
12093
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 12027
diff changeset
60 static unsigned char volume=SDL_MIX_MAXVOLUME;
12673
c1371fce7267 make the internal sdl mixer optional, idea by Reimar Doffinger
alex
parents: 12440
diff changeset
61 #endif
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
62 static int full_buffers=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
63 static int buffered_bytes=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
64
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
65
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
66 static int write_buffer(unsigned char* data,int len){
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
67 int len2=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
68 int x;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
69 while(len>0){
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
70 if(full_buffers==NUM_BUFS) break;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
71 x=BUFFSIZE-buf_write_pos;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
72 if(x>len) x=len;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
73 memcpy(buffer[buf_write]+buf_write_pos,data+len2,x);
12151
75fdb659f5bf round len to outburst and increment full_buffers at the correct time, patch by Nehal <nehalmistry at gmx.net>
faust3
parents: 12145
diff changeset
74 if (buf_write_pos==0)
75fdb659f5bf round len to outburst and increment full_buffers at the correct time, patch by Nehal <nehalmistry at gmx.net>
faust3
parents: 12145
diff changeset
75 ++full_buffers;
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
76 len2+=x; len-=x;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
77 buffered_bytes+=x; buf_write_pos+=x;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
78 if(buf_write_pos>=BUFFSIZE){
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
79 // block is full, find next!
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
80 buf_write=(buf_write+1)%NUM_BUFS;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
81 buf_write_pos=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
82 }
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
83 }
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
84 return len2;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
85 }
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
86
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
87 static int read_buffer(unsigned char* data,int len){
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
88 int len2=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
89 int x;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
90 while(len>0){
12093
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 12027
diff changeset
91 if(buffered_bytes==0) break; // no more data buffered!
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
92 x=BUFFSIZE-buf_read_pos;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
93 if(x>len) x=len;
12093
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 12027
diff changeset
94 if (x>buffered_bytes) x=buffered_bytes;
12673
c1371fce7267 make the internal sdl mixer optional, idea by Reimar Doffinger
alex
parents: 12440
diff changeset
95 #ifdef USE_SDL_INTERNAL_MIXER
12093
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 12027
diff changeset
96 SDL_MixAudio(data+len2,buffer[buf_read]+buf_read_pos,x,volume);
12673
c1371fce7267 make the internal sdl mixer optional, idea by Reimar Doffinger
alex
parents: 12440
diff changeset
97 #else
c1371fce7267 make the internal sdl mixer optional, idea by Reimar Doffinger
alex
parents: 12440
diff changeset
98 memcpy(data+len2,buffer[buf_read]+buf_read_pos,x);
c1371fce7267 make the internal sdl mixer optional, idea by Reimar Doffinger
alex
parents: 12440
diff changeset
99 #endif
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
100 len2+=x; len-=x;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
101 buffered_bytes-=x; buf_read_pos+=x;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
102 if(buf_read_pos>=BUFFSIZE){
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
103 // block is empty, find next!
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
104 buf_read=(buf_read+1)%NUM_BUFS;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
105 --full_buffers;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
106 buf_read_pos=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
107 }
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
108 }
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
109 return len2;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
110 }
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
111
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
112 // end ring buffer stuff
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
113
12027
210e474436d3 Cygwin provides setenv. Fixes compilation on Cygwin.
diego
parents: 12019
diff changeset
114 #if defined(__MINGW32__) || defined(HPUX) || defined(sgi) || (defined(sun) && defined(__svr4__))
12019
6ede5366bc47 fix compilation with sdl on mingw patch by Nehal <nehalmistry at gmx.net>
faust3
parents: 11750
diff changeset
115 /* setenv is missing on win32, solaris, IRIX and HPUX */
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
116 static void setenv(const char *name, const char *val, int _xx)
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
117 {
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
118 int len = strlen(name) + strlen(val) + 2;
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
119 char *env = malloc(len);
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
120
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
121 if (env != NULL) {
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
122 strcpy(env, name);
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
123 strcat(env, "=");
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
124 strcat(env, val);
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
125 putenv(env);
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
126 }
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
127 }
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
128 #endif
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
129
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
130
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
131 // to set/get/query special features/parameters
9633
12b1790038b0 64bit libao2 fix by Jens Axboe <mplayer-dev@kernel.dk>
alex
parents: 8027
diff changeset
132 static int control(int cmd,void *arg){
12673
c1371fce7267 make the internal sdl mixer optional, idea by Reimar Doffinger
alex
parents: 12440
diff changeset
133 #ifdef USE_SDL_INTERNAL_MIXER
6184
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
134 switch (cmd) {
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
135 case AOCONTROL_GET_VOLUME:
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
136 {
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
137 ao_control_vol_t* vol = (ao_control_vol_t*)arg;
12093
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 12027
diff changeset
138 vol->left = vol->right = volume * 100 / SDL_MIX_MAXVOLUME;
6184
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
139 return CONTROL_OK;
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
140 }
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
141 case AOCONTROL_SET_VOLUME:
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
142 {
12093
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 12027
diff changeset
143 int diff;
6184
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
144 ao_control_vol_t* vol = (ao_control_vol_t*)arg;
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
145 diff = (vol->left+vol->right) / 2;
12093
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 12027
diff changeset
146 volume = diff * SDL_MIX_MAXVOLUME / 100;
6184
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
147 return CONTROL_OK;
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
148 }
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
149 }
12673
c1371fce7267 make the internal sdl mixer optional, idea by Reimar Doffinger
alex
parents: 12440
diff changeset
150 #endif
c1371fce7267 make the internal sdl mixer optional, idea by Reimar Doffinger
alex
parents: 12440
diff changeset
151 return CONTROL_UNKNOWN;
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
152 }
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
153
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
154 // SDL Callback function
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
155 void outputaudio(void *unused, Uint8 *stream, int len) {
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
156 //SDL_MixAudio(stream, read_buffer(buffers, len), len, SDL_MIX_MAXVOLUME);
1066
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
157 //if(!full_buffers) printf("SDL: Buffer underrun!\n");
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
158
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
159 read_buffer(stream, len);
1066
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
160 //printf("SDL: Full Buffers: %i\n", full_buffers);
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
161 }
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
162
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
163 // open & setup audio device
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
164 // return: 1=success 0=fail
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
165 static int init(int rate,int channels,int format,int flags){
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
166
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
167 /* SDL Audio Specifications */
7908
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
168 SDL_AudioSpec aspec, obtained;
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
169
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
170 int i;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
171 /* Allocate ring-buffer memory */
983
cb0e3b29a0dd Several small changes (like driver selection).
atmosfear
parents: 975
diff changeset
172 for(i=0;i<NUM_BUFS;i++) buffer[i]=(unsigned char *) malloc(BUFFSIZE);
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
173
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7908
diff changeset
174 mp_msg(MSGT_AO,MSGL_INFO,"SDL: Samplerate: %iHz Channels: %s Format %s\n", rate, (channels > 1) ? "Stereo" : "Mono", audio_out_format_name(format));
983
cb0e3b29a0dd Several small changes (like driver selection).
atmosfear
parents: 975
diff changeset
175
1189
7c6bcb281966 sdl_adriver liquidated, ao_subdevice used
al3x
parents: 1091
diff changeset
176 if(ao_subdevice) {
7c6bcb281966 sdl_adriver liquidated, ao_subdevice used
al3x
parents: 1091
diff changeset
177 setenv("SDL_AUDIODRIVER", ao_subdevice, 1);
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7908
diff changeset
178 mp_msg(MSGT_AO,MSGL_INFO,"SDL: using %s audio driver\n", ao_subdevice);
1189
7c6bcb281966 sdl_adriver liquidated, ao_subdevice used
al3x
parents: 1091
diff changeset
179 }
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1238
diff changeset
180
7660
7ff053498bf2 fill ao_data correctly
arpi
parents: 6956
diff changeset
181 ao_data.channels=channels;
7ff053498bf2 fill ao_data correctly
arpi
parents: 6956
diff changeset
182 ao_data.samplerate=rate;
7ff053498bf2 fill ao_data correctly
arpi
parents: 6956
diff changeset
183 ao_data.format=format;
7ff053498bf2 fill ao_data correctly
arpi
parents: 6956
diff changeset
184
3137
b9ee2d8d7279 Audio delay bugfix
anders
parents: 3095
diff changeset
185 ao_data.bps=channels*rate;
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1238
diff changeset
186 if(format != AFMT_U8 && format != AFMT_S8)
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1238
diff changeset
187 ao_data.bps*=2;
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
188
1066
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
189 /* The desired audio format (see SDL_AudioSpec) */
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
190 switch(format) {
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
191 case AFMT_U8:
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
192 aspec.format = AUDIO_U8;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
193 break;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
194 case AFMT_S16_LE:
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
195 aspec.format = AUDIO_S16LSB;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
196 break;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
197 case AFMT_S16_BE:
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
198 aspec.format = AUDIO_S16MSB;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
199 break;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
200 case AFMT_S8:
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
201 aspec.format = AUDIO_S8;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
202 break;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
203 case AFMT_U16_LE:
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
204 aspec.format = AUDIO_U16LSB;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
205 break;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
206 case AFMT_U16_BE:
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
207 aspec.format = AUDIO_U16MSB;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
208 break;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
209 default:
12440
56bdb9b7a4bc use fallback for unsupported formats instead of quitting
reimar
parents: 12151
diff changeset
210 aspec.format = AUDIO_S16LSB;
56bdb9b7a4bc use fallback for unsupported formats instead of quitting
reimar
parents: 12151
diff changeset
211 ao_data.format = AFMT_S16_LE;
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7908
diff changeset
212 mp_msg(MSGT_AO,MSGL_WARN,"SDL: Unsupported audio format: 0x%x.\n", format);
1066
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
213 }
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
214
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
215 /* The desired audio frequency in samples-per-second. */
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
216 aspec.freq = rate;
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
217
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
218 /* Number of channels (mono/stereo) */
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
219 aspec.channels = channels;
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
220
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
221 /* The desired size of the audio buffer in samples. This number should be a power of two, and may be adjusted by the audio driver to a value more suitable for the hardware. Good values seem to range between 512 and 8192 inclusive, depending on the application and CPU speed. Smaller values yield faster response time, but can lead to underflow if the application is doing heavy processing and cannot fill the audio buffer in time. A stereo sample consists of both right and left channels in LR ordering. Note that the number of samples is directly related to time by the following formula: ms = (samples*1000)/freq */
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
222 aspec.samples = SAMPLESIZE;
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
223
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
224 /* This should be set to a function that will be called when the audio device is ready for more data. It is passed a pointer to the audio buffer, and the length in bytes of the audio buffer. This function usually runs in a separate thread, and so you should protect data structures that it accesses by calling SDL_LockAudio and SDL_UnlockAudio in your code. The callback prototype is:
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
225 void callback(void *userdata, Uint8 *stream, int len); userdata is the pointer stored in userdata field of the SDL_AudioSpec. stream is a pointer to the audio buffer you want to fill with information and len is the length of the audio buffer in bytes. */
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
226 aspec.callback = outputaudio;
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
227
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
228 /* This pointer is passed as the first parameter to the callback function. */
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
229 aspec.userdata = NULL;
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
230
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
231 /* initialize the SDL Audio system */
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
232 if (SDL_Init (SDL_INIT_AUDIO/*|SDL_INIT_NOPARACHUTE*/)) {
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7908
diff changeset
233 mp_msg(MSGT_AO,MSGL_ERR,"SDL: Initializing of SDL Audio failed: %s.\n", SDL_GetError());
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
234 return 0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
235 }
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
236
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
237 /* Open the audio device and start playing sound! */
7908
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
238 if(SDL_OpenAudio(&aspec, &obtained) < 0) {
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7908
diff changeset
239 mp_msg(MSGT_AO,MSGL_ERR,"SDL: Unable to open audio: %s\n", SDL_GetError());
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
240 return(0);
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
241 }
7908
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
242
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
243 /* did we got what we wanted ? */
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
244 ao_data.channels=obtained.channels;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
245 ao_data.samplerate=obtained.freq;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
246
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
247 switch(obtained.format) {
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
248 case AUDIO_U8 :
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
249 ao_data.format = AFMT_U8;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
250 break;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
251 case AUDIO_S16LSB :
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
252 ao_data.format = AFMT_S16_LE;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
253 break;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
254 case AUDIO_S16MSB :
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
255 ao_data.format = AFMT_S16_BE;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
256 break;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
257 case AUDIO_S8 :
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
258 ao_data.format = AFMT_S8;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
259 break;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
260 case AUDIO_U16LSB :
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
261 ao_data.format = AFMT_U16_LE;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
262 break;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
263 case AUDIO_U16MSB :
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
264 ao_data.format = AFMT_U16_BE;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
265 break;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
266 default:
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7908
diff changeset
267 mp_msg(MSGT_AO,MSGL_WARN,"SDL: Unsupported SDL audio format: 0x%x.\n", obtained.format);
7908
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
268 return 0;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
269 }
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
270
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7908
diff changeset
271 mp_msg(MSGT_AO,MSGL_V,"SDL: buf size = %d\n",obtained.size);
7908
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
272 ao_data.buffersize=obtained.size;
974
0d4e4da7c126 -abs support
arpi_esp
parents: 972
diff changeset
273
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
274 /* unsilence audio, if callback is ready */
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
275 SDL_PauseAudio(0);
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
276
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
277 return 1;
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
278 }
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
279
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
280 // close audio device
12145
99798c3cdb93 uninit immed flag
alex
parents: 12113
diff changeset
281 static void uninit(int immed){
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7908
diff changeset
282 mp_msg(MSGT_AO,MSGL_V,"SDL: Audio Subsystem shutting down!\n");
12093
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 12027
diff changeset
283 while(buffered_bytes > 0)
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 12027
diff changeset
284 usec_sleep(50000);
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
285 SDL_CloseAudio();
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
286 SDL_QuitSubSystem(SDL_INIT_AUDIO);
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
287 }
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
288
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
289 // stop playing and empty buffers (for seeking/pause)
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
290 static void reset(){
1066
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
291
1091
06fd776f6b59 Lock callback on pause, unlock on resume.
atmosfear
parents: 1070
diff changeset
292 //printf("SDL: reset called!\n");
1066
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
293
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
294 /* Reset ring-buffer state */
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
295 buf_read=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
296 buf_write=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
297 buf_read_pos=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
298 buf_write_pos=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
299
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
300 full_buffers=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
301 buffered_bytes=0;
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
302
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
303 }
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
304
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
305 // stop playing, keep buffers (for pause)
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
306 static void audio_pause()
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
307 {
1070
e45a029db4c3 Better format info.
atmosfear
parents: 1066
diff changeset
308
1091
06fd776f6b59 Lock callback on pause, unlock on resume.
atmosfear
parents: 1070
diff changeset
309 //printf("SDL: audio_pause called!\n");
7897
7674e94baff7 Change SDL_(Un)lockAudio to PauseAudio() (works better)
colin
parents: 7660
diff changeset
310 SDL_PauseAudio(1);
1070
e45a029db4c3 Better format info.
atmosfear
parents: 1066
diff changeset
311
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
312 }
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
313
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
314 // resume playing, after audio_pause()
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
315 static void audio_resume()
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
316 {
1091
06fd776f6b59 Lock callback on pause, unlock on resume.
atmosfear
parents: 1070
diff changeset
317 //printf("SDL: audio_resume called!\n");
7897
7674e94baff7 Change SDL_(Un)lockAudio to PauseAudio() (works better)
colin
parents: 7660
diff changeset
318 SDL_PauseAudio(0);
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
319 }
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
320
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
321
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
322 // return: how many bytes can be played without blocking
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
323 static int get_space(){
12093
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 12027
diff changeset
324 return NUM_BUFS*BUFFSIZE - buffered_bytes;
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
325 }
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
326
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
327 // plays 'len' bytes of 'data'
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
328 // it should round it down to outburst*n
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
329 // return: number of bytes played
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
330 static int play(void* data,int len,int flags){
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
331
12151
75fdb659f5bf round len to outburst and increment full_buffers at the correct time, patch by Nehal <nehalmistry at gmx.net>
faust3
parents: 12145
diff changeset
332 len = (len/ao_data.outburst)*ao_data.outburst;
985
95391cf9e994 Microchange =)
atmosfear
parents: 983
diff changeset
333 #if 0
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
334 int ret;
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
335
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
336 /* Audio locking prohibits call of outputaudio */
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
337 SDL_LockAudio();
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
338 // copy audio stream into ring-buffer
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
339 ret = write_buffer(data, len);
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
340 SDL_UnlockAudio();
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
341
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
342 return ret;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
343 #else
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
344 return write_buffer(data, len);
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
345 #endif
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
346 }
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
347
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1238
diff changeset
348 // return: delay in seconds between first and last sample in buffer
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1238
diff changeset
349 static float get_delay(){
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1238
diff changeset
350 return (float)(buffered_bytes + ao_data.buffersize)/(float)ao_data.bps;
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
351 }
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
352
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
353
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
354
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
355
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
356
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
357