annotate libao2/ao_sdl.c @ 12019:6ede5366bc47

fix compilation with sdl on mingw patch by Nehal <nehalmistry at gmx.net>
author faust3
date Sat, 13 Mar 2004 16:25:08 +0000
parents 9b6e480622c4
children 210e474436d3
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>
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
15
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7908
diff changeset
16 #include "../config.h"
b9da278e4c92 verbose can be negative
arpi
parents: 7908
diff changeset
17 #include "../mp_msg.h"
b9da278e4c92 verbose can be negative
arpi
parents: 7908
diff changeset
18
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
19 #include "audio_out.h"
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
20 #include "audio_out_internal.h"
1066
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
21 #include "afmt.h"
6184
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
22 #include <SDL.h>
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
23
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
24 #include "../libvo/fastmemcpy.h"
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
25
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
26 static ao_info_t info =
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
27 {
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
28 "SDLlib audio output",
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
29 "sdl",
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
30 "Felix Buenemann <atmosfear@users.sourceforge.net>",
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
31 ""
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
32 };
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 LIBAO_EXTERN(sdl)
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
35
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
36 // Samplesize used by the SDLlib AudioSpec struct
12019
6ede5366bc47 fix compilation with sdl on mingw patch by Nehal <nehalmistry at gmx.net>
faust3
parents: 11750
diff changeset
37 #ifdef WIN32
6ede5366bc47 fix compilation with sdl on mingw patch by Nehal <nehalmistry at gmx.net>
faust3
parents: 11750
diff changeset
38 #define SAMPLESIZE 2048
6ede5366bc47 fix compilation with sdl on mingw patch by Nehal <nehalmistry at gmx.net>
faust3
parents: 11750
diff changeset
39 #else
993
dfa641c44d4a Increased sample size to solve sound problems one some systems.
atmosfear
parents: 985
diff changeset
40 #define SAMPLESIZE 1024
12019
6ede5366bc47 fix compilation with sdl on mingw patch by Nehal <nehalmistry at gmx.net>
faust3
parents: 11750
diff changeset
41 #endif
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
42
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
43 // General purpose Ring-buffering routines
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
44
974
0d4e4da7c126 -abs support
arpi_esp
parents: 972
diff changeset
45 #define BUFFSIZE 4096
1066
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
46 #define NUM_BUFS 16
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
47
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
48 static unsigned char *buffer[NUM_BUFS];
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
49
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
50 static unsigned int buf_read=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
51 static unsigned int buf_write=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
52 static unsigned int buf_read_pos=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
53 static unsigned int buf_write_pos=0;
6184
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
54 static unsigned int volume=127;
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
55 static int full_buffers=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
56 static int buffered_bytes=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
57
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
58
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
59 static int write_buffer(unsigned char* data,int len){
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
60 int len2=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
61 int x;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
62 while(len>0){
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
63 if(full_buffers==NUM_BUFS) break;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
64 x=BUFFSIZE-buf_write_pos;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
65 if(x>len) x=len;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
66 memcpy(buffer[buf_write]+buf_write_pos,data+len2,x);
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
67 len2+=x; len-=x;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
68 buffered_bytes+=x; buf_write_pos+=x;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
69 if(buf_write_pos>=BUFFSIZE){
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
70 // block is full, find next!
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
71 buf_write=(buf_write+1)%NUM_BUFS;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
72 ++full_buffers;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
73 buf_write_pos=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
74 }
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
75 }
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
76 return len2;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
77 }
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
78
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
79 static int read_buffer(unsigned char* data,int len){
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
80 int len2=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
81 int x;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
82 while(len>0){
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
83 if(full_buffers==0) break; // no more data buffered!
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
84 x=BUFFSIZE-buf_read_pos;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
85 if(x>len) x=len;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
86 memcpy(data+len2,buffer[buf_read]+buf_read_pos,x);
6184
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
87 SDL_MixAudio(data+len2, data+len2, x, volume);
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
88 len2+=x; len-=x;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
89 buffered_bytes-=x; buf_read_pos+=x;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
90 if(buf_read_pos>=BUFFSIZE){
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
91 // block is empty, find next!
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
92 buf_read=(buf_read+1)%NUM_BUFS;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
93 --full_buffers;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
94 buf_read_pos=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
95 }
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
96 }
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
97 return len2;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
98 }
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
99
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
100 // end ring buffer stuff
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
101
12019
6ede5366bc47 fix compilation with sdl on mingw patch by Nehal <nehalmistry at gmx.net>
faust3
parents: 11750
diff changeset
102 #if defined(WIN32) || defined(HPUX) || defined(sgi) || (defined(sun) && defined(__svr4__))
6ede5366bc47 fix compilation with sdl on mingw patch by Nehal <nehalmistry at gmx.net>
faust3
parents: 11750
diff changeset
103 /* 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
104 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
105 {
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
106 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
107 char *env = malloc(len);
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
108
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
109 if (env != NULL) {
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
110 strcpy(env, name);
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
111 strcat(env, "=");
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
112 strcat(env, val);
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
113 putenv(env);
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
114 }
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
115 }
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
116 #endif
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
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
119 // to set/get/query special features/parameters
9633
12b1790038b0 64bit libao2 fix by Jens Axboe <mplayer-dev@kernel.dk>
alex
parents: 8027
diff changeset
120 static int control(int cmd,void *arg){
6184
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
121 switch (cmd) {
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
122 case AOCONTROL_GET_VOLUME:
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
123 {
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
124 ao_control_vol_t* vol = (ao_control_vol_t*)arg;
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
125 vol->left = vol->right = (float)((volume + 127)/2.55);
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
126 return CONTROL_OK;
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
127 }
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
128 case AOCONTROL_SET_VOLUME:
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
129 {
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
130 float diff;
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
131 ao_control_vol_t* vol = (ao_control_vol_t*)arg;
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
132 diff = (vol->left+vol->right) / 2;
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
133 volume = (int)(diff * 2.55) - 127;
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
134 return CONTROL_OK;
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
135 }
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
136 }
47297acadbfb Add volume control, patch by
atmos4
parents: 3137
diff changeset
137 return -1;
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
138 }
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
139
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
140 // SDL Callback function
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
141 void outputaudio(void *unused, Uint8 *stream, int len) {
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
142 //SDL_MixAudio(stream, read_buffer(buffers, len), len, SDL_MIX_MAXVOLUME);
1066
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
143 //if(!full_buffers) printf("SDL: Buffer underrun!\n");
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
144
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
145 read_buffer(stream, len);
1066
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
146 //printf("SDL: Full Buffers: %i\n", full_buffers);
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
147 }
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
148
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
149 // open & setup audio device
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
150 // return: 1=success 0=fail
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
151 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
152
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
153 /* SDL Audio Specifications */
7908
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
154 SDL_AudioSpec aspec, obtained;
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
155
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
156 int i;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
157 /* Allocate ring-buffer memory */
983
cb0e3b29a0dd Several small changes (like driver selection).
atmosfear
parents: 975
diff changeset
158 for(i=0;i<NUM_BUFS;i++) buffer[i]=(unsigned char *) malloc(BUFFSIZE);
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
159
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7908
diff changeset
160 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
161
1189
7c6bcb281966 sdl_adriver liquidated, ao_subdevice used
al3x
parents: 1091
diff changeset
162 if(ao_subdevice) {
7c6bcb281966 sdl_adriver liquidated, ao_subdevice used
al3x
parents: 1091
diff changeset
163 setenv("SDL_AUDIODRIVER", ao_subdevice, 1);
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7908
diff changeset
164 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
165 }
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1238
diff changeset
166
7660
7ff053498bf2 fill ao_data correctly
arpi
parents: 6956
diff changeset
167 ao_data.channels=channels;
7ff053498bf2 fill ao_data correctly
arpi
parents: 6956
diff changeset
168 ao_data.samplerate=rate;
7ff053498bf2 fill ao_data correctly
arpi
parents: 6956
diff changeset
169 ao_data.format=format;
7ff053498bf2 fill ao_data correctly
arpi
parents: 6956
diff changeset
170
3137
b9ee2d8d7279 Audio delay bugfix
anders
parents: 3095
diff changeset
171 ao_data.bps=channels*rate;
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1238
diff changeset
172 if(format != AFMT_U8 && format != AFMT_S8)
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1238
diff changeset
173 ao_data.bps*=2;
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
174
1066
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
175 /* The desired audio format (see SDL_AudioSpec) */
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
176 switch(format) {
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
177 case AFMT_U8:
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
178 aspec.format = AUDIO_U8;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
179 break;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
180 case AFMT_S16_LE:
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
181 aspec.format = AUDIO_S16LSB;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
182 break;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
183 case AFMT_S16_BE:
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
184 aspec.format = AUDIO_S16MSB;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
185 break;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
186 case AFMT_S8:
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
187 aspec.format = AUDIO_S8;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
188 break;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
189 case AFMT_U16_LE:
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
190 aspec.format = AUDIO_U16LSB;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
191 break;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
192 case AFMT_U16_BE:
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
193 aspec.format = AUDIO_U16MSB;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
194 break;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
195 default:
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7908
diff changeset
196 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
197 return 0;
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
198 }
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
199
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
200 /* The desired audio frequency in samples-per-second. */
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
201 aspec.freq = rate;
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
202
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
203 /* Number of channels (mono/stereo) */
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
204 aspec.channels = channels;
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
205
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
206 /* 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
207 aspec.samples = SAMPLESIZE;
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
208
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
209 /* 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
210 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
211 aspec.callback = outputaudio;
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
212
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
213 /* 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
214 aspec.userdata = NULL;
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
215
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
216 /* initialize the SDL Audio system */
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
217 if (SDL_Init (SDL_INIT_AUDIO/*|SDL_INIT_NOPARACHUTE*/)) {
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7908
diff changeset
218 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
219 return 0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
220 }
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
221
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
222 /* 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
223 if(SDL_OpenAudio(&aspec, &obtained) < 0) {
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7908
diff changeset
224 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
225 return(0);
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
226 }
7908
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
227
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
228 /* did we got what we wanted ? */
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
229 ao_data.channels=obtained.channels;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
230 ao_data.samplerate=obtained.freq;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
231
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
232 switch(obtained.format) {
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
233 case AUDIO_U8 :
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
234 ao_data.format = AFMT_U8;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
235 break;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
236 case AUDIO_S16LSB :
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
237 ao_data.format = AFMT_S16_LE;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
238 break;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
239 case AUDIO_S16MSB :
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
240 ao_data.format = AFMT_S16_BE;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
241 break;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
242 case AUDIO_S8 :
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
243 ao_data.format = AFMT_S8;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
244 break;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
245 case AUDIO_U16LSB :
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
246 ao_data.format = AFMT_U16_LE;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
247 break;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
248 case AUDIO_U16MSB :
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
249 ao_data.format = AFMT_U16_BE;
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 default:
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7908
diff changeset
252 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
253 return 0;
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
254 }
dc96a3eb9fab Check what we obtain in SDL_OpenAudio() - allows to build the
colin
parents: 7897
diff changeset
255
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7908
diff changeset
256 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
257 ao_data.buffersize=obtained.size;
974
0d4e4da7c126 -abs support
arpi_esp
parents: 972
diff changeset
258
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
259 /* unsilence audio, if callback is ready */
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
260 SDL_PauseAudio(0);
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
261
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
262 return 1;
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
263 }
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
264
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
265 // close audio device
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
266 static void uninit(){
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7908
diff changeset
267 mp_msg(MSGT_AO,MSGL_V,"SDL: Audio Subsystem shutting down!\n");
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
268 SDL_CloseAudio();
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
269 SDL_QuitSubSystem(SDL_INIT_AUDIO);
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
270 }
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
271
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
272 // stop playing and empty buffers (for seeking/pause)
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
273 static void reset(){
1066
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
274
1091
06fd776f6b59 Lock callback on pause, unlock on resume.
atmosfear
parents: 1070
diff changeset
275 //printf("SDL: reset called!\n");
1066
aecab161d8d6 Better audio format handling.
atmosfear
parents: 1038
diff changeset
276
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
277 /* Reset ring-buffer state */
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
278 buf_read=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
279 buf_write=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
280 buf_read_pos=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
281 buf_write_pos=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
282
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
283 full_buffers=0;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
284 buffered_bytes=0;
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
285
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
286 }
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
287
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
288 // 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
289 static void audio_pause()
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
290 {
1070
e45a029db4c3 Better format info.
atmosfear
parents: 1066
diff changeset
291
1091
06fd776f6b59 Lock callback on pause, unlock on resume.
atmosfear
parents: 1070
diff changeset
292 //printf("SDL: audio_pause called!\n");
7897
7674e94baff7 Change SDL_(Un)lockAudio to PauseAudio() (works better)
colin
parents: 7660
diff changeset
293 SDL_PauseAudio(1);
1070
e45a029db4c3 Better format info.
atmosfear
parents: 1066
diff changeset
294
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
295 }
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
296
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
297 // 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
298 static void audio_resume()
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
299 {
1091
06fd776f6b59 Lock callback on pause, unlock on resume.
atmosfear
parents: 1070
diff changeset
300 //printf("SDL: audio_resume called!\n");
7897
7674e94baff7 Change SDL_(Un)lockAudio to PauseAudio() (works better)
colin
parents: 7660
diff changeset
301 SDL_PauseAudio(0);
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
302 }
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
303
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 993
diff changeset
304
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
305 // return: how many bytes can be played without blocking
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
306 static int get_space(){
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
307 return (NUM_BUFS-full_buffers)*BUFFSIZE - buf_write_pos;
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
308 }
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
309
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
310 // plays 'len' bytes of 'data'
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
311 // it should round it down to outburst*n
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
312 // return: number of bytes played
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
313 static int play(void* data,int len,int flags){
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
314
985
95391cf9e994 Microchange =)
atmosfear
parents: 983
diff changeset
315 #if 0
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
316 int ret;
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
317
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
318 /* Audio locking prohibits call of outputaudio */
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
319 SDL_LockAudio();
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
320 // copy audio stream into ring-buffer
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
321 ret = write_buffer(data, len);
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
322 SDL_UnlockAudio();
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
323
972
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
324 return ret;
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
325 #else
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
326 return write_buffer(data, len);
b49f89b3ab2e Yea, it worksss!
atmosfear
parents: 966
diff changeset
327 #endif
966
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
328 }
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
329
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1238
diff changeset
330 // return: delay in seconds between first and last sample in buffer
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1238
diff changeset
331 static float get_delay(){
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1238
diff changeset
332 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
333 }
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
334
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
335
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
336
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
337
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
338
69b4f944ce08 Added support for sdl audio out (buggy pre-alpha).
atmosfear
parents:
diff changeset
339