Commit cd6c93f1 authored by Rocky Bernstein's avatar Rocky Bernstein

A number of probe disc fixes:

- DVD probing works more like CD-DA and VCD probing.
- Reduce libcdio verbosity on errors (which are largely to be expected).
- If no media found set Device name null and don't change selection type
- CD-DA probing had been broken 
parent d6cd7844
...@@ -30,9 +30,11 @@ ...@@ -30,9 +30,11 @@
#include <stdio.h> #include <stdio.h>
#include <vlc/vlc.h> #include <vlc/vlc.h>
#ifdef HAVE_LIBCDIO #ifdef HAVE_LIBCDIO
#include <cdio/cdio.h> #include <cdio/cdio.h>
#include <cdio/cd_types.h> #include <cdio/cd_types.h>
#include <cdio/logging.h>
#endif /* HAVE_LIBCDIO */ #endif /* HAVE_LIBCDIO */
#ifdef HAVE_VCDINFO #ifdef HAVE_VCDINFO
...@@ -162,6 +164,14 @@ BEGIN_EVENT_TABLE(OpenDialog, wxDialog) ...@@ -162,6 +164,14 @@ BEGIN_EVENT_TABLE(OpenDialog, wxDialog)
END_EVENT_TABLE() END_EVENT_TABLE()
#if 0
/* Perhaps someday we'll figure out how to add media information to
"Stream-and-Media info" when no input thread hasn't been initialized.
*/
extern void MediaInsertCDDA( intf_thread_t *_p_intf, CdIo_t *p_cdio,
track_t i_last_track );
#endif
/***************************************************************************** /*****************************************************************************
* AutoBuiltPanel. * AutoBuiltPanel.
*****************************************************************************/ *****************************************************************************/
...@@ -673,7 +683,7 @@ wxPanel *OpenDialog::DiscPanel( wxWindow* parent ) ...@@ -673,7 +683,7 @@ wxPanel *OpenDialog::DiscPanel( wxWindow* parent )
#ifdef HAVE_LIBCDIO #ifdef HAVE_LIBCDIO
disc_probe = new wxCheckBox( panel, DiscProbe_Event, disc_probe = new wxCheckBox( panel, DiscProbe_Event,
wxU(_("Probe Disc")) ); 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 "
...@@ -1257,43 +1267,67 @@ void OpenDialog::OnDiscDeviceChange( wxCommandEvent& event ) ...@@ -1257,43 +1267,67 @@ void OpenDialog::OnDiscDeviceChange( wxCommandEvent& event )
#ifdef HAVE_LIBCDIO #ifdef HAVE_LIBCDIO
/* Return true if *psz_drive is a drive with a DVD in it. A more complete
check would see if the media looks like a *playable* DVD. This should
go into libcdio.
*/
static bool IsDVD(const char *psz_drive)
{
CdIo_t *p_cdio = cdio_open (psz_drive, DRIVER_UNKNOWN);
if (p_cdio)
{
discmode_t discmode = cdio_get_discmode(p_cdio);
cdio_destroy(p_cdio);
return cdio_is_discmode_dvd(discmode);
}
return false;
}
/* Return a device that has a DVD in it. The caller needs to free /* Return a device that has a DVD in it. The caller needs to free
the returned string. the returned string.
*/ */
static char * ProbeDVD() static char * ProbeDVD(const wxChar *device)
{ {
char **ppsz_cd_drives = cdio_get_devices(DRIVER_DEVICE); char **ppsz_cd_drives;
if (ppsz_cd_drives) const wxWX2MBbuf tmp_buf = wxConvCurrent->cWX2MB(device);
char *psz_device = (char *) tmp_buf;
if( IsDVD(psz_device) )
{
return strdup(psz_device);
}
ppsz_cd_drives = cdio_get_devices(DRIVER_DEVICE);
if( ppsz_cd_drives )
{ {
char **c; char **c;
for( c = ppsz_cd_drives; *c != NULL; c++ ) for( c = ppsz_cd_drives; *c != NULL; c++ )
{ {
CdIo_t *p_cdio = cdio_open (*c, DRIVER_UNKNOWN); if( IsDVD(*c) )
if (p_cdio)
{
discmode_t discmode = cdio_get_discmode(p_cdio);
cdio_destroy(p_cdio);
if( cdio_is_discmode_dvd(discmode) )
{ {
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);
} }
return NULL; return NULL;
} }
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)
{ {
char **ppsz_devices; char **ppsz_devices;
if( ppsz_search_devices && !ppsz_search_devices[0] )
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, true); ppsz_devices = cdio_get_devices_with_cap(ppsz_search_devices, mask,
b_any);
if (ppsz_devices && *ppsz_devices) if (ppsz_devices && *ppsz_devices)
{ {
...@@ -1302,10 +1336,10 @@ static char * ProbeDevice(char **ppsz_search_devices, cdio_fs_anal_t mask) ...@@ -1302,10 +1336,10 @@ static char * ProbeDevice(char **ppsz_search_devices, cdio_fs_anal_t mask)
return psz_device; return psz_device;
} }
/* If there was no device specified on the first try then give up /* If there was no device specified on the first try, then give up
now. Otherwise accept any CD-ROM in the class (e.g. VCD or DVD). now. Otherwise accept any CD-ROM in the class (e.g. VCD or DVD).
*/ */
if (!ppsz_search_devices[0]) 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);
...@@ -1330,7 +1364,7 @@ static char * ProbeCDDA(const wxChar *device) ...@@ -1330,7 +1364,7 @@ static char * ProbeCDDA(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, CDIO_FS_AUDIO); return ProbeDevice(ppsz_device, CDIO_FS_AUDIO, false);
} }
/* Return a device that has a VCD in it. The caller needs to free /* Return a device that has a VCD in it. The caller needs to free
...@@ -1345,9 +1379,14 @@ static char * ProbeVCD(const wxChar *device) ...@@ -1345,9 +1379,14 @@ static char * ProbeVCD(const wxChar *device)
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)); |CDIO_FS_UNKNOWN), true);
} }
#define SELECTION_DISC_TYPE_DVD_MENUS 0
#define SELECTION_DISC_TYPE_DVD 1
#define SELECTION_DISC_TYPE_VCD 2
#define SELECTION_DISC_TYPE_CDDA 3
/* /*
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"
...@@ -1361,28 +1400,31 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) ) ...@@ -1361,28 +1400,31 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) )
char *psz_device = NULL; char *psz_device = NULL;
bool b_probed_DVD = false; bool b_probed_DVD = false;
bool b_probed_VCD = false; bool b_probed_VCD = false;
const int i_selection = disc_type->GetSelection();
/* Reduce verbosity of cdio errors. */
cdio_loglevel_default = CDIO_LOG_ERROR;
retry: retry:
switch( disc_type->GetSelection() ) switch( disc_type->GetSelection() )
{ {
case 0: /* DVD with menus */ case SELECTION_DISC_TYPE_DVD_MENUS:
case 1: /* DVD without menus */ 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(); if (!psz_device) psz_device = ProbeDVD(disc_device->GetValue());
if (!psz_device) if (!psz_device)
{ {
b_probed_DVD = true; b_probed_DVD = true;
disc_type->SetSelection(2); disc_type->SetSelection(SELECTION_DISC_TYPE_VCD);
OnDiscTypeChange( dummy_event ); OnDiscTypeChange( dummy_event );
goto retry; goto retry;
} }
disc_device->SetValue( wxL2U(psz_device) ); disc_device->SetValue( wxL2U(psz_device) );
free(psz_device);
break; break;
case 2: /* 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 )
{ {
...@@ -1420,7 +1462,6 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) ) ...@@ -1420,7 +1462,6 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) )
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 );
} }
free(psz_device);
cdio_destroy(p_cdio); cdio_destroy(p_cdio);
#endif #endif
break; break;
...@@ -1429,9 +1470,9 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) ) ...@@ -1429,9 +1470,9 @@ 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()) ) if( !b_probed_DVD && (psz_device = ProbeDVD(disc_device->GetValue())) )
{ {
disc_type->SetSelection(0); disc_type->SetSelection(SELECTION_DISC_TYPE_DVD_MENUS);
OnDiscTypeChange( dummy_event ); OnDiscTypeChange( dummy_event );
goto retry; goto retry;
} }
...@@ -1441,13 +1482,20 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) ) ...@@ -1441,13 +1482,20 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) )
psz_device = ProbeCDDA(disc_device->GetValue()); psz_device = ProbeCDDA(disc_device->GetValue());
if( psz_device ) if( psz_device )
{ {
disc_type->SetSelection(3); disc_type->SetSelection(SELECTION_DISC_TYPE_CDDA);
OnDiscTypeChange( dummy_event ); OnDiscTypeChange( dummy_event );
goto retry; goto retry;
} }
/* Couldn't find a VCD, DVD or CD-DA. Null out the Device name and
set to original selection.
*/
disc_device->SetValue( wxL2U("") );
disc_type->SetSelection(i_selection);
OnDiscTypeChange( dummy_event );
break; break;
case 3: /* CD-DA Probe */ 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 )
{ {
...@@ -1457,16 +1505,18 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) ) ...@@ -1457,16 +1505,18 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) )
{ {
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
MediaInsertCDDA( p_intf, p_cdio, i_last_track );
#endif
} }
free(psz_device);
cdio_destroy(p_cdio); cdio_destroy(p_cdio);
break; break;
} }
/* 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()) ) if( !b_probed_DVD && (psz_device = ProbeDVD(disc_device->GetValue())) )
{ {
disc_type->SetSelection(0); disc_type->SetSelection(SELECTION_DISC_TYPE_DVD_MENUS);
OnDiscTypeChange( dummy_event ); OnDiscTypeChange( dummy_event );
goto retry; goto retry;
} }
...@@ -1476,10 +1526,11 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) ) ...@@ -1476,10 +1526,11 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) )
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(2); disc_type->SetSelection(SELECTION_DISC_TYPE_VCD);
OnDiscTypeChange( dummy_event ); OnDiscTypeChange( dummy_event );
goto retry; goto retry;
} }
disc_device->SetValue( wxL2U("") );
break; break;
default: default:
...@@ -1488,6 +1539,7 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) ) ...@@ -1488,6 +1539,7 @@ void OpenDialog::OnDiscProbe( wxCommandEvent& WXUNUSED(event) )
break; break;
} }
free(psz_device);
disc_probe->SetValue(FALSE); disc_probe->SetValue(FALSE);
UpdateMRL( DISC_ACCESS ); UpdateMRL( DISC_ACCESS );
...@@ -1501,8 +1553,8 @@ void OpenDialog::OnDiscTypeChange( wxCommandEvent& WXUNUSED(event) ) ...@@ -1501,8 +1553,8 @@ void OpenDialog::OnDiscTypeChange( wxCommandEvent& WXUNUSED(event) )
switch( disc_type->GetSelection() ) switch( disc_type->GetSelection() )
{ {
case 0: /* DVD with menus */ case SELECTION_DISC_TYPE_DVD_MENUS:
case 1: /* DVD without menus */ 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();
...@@ -1527,7 +1579,7 @@ void OpenDialog::OnDiscTypeChange( wxCommandEvent& WXUNUSED(event) ) ...@@ -1527,7 +1579,7 @@ void OpenDialog::OnDiscTypeChange( wxCommandEvent& WXUNUSED(event) )
)) ); )) );
break; break;
case 2: /* VCD of some sort */ case SELECTION_DISC_TYPE_VCD:
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->Disable(); disc_chapter_label->Disable(); disc_chapter->Disable(); disc_chapter_label->Disable();
...@@ -1567,7 +1619,7 @@ void OpenDialog::OnDiscTypeChange( wxCommandEvent& WXUNUSED(event) ) ...@@ -1567,7 +1619,7 @@ void OpenDialog::OnDiscTypeChange( wxCommandEvent& WXUNUSED(event) )
)) ); )) );
break; break;
case 3: /* CD-DA */ case SELECTION_DISC_TYPE_CDDA:
disc_sub->Disable(); disc_sub_label->Disable(); disc_sub->Disable(); disc_sub_label->Disable();
disc_chapter->Disable(); disc_chapter_label->Disable(); disc_chapter->Disable(); disc_chapter_label->Disable();
disc_audio->Disable(); disc_audio_label->Disable(); disc_audio->Disable(); disc_audio_label->Disable();
......
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