Volume control for OSS & SUN
Ignore first 4 bytes of audio-packet (clicking noise) git-svn-id: svn://svn.code.sf.net/p/rdesktop/code/trunk/rdesktop@490 423420c4-83ab-492f-b58f-81f9feb106b5
This commit is contained in:
parent
6c74a483f4
commit
5d67a3e036
@ -294,6 +294,9 @@ enum RDP_INPUT_DEVICE
|
|||||||
|
|
||||||
/* Sound format constants */
|
/* Sound format constants */
|
||||||
#define WAVE_FORMAT_PCM 1
|
#define WAVE_FORMAT_PCM 1
|
||||||
|
#define WAVE_FORMAT_ADPCM 2
|
||||||
|
#define WAVE_FORMAT_ALAW 6
|
||||||
|
#define WAVE_FORMAT_MULAW 7
|
||||||
|
|
||||||
/* Virtual channel options */
|
/* Virtual channel options */
|
||||||
#define CHANNEL_OPTION_INITIALIZED 0x80000000
|
#define CHANNEL_OPTION_INITIALIZED 0x80000000
|
||||||
|
1
proto.h
1
proto.h
@ -89,6 +89,7 @@ BOOL wave_out_format_supported(WAVEFORMATEX *pwfx);
|
|||||||
BOOL wave_out_set_format(WAVEFORMATEX *pwfx);
|
BOOL wave_out_set_format(WAVEFORMATEX *pwfx);
|
||||||
void wave_out_write(STREAM s, uint16 tick, uint8 index);
|
void wave_out_write(STREAM s, uint16 tick, uint8 index);
|
||||||
void wave_out_play(void);
|
void wave_out_play(void);
|
||||||
|
void wave_out_volume(uint16 left, uint16 right);
|
||||||
/* secure.c */
|
/* secure.c */
|
||||||
void sec_hash_48(uint8 *out, uint8 *in, uint8 *salt1, uint8 *salt2, uint8 salt);
|
void sec_hash_48(uint8 *out, uint8 *in, uint8 *salt1, uint8 *salt2, uint8 salt);
|
||||||
void sec_hash_16(uint8 *out, uint8 *in, uint8 *salt1, uint8 *salt2);
|
void sec_hash_16(uint8 *out, uint8 *in, uint8 *salt1, uint8 *salt2);
|
||||||
|
16
rdpsnd.c
16
rdpsnd.c
@ -78,11 +78,18 @@ rdpsnd_process_negotiate(STREAM in)
|
|||||||
unsigned int in_format_count, i;
|
unsigned int in_format_count, i;
|
||||||
WAVEFORMATEX *format;
|
WAVEFORMATEX *format;
|
||||||
STREAM out;
|
STREAM out;
|
||||||
|
BOOL device_available = False;
|
||||||
|
|
||||||
in_uint8s(in, 14); /* flags, volume, pitch, UDP port */
|
in_uint8s(in, 14); /* flags, volume, pitch, UDP port */
|
||||||
in_uint16_le(in, in_format_count);
|
in_uint16_le(in, in_format_count);
|
||||||
in_uint8s(in, 4); /* pad, status, pad */
|
in_uint8s(in, 4); /* pad, status, pad */
|
||||||
|
|
||||||
|
if (wave_out_open())
|
||||||
|
{
|
||||||
|
wave_out_close();
|
||||||
|
device_available = True;
|
||||||
|
}
|
||||||
|
|
||||||
format_count = 0;
|
format_count = 0;
|
||||||
if (s_check_rem(in, 18*in_format_count))
|
if (s_check_rem(in, 18*in_format_count))
|
||||||
{
|
{
|
||||||
@ -97,7 +104,7 @@ rdpsnd_process_negotiate(STREAM in)
|
|||||||
in_uint16_le(in, format->wBitsPerSample);
|
in_uint16_le(in, format->wBitsPerSample);
|
||||||
in_uint16_le(in, format->cbSize);
|
in_uint16_le(in, format->cbSize);
|
||||||
|
|
||||||
if (wave_out_format_supported(format))
|
if (device_available && wave_out_format_supported(format))
|
||||||
{
|
{
|
||||||
format_count++;
|
format_count++;
|
||||||
if (format_count == MAX_FORMATS)
|
if (format_count == MAX_FORMATS)
|
||||||
@ -155,6 +162,7 @@ rdpsnd_process(STREAM s)
|
|||||||
{
|
{
|
||||||
uint8 type;
|
uint8 type;
|
||||||
uint16 datalen;
|
uint16 datalen;
|
||||||
|
uint32 volume;
|
||||||
static uint16 tick, format;
|
static uint16 tick, format;
|
||||||
static uint8 packet_index;
|
static uint8 packet_index;
|
||||||
static BOOL awaiting_data_packet;
|
static BOOL awaiting_data_packet;
|
||||||
@ -218,7 +226,11 @@ rdpsnd_process(STREAM s)
|
|||||||
rdpsnd_process_unknown6(s);
|
rdpsnd_process_unknown6(s);
|
||||||
break;
|
break;
|
||||||
case RDPSND_SET_VOLUME:
|
case RDPSND_SET_VOLUME:
|
||||||
/* uint32 volume */
|
in_uint32(s, volume);
|
||||||
|
if ( device_open )
|
||||||
|
{
|
||||||
|
wave_out_volume((volume & 0xffff), (volume & 0xffff0000) >> 16);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
unimpl("RDPSND packet type %d\n", type);
|
unimpl("RDPSND packet type %d\n", type);
|
||||||
|
17
rdpsnd_oss.c
17
rdpsnd_oss.c
@ -43,7 +43,7 @@ wave_out_open(void)
|
|||||||
{
|
{
|
||||||
char *dsp_dev = "/dev/dsp";
|
char *dsp_dev = "/dev/dsp";
|
||||||
|
|
||||||
if ((g_dsp_fd = open(dsp_dev, O_WRONLY)) == -1)
|
if ((g_dsp_fd = open(dsp_dev, O_WRONLY|O_NONBLOCK)) == -1)
|
||||||
{
|
{
|
||||||
perror(dsp_dev);
|
perror(dsp_dev);
|
||||||
return False;
|
return False;
|
||||||
@ -112,6 +112,20 @@ wave_out_set_format(WAVEFORMATEX *pwfx)
|
|||||||
return True;
|
return True;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wave_out_volume(uint16 left, uint16 right)
|
||||||
|
{
|
||||||
|
uint32 volume;
|
||||||
|
|
||||||
|
volume = left/(65536/100);
|
||||||
|
volume |= right/(65536/100) << 8;
|
||||||
|
if (ioctl(g_dsp_fd, MIXER_WRITE(SOUND_MIXER_PCM), &volume) == -1)
|
||||||
|
{
|
||||||
|
perror("MIXER_WRITE(SOUND_MIXER_PCM)");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
wave_out_write(STREAM s, uint16 tick, uint8 index)
|
wave_out_write(STREAM s, uint16 tick, uint8 index)
|
||||||
{
|
{
|
||||||
@ -129,6 +143,7 @@ wave_out_write(STREAM s, uint16 tick, uint8 index)
|
|||||||
packet->s = *s;
|
packet->s = *s;
|
||||||
packet->tick = tick;
|
packet->tick = tick;
|
||||||
packet->index = index;
|
packet->index = index;
|
||||||
|
packet->s.p += 4;
|
||||||
|
|
||||||
/* we steal the data buffer from s, give it a new one */
|
/* we steal the data buffer from s, give it a new one */
|
||||||
s->data = malloc(s->size);
|
s->data = malloc(s->size);
|
||||||
|
42
rdpsnd_sun.c
42
rdpsnd_sun.c
@ -111,16 +111,16 @@ wave_out_set_format(WAVEFORMATEX *pwfx)
|
|||||||
if (pwfx->wBitsPerSample == 8)
|
if (pwfx->wBitsPerSample == 8)
|
||||||
{
|
{
|
||||||
info.play.encoding = AUDIO_ENCODING_LINEAR8;
|
info.play.encoding = AUDIO_ENCODING_LINEAR8;
|
||||||
samplewidth = 1;
|
|
||||||
}
|
}
|
||||||
else if (pwfx->wBitsPerSample == 16)
|
else if (pwfx->wBitsPerSample == 16)
|
||||||
{
|
{
|
||||||
info.play.encoding = AUDIO_ENCODING_LINEAR;
|
info.play.encoding = AUDIO_ENCODING_LINEAR;
|
||||||
samplewidth = 2;
|
|
||||||
/* Do we need to swap the 16bit values? (Are we BigEndian) */
|
/* Do we need to swap the 16bit values? (Are we BigEndian) */
|
||||||
swapaudio = !(*(uint8 *) (&test));
|
swapaudio = !(*(uint8 *) (&test));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
samplewidth = pwfx->wBitsPerSample/8;
|
||||||
|
|
||||||
if (pwfx->nChannels == 1 )
|
if (pwfx->nChannels == 1 )
|
||||||
{
|
{
|
||||||
info.play.channels = AUDIO_CHANNELS_MONO;
|
info.play.channels = AUDIO_CHANNELS_MONO;
|
||||||
@ -136,6 +136,7 @@ wave_out_set_format(WAVEFORMATEX *pwfx)
|
|||||||
info.play.samples = 0;
|
info.play.samples = 0;
|
||||||
info.play.eof = 0;
|
info.play.eof = 0;
|
||||||
info.play.error = 0;
|
info.play.error = 0;
|
||||||
|
reopened = True;
|
||||||
|
|
||||||
if (ioctl(g_dsp_fd, AUDIO_SETINFO, &info) == -1)
|
if (ioctl(g_dsp_fd, AUDIO_SETINFO, &info) == -1)
|
||||||
{
|
{
|
||||||
@ -147,6 +148,40 @@ wave_out_set_format(WAVEFORMATEX *pwfx)
|
|||||||
return True;
|
return True;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wave_out_volume(uint16 left, uint16 right)
|
||||||
|
{
|
||||||
|
audio_info_t info;
|
||||||
|
uint balance;
|
||||||
|
uint volume;
|
||||||
|
|
||||||
|
if (ioctl(g_dsp_fd, AUDIO_GETINFO, &info) == -1)
|
||||||
|
{
|
||||||
|
perror("AUDIO_GETINFO");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
volume = (left > right) ? left : right;
|
||||||
|
|
||||||
|
if ( volume/AUDIO_MID_BALANCE != 0 )
|
||||||
|
{
|
||||||
|
balance = AUDIO_MID_BALANCE - (left/(volume/AUDIO_MID_BALANCE)) + (right/(volume/AUDIO_MID_BALANCE));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
balance = AUDIO_MID_BALANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
info.play.gain = volume/(65536/AUDIO_MAX_GAIN);
|
||||||
|
info.play.balance = balance;
|
||||||
|
|
||||||
|
if (ioctl(g_dsp_fd, AUDIO_SETINFO, &info) == -1)
|
||||||
|
{
|
||||||
|
perror("AUDIO_SETINFO");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
wave_out_write(STREAM s, uint16 tick, uint8 index)
|
wave_out_write(STREAM s, uint16 tick, uint8 index)
|
||||||
{
|
{
|
||||||
@ -164,6 +199,7 @@ wave_out_write(STREAM s, uint16 tick, uint8 index)
|
|||||||
packet->s = *s;
|
packet->s = *s;
|
||||||
packet->tick = tick;
|
packet->tick = tick;
|
||||||
packet->index = index;
|
packet->index = index;
|
||||||
|
packet->s.p += 4;
|
||||||
|
|
||||||
/* we steal the data buffer from s, give it a new one */
|
/* we steal the data buffer from s, give it a new one */
|
||||||
s->data = malloc(s->size);
|
s->data = malloc(s->size);
|
||||||
@ -214,8 +250,8 @@ wave_out_play(void)
|
|||||||
swap = *(out->p + i);
|
swap = *(out->p + i);
|
||||||
*(out->p + i) = *(out->p + i + 1);
|
*(out->p + i) = *(out->p + i + 1);
|
||||||
*(out->p + i + 1) = swap;
|
*(out->p + i + 1) = swap;
|
||||||
swapped = True;
|
|
||||||
}
|
}
|
||||||
|
swapped = True;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( sentcompletion )
|
if ( sentcompletion )
|
||||||
|
Loading…
Reference in New Issue
Block a user