26#ifdef _FILE_OFFSET_BITS
27#undef _FILE_OFFSET_BITS
36#include <sys/soundcard.h>
57 char *dsp_dev =
getenv(
"AUDIODEV");
97 int stereo,
format, fragments;
111 perror(
"SNDCTL_DSP_SETFMT");
126 if (
ioctl(
This->dsp_, SNDCTL_DSP_STEREO, &stereo) == -1)
128 perror(
"SNDCTL_DSP_CHANNELS");
136 perror(
"SNDCTL_DSP_SPEED");
142 fragments = (7 << 16) + 12;
143 ioctl(
This->dsp_, SNDCTL_DSP_SETFRAGMENT, &fragments);
152 perror(
"SNDCTL_DSP_GETOSPACE");
157 if (
info.fragments == 0 ||
info.fragstotal == 0 ||
info.fragsize == 0)
160 "Broken OSS-driver detected: fragments: %d, fragstotal: %d, fragsize: %d\n",
183 perror(
"open /dev/mixer");
187 if (
ioctl(fd_mix, MIXER_WRITE(SOUND_MIXER_PCM), &
volume) == -1)
189 perror(
"MIXER_WRITE(SOUND_MIXER_PCM)");
198 perror(
"MIXER_WRITE(SOUND_MIXER_PCM)");
199 use_dev_mixer =
True;
212 error(
"No space to queue audio packet\n");
236 static long startedat_us;
237 static long startedat_s;
268 perror(
"SNDCTL_DSP_GETOSPACE");
272 if (
info.fragments == 0)
279 &&
info.fragments *
info.fragsize > 0)
303 elapsed = (tv.
tv_sec - startedat_s) * 1000000 + (tv.
tv_usec - startedat_us);
305 if (elapsed >= (duration * 85) / 100)
#define gettimeofday(tv, tz)
char * xstrdup(const char *s)
_CRTIMP void __cdecl perror(_In_opt_z_ const char *_ErrMsg)
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
_Check_return_ char *__cdecl getenv(_In_z_ const char *_VarName)
void rdpsnd_send_completion(RDPCLIENT *This, uint16 tick, uint8 packet_index)
static unsigned int queue_lo
static short g_samplewidth
BOOL wave_out_format_supported(WAVEFORMATEX *pwfx)
void wave_out_write(STREAM s, uint16 tick, uint8 index)
BOOL wave_out_set_format(WAVEFORMATEX *pwfx)
void wave_out_close(void)
void wave_out_volume(uint16 left, uint16 right)
static unsigned int queue_hi
static struct audio_packet packet_queue[MAX_QUEUE]
static BOOL g_driver_broken
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out