diff --git a/mythtv/libs/libmyth/mythmediamonitor.cpp b/mythtv/libs/libmyth/mythmediamonitor.cpp
index 3dac2ff..1d3d47b 100644
|
|
|
bool MediaMonitor::RemoveDevice(const QString &dev)
|
| 362 | 362 | { |
| 363 | 363 | if ((*it)->getDevicePath() == dev) |
| 364 | 364 | { |
| | 365 | // Ensure device gets an unmount |
| | 366 | (*it)->checkMedia(); |
| | 367 | |
| 365 | 368 | if (m_UseCount[*it] == 0) |
| 366 | 369 | { |
| 367 | 370 | (*it)->deleteLater(); |
| … |
… |
void MediaMonitor::JumpToMediaHandler(MythMediaDevice* pMedia)
|
| 652 | 652 | |
| 653 | 653 | |
| 654 | 654 | GetMythMainWindow()->JumpTo("Main Menu"); |
| | 655 | QTime t; t.start(); |
| | 656 | while (GetMythMainWindow()->IsExitingToMain() && t.elapsed() < 2000) |
| | 657 | qApp->processEvents(); // Ensure jump is executed before calling handler |
| 655 | 658 | handlers.at(selected).callback(pMedia); |
| 656 | 659 | } |
| 657 | 660 | |
| … |
… |
void MediaMonitor::mediaStatusChanged(MediaStatus oldStatus,
|
| 672 | 677 | // This gets called from outside the main thread so we need |
| 673 | 678 | // to post an event back to the main thread. |
| 674 | 679 | // We now send events for all non-error statuses, so plugins get ejects |
| 675 | | if (m_SendEvent && stat != MEDIASTAT_ERROR && stat != MEDIASTAT_UNKNOWN) |
| | 680 | if (m_SendEvent && stat != MEDIASTAT_ERROR && stat != MEDIASTAT_UNKNOWN && |
| | 681 | // Don't send an event for a new device that's not mounted |
| | 682 | !(oldStatus == MEDIASTAT_UNPLUGGED && stat == MEDIASTAT_NOTMOUNTED)) |
| 676 | 683 | { |
| 677 | 684 | // Should we ValidateAndLock() first? |
| 678 | 685 | QEvent *e = new MediaEvent(stat, pMedia); |
diff --git a/mythtv/libs/libmyth/mythhdd.cpp b/mythtv/libs/libmyth/mythhdd.cpp
index 86f2018..0265d57 100644
|
|
|
MediaStatus MythHDD::checkMedia(void)
|
| 41 | 41 | return setStatus(MEDIASTAT_MOUNTED); |
| 42 | 42 | } |
| 43 | 43 | |
| | 44 | // Has device been removed? |
| | 45 | if (!isDeviceOpen()) |
| | 46 | { |
| | 47 | if (!openDevice()) |
| | 48 | return setStatus(MEDIASTAT_UNPLUGGED); |
| | 49 | closeDevice(); |
| | 50 | } |
| | 51 | |
| 44 | 52 | // device is not mounted |
| 45 | | if (m_Status == MEDIASTAT_UNPLUGGED) |
| | 53 | switch (m_Status) |
| 46 | 54 | { |
| | 55 | case MEDIASTAT_UNPLUGGED: |
| 47 | 56 | // a removable device was just plugged in try to mount it. |
| 48 | 57 | mount(); |
| 49 | 58 | if (isMounted()) |
| … |
… |
MediaStatus MythHDD::checkMedia(void)
|
| 51 | 60 | m_Status = MEDIASTAT_NOTMOUNTED; |
| 52 | 61 | return setStatus(MEDIASTAT_MOUNTED); |
| 53 | 62 | } |
| 54 | | else |
| 55 | | return setStatus(MEDIASTAT_NOTMOUNTED); |
| 56 | | } |
| 57 | | else if (m_Status == MEDIASTAT_MOUNTED) |
| 58 | | { |
| | 63 | return setStatus(MEDIASTAT_NOTMOUNTED); |
| | 64 | case MEDIASTAT_MOUNTED: |
| 59 | 65 | // device was mounted and someone unmounted it. |
| 60 | | return m_Status = setStatus(MEDIASTAT_NOTMOUNTED); |
| 61 | | } |
| 62 | | else |
| 63 | | { |
| | 66 | return setStatus(MEDIASTAT_NOTMOUNTED); |
| | 67 | default: |
| 64 | 68 | // leave device state as is |
| 65 | 69 | return m_Status; |
| 66 | 70 | } |
diff --git a/mythtv/libs/libmyth/mythcdrom-linux.cpp b/mythtv/libs/libmyth/mythcdrom-linux.cpp
index 6c5b0d0..eea65d5 100644
|
|
|
|
| 19 | 19 | #define LOC_ERR QString("MythCDROMLinux, Error: ") |
| 20 | 20 | |
| 21 | 21 | // On a mixed-mode disc (audio+data), set this to 0 to mount the data portion: |
| | 22 | #ifndef ASSUME_WANT_AUDIO |
| 22 | 23 | #define ASSUME_WANT_AUDIO 1 |
| | 24 | #endif |
| 23 | 25 | |
| 24 | 26 | |
| 25 | 27 | // Some features cannot be detected (reliably) using the standard |
| … |
… |
MediaStatus MythCDROMLinux::checkMedia()
|
| 382 | 384 | switch (driveStatus()) |
| 383 | 385 | { |
| 384 | 386 | case CDS_DISC_OK: |
| 385 | | VERBOSE(VB_MEDIA, m_DevicePath + " Disk OK, type = " |
| | 387 | VERBOSE(VB_MEDIA+VB_EXTRA, m_DevicePath + " Disk OK, type = " |
| 386 | 388 | + MediaTypeString(m_MediaType) ); |
| 387 | 389 | // further checking is required |
| 388 | 390 | break; |
| … |
… |
MediaStatus MythCDROMLinux::checkMedia()
|
| 432 | 434 | // If we have tried to mount and failed, don't keep trying |
| 433 | 435 | if (m_Status == MEDIASTAT_ERROR) |
| 434 | 436 | { |
| | 437 | // Check if an external agent (like Gnome/KDE) mounted the disk |
| | 438 | if (isMounted()) |
| | 439 | { |
| | 440 | onDeviceMounted(); |
| | 441 | // pretend we're NOTMOUNTED so setStatus emits a signal |
| | 442 | m_Status = MEDIASTAT_NOTMOUNTED; |
| | 443 | return setStatus(MEDIASTAT_MOUNTED, OpenedHere); |
| | 444 | } |
| | 445 | |
| 435 | 446 | VERBOSE(VB_MEDIA+VB_EXTRA, "Disc is unmountable?"); |
| 436 | 447 | if (OpenedHere) |
| 437 | 448 | closeDevice(); |
| … |
… |
MediaStatus MythCDROMLinux::checkMedia()
|
| 510 | 521 | } |
| 511 | 522 | case CDS_AUDIO: |
| 512 | 523 | VERBOSE(VB_MEDIA, "found an audio disk"); |
| | 524 | // pretend we're NOTMOUNTED so setStatus emits a signal |
| | 525 | m_Status = MEDIASTAT_NOTMOUNTED; |
| 513 | 526 | m_MediaType = MEDIATYPE_AUDIO; |
| 514 | 527 | return setStatus(MEDIASTAT_USEABLE, OpenedHere); |
| 515 | 528 | break; |
| 516 | 529 | case CDS_MIXED: |
| 517 | | m_MediaType = MEDIATYPE_MIXED; |
| 518 | 530 | VERBOSE(VB_MEDIA, "found a mixed CD"); |
| 519 | 531 | // Note: Mixed mode CDs require an explixit mount call |
| 520 | 532 | // since we'll usually want the audio portion. |
| 521 | 533 | // undefine ASSUME_WANT_AUDIO to change this behavior. |
| 522 | | #ifdef ASSUME_WANT_AUDIO |
| | 534 | #if ASSUME_WANT_AUDIO |
| | 535 | // pretend we're NOTMOUNTED so setStatus emits a signal |
| | 536 | m_Status = MEDIASTAT_NOTMOUNTED; |
| | 537 | m_MediaType = MEDIATYPE_AUDIO; |
| 523 | 538 | return setStatus(MEDIASTAT_USEABLE, OpenedHere); |
| 524 | 539 | #else |
| | 540 | m_MediaType = MEDIATYPE_MIXED; |
| 525 | 541 | mount(); |
| 526 | 542 | if (isMounted()) |
| 527 | 543 | { |
diff --git a/mythtv/libs/libmyth/mediamonitor-windows.cpp b/mythtv/libs/libmyth/mediamonitor-windows.cpp
index acdc8b7..3fb6230 100644
|
|
|
MediaMonitorWindows::MediaMonitorWindows(QObject* par,
|
| 26 | 26 | { |
| 27 | 27 | char strDrives[128]; |
| 28 | 28 | if (!::GetLogicalDriveStrings(sizeof(strDrives), strDrives)) |
| | 29 | { |
| | 30 | VERBOSE(VB_IMPORTANT, |
| | 31 | "Error. MediaMonitorWindows failed at GetLogicalDriveStrings."); |
| 29 | 32 | return; |
| | 33 | } |
| 30 | 34 | |
| 31 | 35 | for (char *driveName = strDrives; *driveName; |
| 32 | 36 | driveName += strlen(driveName) + 1) |
| 33 | 37 | { |
| 34 | | uint type = ::GetDriveType(driveName); |
| 35 | | if (type != DRIVE_REMOVABLE && type != DRIVE_CDROM) |
| 36 | | continue; |
| 37 | | |
| 38 | 38 | MythMediaDevice *media = NULL; |
| 39 | | |
| 40 | | if (type == DRIVE_CDROM) |
| | 39 | UINT type = ::GetDriveType(driveName); |
| | 40 | switch (type) |
| | 41 | { |
| | 42 | case DRIVE_CDROM: |
| | 43 | VERBOSE(VB_MEDIA+VB_EXTRA, |
| | 44 | QString("MediaMonitorWindows found cdrom '%1'").arg(driveName)); |
| 41 | 45 | media = MythCDROM::get(this, driveName, false, allowEject); |
| 42 | | else |
| | 46 | break; |
| | 47 | case DRIVE_REMOVABLE: |
| | 48 | VERBOSE(VB_MEDIA+VB_EXTRA, |
| | 49 | QString("MediaMonitorWindows found removeable '%1'") |
| | 50 | .arg(driveName)); |
| 43 | 51 | media = MythHDD::Get(this, driveName, false, allowEject); |
| 44 | | |
| 45 | | if (!media) |
| 46 | | { |
| 47 | | VERBOSE(VB_IMPORTANT, |
| 48 | | "Error. Couldn't create MythMediaDevice."); |
| 49 | | return; |
| | 52 | break; |
| | 53 | case DRIVE_UNKNOWN: |
| | 54 | VERBOSE(VB_MEDIA+VB_EXTRA, |
| | 55 | QString("MediaMonitorWindows found unknown '%1'") |
| | 56 | .arg(driveName)); |
| | 57 | media = MythCDROM::get(this, driveName, false, allowEject); |
| | 58 | break; |
| | 59 | case DRIVE_NO_ROOT_DIR: |
| | 60 | VERBOSE(VB_MEDIA+VB_EXTRA, |
| | 61 | QString("MediaMonitorWindows found '%1' with no root dir") |
| | 62 | .arg(driveName)); |
| | 63 | media = MythCDROM::get(this, driveName, false, allowEject); |
| | 64 | break; |
| | 65 | default: |
| | 66 | VERBOSE(VB_MEDIA, QString("MediaMonitorWindows found '%1' type %2") |
| | 67 | .arg(driveName).arg(type)); |
| | 68 | case DRIVE_FIXED: |
| | 69 | case DRIVE_REMOTE: |
| | 70 | case DRIVE_RAMDISK: |
| | 71 | continue; |
| 50 | 72 | } |
| 51 | 73 | |
| 52 | | // We store the volume name to improve |
| 53 | | // user activities like ChooseAndEjectMedia(). |
| 54 | | char volumeName[MAX_PATH]; |
| 55 | | if (GetVolumeInformation(driveName, volumeName, MAX_PATH, |
| 56 | | NULL, NULL, NULL, NULL, NULL)) |
| | 74 | if (media) |
| 57 | 75 | { |
| 58 | | media->setVolumeID(volumeName); |
| | 76 | // We store the volume name to improve |
| | 77 | // user activities like ChooseAndEjectMedia(). |
| | 78 | char volumeName[MAX_PATH]; |
| | 79 | if (GetVolumeInformation(driveName, volumeName, MAX_PATH, |
| | 80 | NULL, NULL, NULL, NULL, NULL)) |
| | 81 | { |
| | 82 | media->setVolumeID(volumeName); |
| | 83 | } |
| | 84 | |
| | 85 | AddDevice(media); |
| 59 | 86 | } |
| 60 | | |
| 61 | | AddDevice(media); |
| | 87 | else |
| | 88 | VERBOSE(VB_IMPORTANT, "Error. Couldn't create MythMediaDevice."); |
| 62 | 89 | } |
| 63 | 90 | |
| 64 | 91 | VERBOSE(VB_MEDIA, "Initial device list: " + listDevices()); |