# include "config.h"
#endif
-#include <vlc/vlc.h>
+#include <vlc_common.h>
+#include <vlc_plugin.h>
#include <vlc_aout.h>
#include <windows.h>
# define SPEAKER_RESERVED 0x80000000
#endif
+#ifndef DSSPEAKER_DSSPEAKER_DIRECTOUT
+# define DSSPEAKER_DSSPEAKER_DIRECTOUT 0x00000000
+#endif
#ifndef DSSPEAKER_HEADPHONE
# define DSSPEAKER_HEADPHONE 0x00000001
#endif
#ifndef DSSPEAKER_5POINT1
# define DSSPEAKER_5POINT1 0x00000006
#endif
+#ifndef DSSPEAKER_7POINT1
+# define DSSPEAKER_7POINT1 0x00000007
+#endif
+#ifndef DSSPEAKER_7POINT1_SURROUND
+# define DSSPEAKER_7POINT1_SURROUND 0x00000008
+#endif
+#ifndef DSSPEAKER_7POINT1_WIDE
+# define DSSPEAKER_7POINT1_WIDE DSSPEAKER_7POINT1
+#endif
#ifndef _WAVEFORMATEXTENSIBLE_
typedef struct {
"audio output mode (which is not well supported by some soundcards)." )
vlc_module_begin();
- set_description( _("DirectX audio output") );
+ set_description( N_("DirectX audio output") );
set_shortname( "DirectX" );
set_capability( "audio output", 100 );
set_category( CAT_AUDIO );
/* Allocate structure */
p_aout->output.p_sys = malloc( sizeof( aout_sys_t ) );
if( p_aout->output.p_sys == NULL )
- {
- msg_Err( p_aout, "out of memory" );
return VLC_ENOMEM;
- }
/* Initialize some variables */
p_aout->output.p_sys->p_dsobject = NULL;
| AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT
| AOUT_CHAN_LFE;
}
+ else if( val.i_int == AOUT_VAR_7_1 )
+ {
+ p_aout->output.output.i_physical_channels
+ = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
+ | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT
+ | AOUT_CHAN_MIDDLELEFT | AOUT_CHAN_MIDDLERIGHT
+ | AOUT_CHAN_LFE;
+ }
else if( val.i_int == AOUT_VAR_3F2R )
{
p_aout->output.output.i_physical_channels
int i_format;
unsigned int i_physical_channels;
DWORD ui_speaker_config;
+ bool is_default_output_set = false;
var_Create( p_aout, "audio-device", VLC_VAR_INTEGER | VLC_VAR_HASCHOICE );
text.psz_string = _("Audio Device");
text.psz_string = "5.1";
var_Change( p_aout, "audio-device",
VLC_VAR_ADDCHOICE, &val, &text );
+ var_Change( p_aout, "audio-device", VLC_VAR_SETDEFAULT, &val, NULL );
+ is_default_output_set = true;
msg_Dbg( p_aout, "device supports 5.1 channels" );
}
}
+ /* Test for 7.1 support */
+ i_physical_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
+ AOUT_CHAN_CENTER | AOUT_CHAN_REARLEFT |
+ AOUT_CHAN_MIDDLELEFT | AOUT_CHAN_MIDDLERIGHT |
+ AOUT_CHAN_REARRIGHT | AOUT_CHAN_LFE;
+ if( p_aout->output.output.i_physical_channels == i_physical_channels )
+ {
+ if( CreateDSBufferPCM( p_aout, &i_format, i_physical_channels, 8,
+ p_aout->output.output.i_rate, true )
+ == VLC_SUCCESS )
+ {
+ val.i_int = AOUT_VAR_7_1;
+ text.psz_string = "7.1";
+ var_Change( p_aout, "audio-device",
+ VLC_VAR_ADDCHOICE, &val, &text );
+ var_Change( p_aout, "audio-device", VLC_VAR_SETDEFAULT, &val, NULL );
+ is_default_output_set = true;
+ msg_Dbg( p_aout, "device supports 7.1 channels" );
+ }
+ }
+
/* Test for 3 Front 2 Rear support */
i_physical_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
AOUT_CHAN_CENTER | AOUT_CHAN_REARLEFT |
text.psz_string = N_("3 Front 2 Rear");
var_Change( p_aout, "audio-device",
VLC_VAR_ADDCHOICE, &val, &text );
+ if(!is_default_output_set)
+ {
+ var_Change( p_aout, "audio-device", VLC_VAR_SETDEFAULT, &val, NULL );
+ is_default_output_set = true;
+ }
msg_Dbg( p_aout, "device supports 5 channels" );
}
}
text.psz_string = N_("2 Front 2 Rear");
var_Change( p_aout, "audio-device",
VLC_VAR_ADDCHOICE, &val, &text );
+ if(!is_default_output_set)
+ {
+ var_Change( p_aout, "audio-device", VLC_VAR_SETDEFAULT, &val, NULL );
+ is_default_output_set = true;
+ }
msg_Dbg( p_aout, "device supports 4 channels" );
}
}
val.i_int = AOUT_VAR_STEREO;
text.psz_string = N_("Stereo");
var_Change( p_aout, "audio-device", VLC_VAR_ADDCHOICE, &val, &text );
- var_Change( p_aout, "audio-device", VLC_VAR_SETDEFAULT, &val, NULL );
+ if(!is_default_output_set)
+ {
+ var_Change( p_aout, "audio-device", VLC_VAR_SETDEFAULT, &val, NULL );
+ is_default_output_set = true;
+ msg_Dbg( p_aout, "device supports 2 channels (DEFAULT!)" );
+ }
msg_Dbg( p_aout, "device supports 2 channels" );
}
&ui_speaker_config ) )
{
ui_speaker_config = DSSPEAKER_STEREO;
+ msg_Dbg( p_aout, "GetSpeakerConfig failed" );
}
switch( DSSPEAKER_CONFIG(ui_speaker_config) )
{
+ case DSSPEAKER_7POINT1:
+ msg_Dbg( p_aout, "Windows says your SpeakerConfig is 7.1" );
+ val.i_int = AOUT_VAR_7_1;
+ break;
case DSSPEAKER_5POINT1:
+ msg_Dbg( p_aout, "Windows says your SpeakerConfig is 5.1" );
val.i_int = AOUT_VAR_5_1;
break;
case DSSPEAKER_QUAD:
+ msg_Dbg( p_aout, "Windows says your SpeakerConfig is Quad" );
val.i_int = AOUT_VAR_2F2R;
break;
#if 0 /* Lots of people just get their settings wrong and complain that
break;
#endif
case DSSPEAKER_SURROUND:
+ msg_Dbg( p_aout, "Windows says your SpeakerConfig is surround" );
case DSSPEAKER_STEREO:
+ msg_Dbg( p_aout, "Windows says your SpeakerConfig is stereo" );
default:
+ /* If nothing else is found, choose stereo output */
val.i_int = AOUT_VAR_STEREO;
break;
}
p_sys->i_bits_per_sample );
}
- p_aout->p_libvlc->pf_memcpy( p_write_position, p_buffer->p_buffer,
- l_bytes1 );
+ vlc_memcpy( p_write_position, p_buffer->p_buffer, l_bytes1 );
aout_BufferFree( p_buffer );
}
/* Wait here until Play() is called */
WaitForSingleObject( p_notif->event, INFINITE );
- if( !p_notif->b_die )
+ if( vlc_object_alive (p_notif) )
{
mwait( p_notif->start_date - AOUT_PTS_TOLERANCE / 2 );
}
last_time = mdate();
- while( !p_notif->b_die )
+ while( vlc_object_alive (p_notif) )
{
long l_read, l_free_slots;
mtime_t mtime = mdate();
/* Detect underruns */
if( l_queued && mtime - last_time >
- I64C(1000000) * l_queued / p_aout->output.output.i_rate )
+ INT64_C(1000000) * l_queued / p_aout->output.output.i_rate )
{
msg_Dbg( p_aout, "detected underrun!" );
}
for( i = 0; i < l_free_slots; i++ )
{
aout_buffer_t *p_buffer = aout_OutputNextBuffer( p_aout,
- mtime + I64C(1000000) * (i * FRAME_SIZE + l_queued) /
+ mtime + INT64_C(1000000) * (i * FRAME_SIZE + l_queued) /
p_aout->output.output.i_rate, b_sleek );
/* If there is no audio data available and we have some buffered
/* Sleep a reasonable amount of time */
l_queued += (i * FRAME_SIZE);
- msleep( I64C(1000000) * l_queued / p_aout->output.output.i_rate / 2 );
+ msleep( INT64_C(1000000) * l_queued / p_aout->output.output.i_rate / 2 );
}
/* make sure the buffer isn't playing */