mirror of
https://github.com/mpv-player/mpv
synced 2024-12-13 02:15:59 +00:00
device selection support
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@14399 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
92f7267851
commit
5817da7f59
@ -34,6 +34,7 @@
|
|||||||
#include "mp_msg.h"
|
#include "mp_msg.h"
|
||||||
#include "libvo/fastmemcpy.h"
|
#include "libvo/fastmemcpy.h"
|
||||||
#include "osdep/timer.h"
|
#include "osdep/timer.h"
|
||||||
|
#include "subopt-helper.h"
|
||||||
|
|
||||||
|
|
||||||
static ao_info_t info =
|
static ao_info_t info =
|
||||||
@ -113,6 +114,8 @@ static LPDIRECTSOUNDBUFFER hdsbuf = NULL; ///secondary direct sound buffer (stre
|
|||||||
static int buffer_size = 0; ///size in bytes of the direct sound buffer
|
static int buffer_size = 0; ///size in bytes of the direct sound buffer
|
||||||
static int write_offset = 0; ///offset of the write cursor in the direct sound buffer
|
static int write_offset = 0; ///offset of the write cursor in the direct sound buffer
|
||||||
static int min_free_space = 4096; ///if the free space is below this value get_space() will return 0
|
static int min_free_space = 4096; ///if the free space is below this value get_space() will return 0
|
||||||
|
static int device_num = 0; ///wanted device number
|
||||||
|
static GUID device; ///guid of the device
|
||||||
|
|
||||||
/***************************************************************************************/
|
/***************************************************************************************/
|
||||||
|
|
||||||
@ -165,6 +168,41 @@ static void UninitDirectSound(void)
|
|||||||
mp_msg(MSGT_AO, MSGL_V, "ao_dsound: DirectSound uninitialized\n");
|
mp_msg(MSGT_AO, MSGL_V, "ao_dsound: DirectSound uninitialized\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief print the commandline help
|
||||||
|
*/
|
||||||
|
static void print_help()
|
||||||
|
{
|
||||||
|
mp_msg(MSGT_AO, MSGL_FATAL,
|
||||||
|
"\n-ao dsound commandline help:\n"
|
||||||
|
"Example: mplayer -ao dsound:device=1\n"
|
||||||
|
" sets 1st device\n"
|
||||||
|
"\nOptions:\n"
|
||||||
|
" device=<device-number>\n"
|
||||||
|
" Sets device number, use -v to get a list\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief enumerate direct sound devices
|
||||||
|
\return TRUE to continue with the enumeration
|
||||||
|
*/
|
||||||
|
static BOOL CALLBACK DirectSoundEnum(LPGUID guid,LPCSTR desc,LPCSTR module,LPVOID context)
|
||||||
|
{
|
||||||
|
int* device_index=context;
|
||||||
|
mp_msg(MSGT_AO, MSGL_V,"%i %s ",*device_index,desc);
|
||||||
|
if(device_num==*device_index){
|
||||||
|
mp_msg(MSGT_AO, MSGL_V,"<--");
|
||||||
|
if(guid){
|
||||||
|
memcpy(&device,guid,sizeof(GUID));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mp_msg(MSGT_AO, MSGL_V,"\n");
|
||||||
|
(*device_index)++;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\brief initilize direct sound
|
\brief initilize direct sound
|
||||||
\return 0 if error, 1 if ok
|
\return 0 if error, 1 if ok
|
||||||
@ -175,21 +213,37 @@ static int InitDirectSound(void)
|
|||||||
|
|
||||||
// initialize directsound
|
// initialize directsound
|
||||||
HRESULT (WINAPI *OurDirectSoundCreate)(LPGUID, LPDIRECTSOUND *, LPUNKNOWN);
|
HRESULT (WINAPI *OurDirectSoundCreate)(LPGUID, LPDIRECTSOUND *, LPUNKNOWN);
|
||||||
|
HRESULT (WINAPI *OurDirectSoundEnumerate)(LPDSENUMCALLBACKA, LPVOID);
|
||||||
|
int device_index=0;
|
||||||
|
opt_t subopts[] = {
|
||||||
|
{"device", OPT_ARG_INT, &device_num,NULL},
|
||||||
|
{NULL}
|
||||||
|
};
|
||||||
|
if (subopt_parse(ao_subdevice, subopts) != 0) {
|
||||||
|
print_help();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
hdsound_dll = LoadLibrary("DSOUND.DLL");
|
hdsound_dll = LoadLibrary("DSOUND.DLL");
|
||||||
if (hdsound_dll == NULL) {
|
if (hdsound_dll == NULL) {
|
||||||
mp_msg(MSGT_AO, MSGL_ERR, "ao_dsound: cannot load DSOUND.DLL\n");
|
mp_msg(MSGT_AO, MSGL_ERR, "ao_dsound: cannot load DSOUND.DLL\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
OurDirectSoundCreate = (void*)GetProcAddress(hdsound_dll, "DirectSoundCreate");
|
OurDirectSoundCreate = (void*)GetProcAddress(hdsound_dll, "DirectSoundCreate");
|
||||||
|
OurDirectSoundEnumerate = (void*)GetProcAddress(hdsound_dll, "DirectSoundEnumerateA");
|
||||||
|
|
||||||
if (OurDirectSoundCreate == NULL) {
|
if (OurDirectSoundCreate == NULL || OurDirectSoundEnumerate == NULL) {
|
||||||
mp_msg(MSGT_AO, MSGL_ERR, "ao_dsound: GetProcAddress FAILED\n");
|
mp_msg(MSGT_AO, MSGL_ERR, "ao_dsound: GetProcAddress FAILED\n");
|
||||||
FreeLibrary(hdsound_dll);
|
FreeLibrary(hdsound_dll);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Enumerate all directsound devices
|
||||||
|
mp_msg(MSGT_AO, MSGL_V,"ao_dsound: Output Devices:\n");
|
||||||
|
OurDirectSoundEnumerate(DirectSoundEnum,&device_index);
|
||||||
|
|
||||||
// Create the direct sound object
|
// Create the direct sound object
|
||||||
if FAILED(OurDirectSoundCreate(NULL, &hds, NULL )) {
|
if FAILED(OurDirectSoundCreate((device_num)?&device:NULL, &hds, NULL )) {
|
||||||
mp_msg(MSGT_AO, MSGL_ERR, "ao_dsound: cannot create a DirectSound device\n");
|
mp_msg(MSGT_AO, MSGL_ERR, "ao_dsound: cannot create a DirectSound device\n");
|
||||||
FreeLibrary(hdsound_dll);
|
FreeLibrary(hdsound_dll);
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user