Commit 2ddfebf9 authored by Antoine Cellerier's avatar Antoine Cellerier

CD/DVD detection patch by Brian Robb

parent 93e6a6a6
...@@ -21,6 +21,7 @@ Benjamin Mironer <bmironer at noos.fr> - Mac OS X fixes ...@@ -21,6 +21,7 @@ Benjamin Mironer <bmironer at noos.fr> - Mac OS X fixes
Benoit Steiner <benny at via.ecp.fr> - MPEG system input, network input Benoit Steiner <benny at via.ecp.fr> - MPEG system input, network input
Bill Eldridge <bill at rfa.org> - documentation Bill Eldridge <bill at rfa.org> - documentation
Bob Maguire <maguirer at rjmaguire dot com> - addition of some controls to the OSX interface Bob Maguire <maguirer at rjmaguire dot com> - addition of some controls to the OSX interface
Brian Robb <vascy at hotmail dot com> - win32 CD/DVD drive detection in wx
Brieuc Jeunhomme <bbp at via.ecp.fr> - bug fixes Brieuc Jeunhomme <bbp at via.ecp.fr> - bug fixes
Bruno Vella <allevb at tin.it> - Italian localization Bruno Vella <allevb at tin.it> - Italian localization
Carlo Calabr <murray at via.ecp.fr> - Italian localization Carlo Calabr <murray at via.ecp.fr> - Italian localization
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
/***************************************************************************** /*****************************************************************************
* Preamble * Preamble
*****************************************************************************/ *****************************************************************************/
#include <stdlib.h> /* malloc(), free() */ #include <stdlib.h> /* malloc(), free() */
#include <errno.h> /* ENOMEM */ #include <errno.h> /* ENOMEM */
#include <string.h> /* strerror() */ #include <string.h> /* strerror() */
...@@ -174,7 +175,7 @@ END_EVENT_TABLE() ...@@ -174,7 +175,7 @@ END_EVENT_TABLE()
"Stream-and-Media info" when no input thread hasn't been initialized. "Stream-and-Media info" when no input thread hasn't been initialized.
*/ */
extern void MediaInsertCDDA( intf_thread_t *_p_intf, CdIo_t *p_cdio, extern void MediaInsertCDDA( intf_thread_t *_p_intf, CdIo_t *p_cdio,
track_t i_last_track ); track_t i_last_track );
#endif #endif
/***************************************************************************** /*****************************************************************************
...@@ -687,9 +688,9 @@ wxPanel *OpenDialog::DiscPanel( wxWindow* parent ) ...@@ -687,9 +688,9 @@ wxPanel *OpenDialog::DiscPanel( wxWindow* parent )
WXSIZEOF(disc_type_array), wxRA_SPECIFY_COLS ); WXSIZEOF(disc_type_array), wxRA_SPECIFY_COLS );
#ifdef HAVE_LIBCDIO #ifdef HAVE_LIBCDIO
disc_probe = new wxCheckBox( panel, DiscProbe_Event, disc_probe = new wxCheckBox( panel, DiscProbe_Event,
wxU(_("Probe Disc(s)")) ); wxU(_("Probe Disc(s)")) );
disc_probe->SetToolTip( wxU(_("Probe for a DVD, VCD or audio CD. " disc_probe->SetToolTip( wxU(_("Probe for a DVD, VCD or audio CD. "
"First try the Device name entered for the selected Disc type " "First try the Device name entered for the selected Disc type "
"(DVD, DVD Menu, VCD, audio CD). If that doesn't find media, try any device " "(DVD, DVD Menu, VCD, audio CD). If that doesn't find media, try any device "
"for the Disc type. If that doesn't work, then try looking for CD-ROMs or " "for the Disc type. If that doesn't work, then try looking for CD-ROMs or "
...@@ -707,6 +708,32 @@ wxPanel *OpenDialog::DiscPanel( wxWindow* parent ) ...@@ -707,6 +708,32 @@ wxPanel *OpenDialog::DiscPanel( wxWindow* parent )
wxDefaultPosition, wxDefaultSize, wxDefaultPosition, wxDefaultSize,
wxTE_PROCESS_ENTER); wxTE_PROCESS_ENTER);
#ifdef WIN32
char psz_default_device[3] = {0};
/* find the drive_name for the first cdrom drive,
* which is probably "D:" and put the drive_name into
* psz_default_device... */
for( char drive_letter = 'A'; drive_letter <= 'Z'; ++drive_letter )
{
char drive_name[3] = {drive_letter, ':', 0};
UINT type = GetDriveType( drive_name );
if( type == DRIVE_CDROM )
{
psz_default_device[0] = drive_letter;
psz_default_device[1] = ':';
break;
}
}
if( strlen(psz_default_device) > 0 )
{
if(disc_device)
disc_device->SetValue( wxL2U(psz_default_device) );
}
#endif
sizer->Add( label, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL ); sizer->Add( label, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
sizer->Add( disc_device, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL ); sizer->Add( disc_device, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
...@@ -939,11 +966,11 @@ void OpenDialog::UpdateMRL( int i_access_method ) ...@@ -939,11 +966,11 @@ void OpenDialog::UpdateMRL( int i_access_method )
disc_device->SetToolTip( wxU(_("Name of CD-ROM device " disc_device->SetToolTip( wxU(_("Name of CD-ROM device "
"to read audio CD from. If this field is left empty, we will scan " "to read audio CD from. If this field is left empty, we will scan "
"for a CD-ROM with an audio CD in it." )) ); "for a CD-ROM with an audio CD in it." )) );
mrltemp = wxT("cddax://") mrltemp = wxT("cddax://")
#else #else
disc_device->SetToolTip( wxU(_("Name of CD-ROM device " disc_device->SetToolTip( wxU(_("Name of CD-ROM device "
"to read audio CD from." )) ); "to read audio CD from." )) );
mrltemp = wxT("cdda://") mrltemp = wxT("cdda://")
#endif #endif
+ disc_device->GetValue(); + disc_device->GetValue();
if( i_disc_title > 0 ) if( i_disc_title > 0 )
...@@ -1289,7 +1316,7 @@ void OpenDialog::OnDiscDeviceChange( wxCommandEvent& event ) ...@@ -1289,7 +1316,7 @@ void OpenDialog::OnDiscDeviceChange( wxCommandEvent& event )
static bool IsDVD(const char *psz_drive) static bool IsDVD(const char *psz_drive)
{ {
CdIo_t *p_cdio = cdio_open (psz_drive, DRIVER_UNKNOWN); CdIo_t *p_cdio = cdio_open (psz_drive, DRIVER_UNKNOWN);
if (p_cdio) if (p_cdio)
{ {
discmode_t discmode = cdio_get_discmode(p_cdio); discmode_t discmode = cdio_get_discmode(p_cdio);
cdio_destroy(p_cdio); cdio_destroy(p_cdio);
...@@ -1312,18 +1339,18 @@ static char * ProbeDVD(const wxChar *device) ...@@ -1312,18 +1339,18 @@ static char * ProbeDVD(const wxChar *device)
{ {
return strdup(psz_device); return strdup(psz_device);
} }
ppsz_cd_drives = cdio_get_devices(DRIVER_DEVICE); ppsz_cd_drives = cdio_get_devices(DRIVER_DEVICE);
if( ppsz_cd_drives ) if( ppsz_cd_drives )
{ {
char **c; char **c;
for( c = ppsz_cd_drives; *c != NULL; c++ ) for( c = ppsz_cd_drives; *c != NULL; c++ )
{ {
if( IsDVD(*c) ) if( IsDVD(*c) )
{ {
char *psz_drive = strdup(*c); char *psz_drive = strdup(*c);
cdio_free_device_list(ppsz_cd_drives); cdio_free_device_list(ppsz_cd_drives);
return strdup(psz_drive); return strdup(psz_drive);
} }
} }
cdio_free_device_list(ppsz_cd_drives); cdio_free_device_list(ppsz_cd_drives);
...@@ -1333,18 +1360,18 @@ static char * ProbeDVD(const wxChar *device) ...@@ -1333,18 +1360,18 @@ static char * ProbeDVD(const wxChar *device)
static char * ProbeDevice(char **ppsz_search_devices, cdio_fs_anal_t mask, static char * ProbeDevice(char **ppsz_search_devices, cdio_fs_anal_t mask,
bool b_any) bool b_any)
{ {
char **ppsz_devices; char **ppsz_devices;
if( ppsz_search_devices && !ppsz_search_devices[0] ) if( ppsz_search_devices && !ppsz_search_devices[0] )
ppsz_search_devices = NULL; ppsz_search_devices = NULL;
/* Start out trying the device that has been entered so far. */ /* Start out trying the device that has been entered so far. */
ppsz_devices = cdio_get_devices_with_cap(ppsz_search_devices, mask, ppsz_devices = cdio_get_devices_with_cap(ppsz_search_devices, mask,
b_any); b_any);
if (ppsz_devices && *ppsz_devices) if (ppsz_devices && *ppsz_devices)
{ {
char *psz_device = strdup(*ppsz_devices); char *psz_device = strdup(*ppsz_devices);
cdio_free_device_list(ppsz_devices); cdio_free_device_list(ppsz_devices);
...@@ -1357,8 +1384,8 @@ static char * ProbeDevice(char **ppsz_search_devices, cdio_fs_anal_t mask, ...@@ -1357,8 +1384,8 @@ static char * ProbeDevice(char **ppsz_search_devices, cdio_fs_anal_t mask,
if( !ppsz_search_devices ) return NULL; if( !ppsz_search_devices ) return NULL;
ppsz_devices = cdio_get_devices_with_cap(NULL, mask, true); ppsz_devices = cdio_get_devices_with_cap(NULL, mask, true);
if (ppsz_devices && *ppsz_devices) if (ppsz_devices && *ppsz_devices)
{ {
char *psz_device = strdup(*ppsz_devices); char *psz_device = strdup(*ppsz_devices);
cdio_free_device_list(ppsz_devices); cdio_free_device_list(ppsz_devices);
...@@ -1392,13 +1419,13 @@ static char * ProbeVCD(const wxChar *device) ...@@ -1392,13 +1419,13 @@ static char * ProbeVCD(const wxChar *device)
char *psz_device = (char *) tmp_buf; char *psz_device = (char *) tmp_buf;
ppsz_device[0] = (device && *device) ? psz_device : NULL; ppsz_device[0] = (device && *device) ? psz_device : NULL;
ppsz_device[1] = NULL; ppsz_device[1] = NULL;
return ProbeDevice(ppsz_device, return ProbeDevice(ppsz_device,
(CDIO_FS_ANAL_SVCD|CDIO_FS_ANAL_CVD|CDIO_FS_ANAL_VIDEOCD (CDIO_FS_ANAL_SVCD|CDIO_FS_ANAL_CVD|CDIO_FS_ANAL_VIDEOCD
|CDIO_FS_UNKNOWN), true); |CDIO_FS_UNKNOWN), true);
} }
/* /*
Probe (find anywhere) a CD-DA, VCD, or a DVD. Probe (find anywhere) a CD-DA, VCD, or a DVD.
First try the device name that may have been entered for the "disc type" First try the device name that may have been entered for the "disc type"
selected. If that doesn't work we try any device for the disc type. selected. If that doesn't work we try any device for the disc type.
...@@ -1421,7 +1448,7 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) ) ...@@ -1421,7 +1448,7 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) )
{ {
case SELECTION_DISC_TYPE_DVD_MENUS: case SELECTION_DISC_TYPE_DVD_MENUS:
case SELECTION_DISC_TYPE_DVD: case SELECTION_DISC_TYPE_DVD:
/* If not a DVD then try for a VCD. If VCD fails it will /* If not a DVD then try for a VCD. If VCD fails it will
try for a CD-DA. */ try for a CD-DA. */
if (!psz_device) psz_device = ProbeDVD(disc_device->GetValue()); if (!psz_device) psz_device = ProbeDVD(disc_device->GetValue());
...@@ -1437,30 +1464,30 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) ) ...@@ -1437,30 +1464,30 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) )
case SELECTION_DISC_TYPE_VCD: /* VCD probe of some sort */ case SELECTION_DISC_TYPE_VCD: /* VCD probe of some sort */
if(!psz_device) psz_device = ProbeVCD(disc_device->GetValue()); if(!psz_device) psz_device = ProbeVCD(disc_device->GetValue());
if( psz_device ) if( psz_device )
{ {
#ifdef HAVE_VCDX #ifdef HAVE_VCDX
#if LIBVCD_VERSION_NUM > 23 #if LIBVCD_VERSION_NUM > 23
vcdinfo_obj_t *p_vcdinfo; vcdinfo_obj_t *p_vcdinfo;
/* Set LID or entry range accurately if possible. */ /* Set LID or entry range accurately if possible. */
if( vcdinfo_open(&p_vcdinfo, &psz_device, DRIVER_DEVICE, if( vcdinfo_open(&p_vcdinfo, &psz_device, DRIVER_DEVICE,
NULL) == VCDINFO_OPEN_VCD) NULL) == VCDINFO_OPEN_VCD)
{ {
if (config_GetInt( p_intf, "vcdx-PBC" )) if (config_GetInt( p_intf, "vcdx-PBC" ))
{ {
/* Set largest LID. */; /* Set largest LID. */;
disc_title->SetRange( 0, vcdinfo_get_num_LIDs(p_vcdinfo) ); disc_title->SetRange( 0, vcdinfo_get_num_LIDs(p_vcdinfo) );
} }
else else
{ {
/* Set largest Entry */ /* Set largest Entry */
disc_title->SetRange( 0, disc_title->SetRange( 0,
vcdinfo_get_num_entries(p_vcdinfo)-1 ); vcdinfo_get_num_entries(p_vcdinfo)-1 );
} }
vcdinfo_close(p_vcdinfo); vcdinfo_close(p_vcdinfo);
} }
#endif /* LIBVCD_VERSION_NUM > 23 */ #endif /* LIBVCD_VERSION_NUM > 23 */
disc_device->SetValue( wxL2U(psz_device) ); disc_device->SetValue( wxL2U(psz_device) );
#else #else
...@@ -1468,10 +1495,10 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) ) ...@@ -1468,10 +1495,10 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) )
disc_device->SetValue( wxL2U(psz_device) ); disc_device->SetValue( wxL2U(psz_device) );
/* Set track range accurately if possible. */ /* Set track range accurately if possible. */
if (p_cdio) if (p_cdio)
{ {
track_t i_last_track = cdio_get_last_track_num(p_cdio); track_t i_last_track = cdio_get_last_track_num(p_cdio);
disc_title->SetRange( 0, i_last_track-1 ); disc_title->SetRange( 0, i_last_track-1 );
} }
cdio_destroy(p_cdio); cdio_destroy(p_cdio);
#endif #endif
...@@ -1481,17 +1508,17 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) ) ...@@ -1481,17 +1508,17 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) )
b_probed_VCD = true; b_probed_VCD = true;
/* Not a VCD. Try for a DVD unless we've been there before. */ /* Not a VCD. Try for a DVD unless we've been there before. */
if( !b_probed_DVD && (psz_device = ProbeDVD(disc_device->GetValue())) ) if( !b_probed_DVD && (psz_device = ProbeDVD(disc_device->GetValue())) )
{ {
disc_type->SetSelection(SELECTION_DISC_TYPE_DVD_MENUS); disc_type->SetSelection(SELECTION_DISC_TYPE_DVD_MENUS);
OnDiscTypeChange( dummy_event ); OnDiscTypeChange( dummy_event );
goto retry; goto retry;
} }
b_probed_DVD = true; b_probed_DVD = true;
/* Couldn't find a VCD or DVD. See if we can find a CD-DA. */ /* Couldn't find a VCD or DVD. See if we can find a CD-DA. */
psz_device = ProbeCDDA(disc_device->GetValue()); psz_device = ProbeCDDA(disc_device->GetValue());
if( psz_device ) if( psz_device )
{ {
disc_type->SetSelection(SELECTION_DISC_TYPE_CDDA); disc_type->SetSelection(SELECTION_DISC_TYPE_CDDA);
OnDiscTypeChange( dummy_event ); OnDiscTypeChange( dummy_event );
...@@ -1499,7 +1526,7 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) ) ...@@ -1499,7 +1526,7 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) )
} }
/* Couldn't find a VCD, DVD or CD-DA. Null out the Device name and /* Couldn't find a VCD, DVD or CD-DA. Null out the Device name and
set to original selection. set to original selection.
*/ */
disc_device->SetValue( wxL2U("") ); disc_device->SetValue( wxL2U("") );
disc_type->SetSelection(i_selection); disc_type->SetSelection(i_selection);
...@@ -1508,16 +1535,16 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) ) ...@@ -1508,16 +1535,16 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) )
case SELECTION_DISC_TYPE_CDDA: case SELECTION_DISC_TYPE_CDDA:
if(!psz_device) psz_device = ProbeCDDA(disc_device->GetValue()); if(!psz_device) psz_device = ProbeCDDA(disc_device->GetValue());
if( psz_device ) if( psz_device )
{ {
CdIo_t *p_cdio = cdio_open (psz_device, DRIVER_UNKNOWN); CdIo_t *p_cdio = cdio_open (psz_device, DRIVER_UNKNOWN);
disc_device->SetValue( wxL2U(psz_device) ); disc_device->SetValue( wxL2U(psz_device) );
if (p_cdio) if (p_cdio)
{ {
track_t i_last_track = cdio_get_last_track_num(p_cdio); track_t i_last_track = cdio_get_last_track_num(p_cdio);
disc_title->SetRange( 0, i_last_track ); disc_title->SetRange( 0, i_last_track );
#if 0 #if 0
MediaInsertCDDA( p_intf, p_cdio, i_last_track ); MediaInsertCDDA( p_intf, p_cdio, i_last_track );
#endif #endif
} }
cdio_destroy(p_cdio); cdio_destroy(p_cdio);
...@@ -1525,17 +1552,17 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) ) ...@@ -1525,17 +1552,17 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) )
} }
/* Not a CD-DA. Try for a DVD unless we've been there before. */ /* Not a CD-DA. Try for a DVD unless we've been there before. */
if( !b_probed_DVD && (psz_device = ProbeDVD(disc_device->GetValue())) ) if( !b_probed_DVD && (psz_device = ProbeDVD(disc_device->GetValue())) )
{ {
disc_type->SetSelection(SELECTION_DISC_TYPE_DVD_MENUS); disc_type->SetSelection(SELECTION_DISC_TYPE_DVD_MENUS);
OnDiscTypeChange( dummy_event ); OnDiscTypeChange( dummy_event );
goto retry; goto retry;
} }
/* Couldn't find a CD-DA or DVD. See if we can find a VCD, unless /* Couldn't find a CD-DA or DVD. See if we can find a VCD, unless
we've tried that before. */ we've tried that before. */
if (!b_probed_VCD) psz_device = ProbeVCD(disc_device->GetValue()); if (!b_probed_VCD) psz_device = ProbeVCD(disc_device->GetValue());
if( psz_device ) if( psz_device )
{ {
disc_type->SetSelection(SELECTION_DISC_TYPE_VCD); disc_type->SetSelection(SELECTION_DISC_TYPE_VCD);
OnDiscTypeChange( dummy_event ); OnDiscTypeChange( dummy_event );
...@@ -1552,7 +1579,7 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) ) ...@@ -1552,7 +1579,7 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) )
free(psz_device); free(psz_device);
disc_probe->SetValue(FALSE); disc_probe->SetValue(FALSE);
UpdateMRL( DISC_ACCESS ); UpdateMRL( DISC_ACCESS );
} }
#endif /* HAVE_LIBCDIO */ #endif /* HAVE_LIBCDIO */
...@@ -1565,7 +1592,7 @@ void OpenDialog::OnDiscTypeChange( wxCommandEvent& WXUNUSED(event) ) ...@@ -1565,7 +1592,7 @@ void OpenDialog::OnDiscTypeChange( wxCommandEvent& WXUNUSED(event) )
{ {
case SELECTION_DISC_TYPE_DVD_MENUS: case SELECTION_DISC_TYPE_DVD_MENUS:
case SELECTION_DISC_TYPE_DVD: case SELECTION_DISC_TYPE_DVD:
disc_sub->Enable(); disc_sub_label->Enable(); disc_sub->Enable(); disc_sub_label->Enable();
disc_audio->Enable(); disc_audio_label->Enable(); disc_audio->Enable(); disc_audio_label->Enable();
disc_chapter->Enable(); disc_chapter_label->Enable(); disc_chapter->Enable(); disc_chapter_label->Enable();
...@@ -1602,19 +1629,19 @@ void OpenDialog::OnDiscTypeChange( wxCommandEvent& WXUNUSED(event) ) ...@@ -1602,19 +1629,19 @@ void OpenDialog::OnDiscTypeChange( wxCommandEvent& WXUNUSED(event) )
} }
#ifdef HAVE_VCDX #ifdef HAVE_VCDX
if (config_GetInt( p_intf, "vcdx-PBC" )) if (config_GetInt( p_intf, "vcdx-PBC" ))
{ {
disc_title_label->SetLabel ( wxT("Playback LID") ); disc_title_label->SetLabel ( wxT("Playback LID") );
disc_title->SetToolTip( wxU(_( disc_title->SetToolTip( wxU(_(
"Playback control (PBC) usually starts with number 1." )) ); "Playback control (PBC) usually starts with number 1." )) );
} }
else else
{ {
disc_title_label->SetLabel ( wxT("Entry") ); disc_title_label->SetLabel ( wxT("Entry") );
disc_title->SetToolTip( wxU(_( disc_title->SetToolTip( wxU(_(
"The first entry (the beginning of the first MPEG track) is 0." )) ); "The first entry (the beginning of the first MPEG track) is 0." )) );
} }
#else #else
disc_title_label->SetLabel ( wxU(_("Track")) ); disc_title_label->SetLabel ( wxU(_("Track")) );
disc_title->SetToolTip( wxU(_("Track number.")) ); disc_title->SetToolTip( wxU(_("Track number.")) );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment