[vlc-devel] Re: Corrected DirectX audio output patch
Matthew Armsby
uberground at gmail.com
Sun May 22 14:50:55 CEST 2005
On 5/22/05, Sigmund Augdal <sigmunau at stud.ntnu.no> wrote:
> On Sun, May 22, 2005 at 09:11:10PM +1000, Matthew Armsby wrote:
> > Corrected spacing to 4 space indentation.
> >
> > ========================
> > Patch to select which device to output to for directx audio
> >
> > File affected:
> > vlc-trunk/modules/audio_output/directx.c
> > New Command line parameter:
> > --directx-device N (0=primary, 1..(Number of devices)=device by number)
> > When N is larger than number of devices, use last device in list.
> > When N is less than 0, use primary device.
> > GUI Preferences:
> > 'DirectX audio output' appears in advanced settings
> > (audio > Output Modules > DirectX)
> > Defaults to primary device, so left editting as advanced setting.
> > The 'select device by number' was designed to be similar to use of PortAudio.
> Would it be possible to enumerate a list of strings describing the devices?
> That would help usability quite a bit. See alsa.c for an example on how to
> do that.
>
> Sigmund
Yep. Can probably add it Thursday-ish, or if someone's bored see
CallBackDirectSoundEnum for getting descriptions.
Cheers
Matt
> > Index: directx.c
> > ===================================================================
> > --- directx.c (revision 11090)
> > +++ directx.c (working copy)
> > @@ -143,7 +143,20 @@
> >
> > } notification_thread_t;
> >
> > +
> > /*****************************************************************************
> > + * directSoundDevice: List of available audio devices
> > + *****************************************************************************/
> > +struct directSoundDevice;
> > +typedef struct directSoundDevice
> > +{
> > + LPGUID p_guid;
> > + char *psz_description;
> > + char *psz_module;
> > + struct directSoundDevice *p_next;
> > +} directSoundDevice;
> > +
> > +/*****************************************************************************
> > * aout_sys_t: directx audio output method descriptor
> > *****************************************************************************
> > * This structure is part of the audio output thread descriptor.
> > @@ -161,7 +174,7 @@
> > notification_thread_t *p_notif; /* DirectSoundThread id */
> >
> > int b_playing; /* playing status */
> > -
> > + int i_device_id; /* User defined device index */
> > int i_frame_size; /* Size in bytes of one frame */
> >
> > vlc_bool_t b_chan_reorder; /* do we need channel reordering */
> > @@ -206,6 +219,10 @@
> > /*****************************************************************************
> > * Module descriptor
> > *****************************************************************************/
> > +#define FLOAT_TEXT N_("Output device")
> > +#define FLOAT_LONGTEXT N_( \
> > + "DirectX device number: 0 default device, 1..N device by number" \
> > + "(Note that the default device appears as 0 AND another number)." )
> > vlc_module_begin();
> > set_description( _("DirectX audio output") );
> > set_shortname( "DirectX" );
> > @@ -213,6 +230,10 @@
> > set_category( CAT_AUDIO );
> > set_subcategory( SUBCAT_AUDIO_AOUT );
> > add_shortcut( "directx" );
> > + /* Add variable to VLC directx-device, default value 0, don't callback,
> > + name the GUI field, GUI tooltip, display as advanced in preferences */
> > + add_integer( "directx-device", 0, NULL, FLOAT_TEXT,
> > + FLOAT_LONGTEXT, VLC_TRUE );
> > set_callbacks( OpenAudio, CloseAudio );
> > vlc_module_end();
> >
> > @@ -247,6 +268,13 @@
> > p_aout->output.pf_play = Play;
> > aout_VolumeSoftInit( p_aout );
> >
> > +
> > + /* Retrieve output device id from config */
> > + var_Create( p_aout, "directx-device", VLC_VAR_INTEGER|VLC_VAR_DOINHERIT);
> > + var_Get( p_aout, "directx-device", &val );
> > + p_aout->output.p_sys->i_device_id = val.i_int;
> > +
> > +
> > /* Initialise DirectSound */
> > if( InitDirectSound( p_aout ) )
> > {
> > @@ -594,12 +622,73 @@
> > }
> >
> > /*****************************************************************************
> > + * CallBackDirectSoundEnum: callback to enumerate available devices
> > + *****************************************************************************/
> > +static int CALLBACK CallBackDirectSoundEnum (LPGUID p_guid, LPCSTR psz_desc,
> > + LPCSTR psz_mod, LPVOID p_list)
> > +{
> > + directSoundDevice *p_ad;
> > + directSoundDevice *p_otherad = (directSoundDevice *)p_list;
> > + p_ad = malloc( sizeof( directSoundDevice ) );
> > +
> > + /* GUID == NULL is primary (default) device */
> > + if (p_guid == NULL)
> > + {
> > + p_ad->p_guid = NULL;
> > + }
> > + else
> > + {
> > + p_ad->p_guid = malloc( sizeof( GUID ) );
> > + memcpy( p_ad->p_guid, p_guid, sizeof( GUID ) );
> > + }
> > +
> > + /* Desc & mod not used, kept for next author to use if needed */
> > + p_ad->psz_description = malloc( sizeof(char) * (strlen(psz_desc) + 1) );
> > + strcpy(p_ad->psz_description, psz_desc);
> > + p_ad->psz_module = malloc( sizeof(char) * (strlen(psz_mod) + 1) );
> > + strcpy(p_ad->psz_module, psz_mod);
> > +
> > + /* add to end of list */
> > + p_ad->p_next = NULL;
> > + while( p_otherad->p_next != NULL )
> > + p_otherad = p_otherad->p_next;
> > + p_otherad->p_next = p_ad;
> > + return 1;
> > +}
> > +/*****************************************************************************
> > + * DirectSoundEnumCleanup: free memory used when enumerating devices
> > + *****************************************************************************/
> > +static void DirectSoundEnumCleanup(directSoundDevice *p_headDev) {
> > + directSoundDevice *p_currDev; /* current device */
> > + directSoundDevice *p_delDev; /* pointer for deleting devices */
> > + /* clean up: delete the enumerated devices */
> > + p_currDev = p_headDev->p_next;
> > + while ( p_currDev->p_next != NULL )
> > + {
> > + p_delDev = p_currDev;
> > + p_currDev = p_currDev->p_next;
> > + free( p_delDev->p_guid );
> > + free( p_delDev );
> > + }
> > + free( p_currDev->p_guid );
> > + free( p_currDev );
> > + free( p_headDev );
> > +}
> > +/*****************************************************************************
> > * InitDirectSound: handle all the gory details of DirectSound initialisation
> > *****************************************************************************/
> > static int InitDirectSound( aout_instance_t *p_aout )
> > {
> > HRESULT (WINAPI *OurDirectSoundCreate)(LPGUID, LPDIRECTSOUND *, LPUNKNOWN);
> > + HRESULT (WINAPI *OurDirectSoundEnumerate)(LPDSENUMCALLBACK, LPVOID);
> > + int i_selectedId; /* user defined index of device */
> > + directSoundDevice *p_headDev; /* head of device list */
> > + directSoundDevice *p_currDev; /* current device */
> >
> > + i_selectedId = p_aout->output.p_sys->i_device_id; /* get user selected */
> > + p_headDev = malloc( sizeof( directSoundDevice ) );
> > + p_headDev->p_next = NULL;
> > +
> > p_aout->output.p_sys->hdsound_dll = LoadLibrary("DSOUND.DLL");
> > if( p_aout->output.p_sys->hdsound_dll == NULL )
> > {
> > @@ -615,15 +704,56 @@
> > msg_Warn( p_aout, "GetProcAddress FAILED" );
> > goto error;
> > }
> > -
> > - /* Create the direct sound object */
> > - if FAILED( OurDirectSoundCreate( NULL, &p_aout->output.p_sys->p_dsobject,
> > +
> > + /* Get DirectSoundEnumerate
> > + (note getting ASCII call, not Unicode DirectSoundEnumerateW) */
> > + OurDirectSoundEnumerate = (void *)GetProcAddress(
> > + p_aout->output.p_sys->hdsound_dll,
> > + "DirectSoundEnumerateA" );
> > +
> > + if( OurDirectSoundCreate == NULL )
> > + {
> > + msg_Warn( p_aout, "GetProcAddress DirectSoundEnumerateA FAILED" );
> > + goto error;
> > + }
> > +
> > + /* attempt enumeration */
> > + if (FAILED ( OurDirectSoundEnumerate( CallBackDirectSoundEnum,
> > + p_headDev ) ) )
> > + {
> > + msg_Warn( p_aout, "Enumeration of DirectSound devices FAILED" );
> > + goto error;
> > + }
> > + else
> > + {
> > + /* ignore negative device id
> > + (unnecessary, will default to first device)
> > + ignore id past end of list
> > + (default to last device) */
> > +
> > + /* loop through to the selected device */
> > + p_currDev = p_headDev->p_next;
> > + while ( p_currDev->p_next != NULL && 0 < i_selectedId )
> > + {
> > + i_selectedId--;
> > + p_currDev = p_currDev->p_next;
> > + }
> > + }
> > +
> > + /* Create the direct sound object */
> > + if FAILED( OurDirectSoundCreate( p_currDev->p_guid,
> > + &p_aout->output.p_sys->p_dsobject,
> > NULL ) )
> > {
> > + /* clean up enumerated devices */
> > + DirectSoundEnumCleanup(p_headDev);
> > msg_Warn( p_aout, "cannot create a direct sound device" );
> > goto error;
> > }
> >
> > + /* clean up enumerated devices */
> > + DirectSoundEnumCleanup( p_headDev );
> > +
> > /* Set DirectSound Cooperative level, ie what control we want over Windows
> > * sound device. In our case, DSSCL_EXCLUSIVE means that we can modify the
> > * settings of the primary buffer, but also that only the sound of our
>
>
> --
> Sigmund Augdal
> Edgar B. Schieldropsv 29-14
> N-7033 Trondheim
> Norway
> tlf: 91809129
>
> --
> This is the vlc-devel mailing-list, see http://www.videolan.org/vlc/
> To unsubscribe, please read http://developers.videolan.org/lists.html
>
>
--
This is the vlc-devel mailing-list, see http://www.videolan.org/vlc/
To unsubscribe, please read http://developers.videolan.org/lists.html
More information about the vlc-devel
mailing list