diff --git a/LameXP_VS2010.vcxproj b/LameXP_VS2010.vcxproj
index a13d5220..0c4cb832 100644
--- a/LameXP_VS2010.vcxproj
+++ b/LameXP_VS2010.vcxproj
@@ -298,6 +298,7 @@ del "$(TargetDir)imageformats\q???d4.dll"
+
@@ -305,6 +306,7 @@ del "$(TargetDir)imageformats\q???d4.dll"
+
@@ -334,6 +336,7 @@ del "$(TargetDir)imageformats\q???d4.dll"
+
@@ -341,6 +344,7 @@ del "$(TargetDir)imageformats\q???d4.dll"
+
@@ -410,6 +414,28 @@ del "$(TargetDir)imageformats\q???d4.dll"
$(SolutionDir)tmp\MOC_%(Filename).cpp;%(Outputs)
$(SolutionDir)tmp\MOC_%(Filename).cpp;%(Outputs)
+
+ "$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\MOC_%(Filename).cpp" "%(FullPath)"
+ "$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\MOC_%(Filename).cpp" "%(FullPath)"
+ "$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\MOC_%(Filename).cpp" "%(FullPath)"
+ MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp"
+ MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp"
+ MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp"
+ $(SolutionDir)tmp\MOC_%(Filename).cpp;%(Outputs)
+ $(SolutionDir)tmp\MOC_%(Filename).cpp;%(Outputs)
+ $(SolutionDir)tmp\MOC_%(Filename).cpp;%(Outputs)
+
+
+ "$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\MOC_%(Filename).cpp" "%(FullPath)"
+ "$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\MOC_%(Filename).cpp" "%(FullPath)"
+ "$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\MOC_%(Filename).cpp" "%(FullPath)"
+ MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp"
+ MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp"
+ MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp"
+ $(SolutionDir)tmp\MOC_%(Filename).cpp;%(Outputs)
+ $(SolutionDir)tmp\MOC_%(Filename).cpp;%(Outputs)
+ $(SolutionDir)tmp\MOC_%(Filename).cpp;%(Outputs)
+
diff --git a/LameXP_VS2010.vcxproj.filters b/LameXP_VS2010.vcxproj.filters
index 5e2e5b3e..869668f0 100644
--- a/LameXP_VS2010.vcxproj.filters
+++ b/LameXP_VS2010.vcxproj.filters
@@ -322,6 +322,18 @@
Generated Files\QRC
+
+ Source Files\Threads
+
+
+ Generated Files\MOC
+
+
+ Source Files\Threads
+
+
+ Generated Files\MOC
+
@@ -608,6 +620,12 @@
Resources
+
+ Header Files\Threads
+
+
+ Header Files\Threads
+
diff --git a/doc/Changelog.html b/doc/Changelog.html
index 51ae3606..80b988f8 100644
--- a/doc/Changelog.html
+++ b/doc/Changelog.html
@@ -25,6 +25,7 @@ a:visited { color: #0000EE; }
Added an option to hibernate the computer (aka "Suspend-to-Disk") instead of shutting it down
Added Polish translation, thanks to Sir Daniel K <sir.daniel.k@gmail.com>
Added channel equalization options to the normalization filter (also fixes multi-channel processing)
+Added indicators for current CPU usage, RAM usage and free diskspace to the processing window
Updated Qt runtime libraries to v4.8.0 RC-1 (2011-10-13), compiled with MSVC 10.0
Updated LAME encoder to v3.99 Final (2011-10-17), compiled with ICL 12.1.6 and MSVC 10.0 (details)
Updated mpg123 decoder to v1.13.4 (2011-09-07), compiled with GCC 4.6.1
diff --git a/etc/Translation/Blank.ts b/etc/Translation/Blank.ts
index 12b7b1c7..523960d6 100644
--- a/etc/Translation/Blank.ts
+++ b/etc/Translation/Blank.ts
@@ -378,8 +378,8 @@
-
-
+
+
@@ -436,67 +436,67 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -606,7 +606,7 @@
DiskObserverThread
-
+
@@ -1410,13 +1410,13 @@
-
+
-
+
@@ -1502,7 +1502,7 @@
-
+
@@ -1657,8 +1657,8 @@
-
-
+
+
@@ -1680,8 +1680,8 @@
-
-
+
+
@@ -1757,8 +1757,8 @@
-
-
+
+
@@ -1788,412 +1788,412 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
-
-
+
+
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
+
-
+
-
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -2600,129 +2600,147 @@
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
-
+
+
diff --git a/etc/Translation/LameXP_DE.ts b/etc/Translation/LameXP_DE.ts
index 7d9e88c4..0d3143dd 100644
--- a/etc/Translation/LameXP_DE.ts
+++ b/etc/Translation/LameXP_DE.ts
@@ -2113,6 +2113,18 @@
Herunterfahren abbrechen
+
+
+ Prozessorauslastung (insgesamt)
+
+
+
+ Speicherauslastung (physikalischer Arbeitsspeicher)
+
+
+
+ Freier Festplattenspeicher (Temp Ordner)
+
ProgressModel
diff --git a/etc/Translation/LameXP_ES.ts b/etc/Translation/LameXP_ES.ts
index 0b2f3bc5..14537289 100644
--- a/etc/Translation/LameXP_ES.ts
+++ b/etc/Translation/LameXP_ES.ts
@@ -2112,6 +2112,18 @@
Cancelar apagado
+
+
+
+
+
+
+
+
+
+
+
+
ProgressModel
diff --git a/etc/Translation/LameXP_FR.ts b/etc/Translation/LameXP_FR.ts
index 70389ce9..fcc0b4d8 100644
--- a/etc/Translation/LameXP_FR.ts
+++ b/etc/Translation/LameXP_FR.ts
@@ -2122,6 +2122,18 @@ Ouvrir le dossier récursivement...
Annuler l'extinction
+
+
+
+
+
+
+
+
+
+
+
+
ProgressModel
diff --git a/etc/Translation/LameXP_IT.ts b/etc/Translation/LameXP_IT.ts
index 898e61db..22b697a7 100644
--- a/etc/Translation/LameXP_IT.ts
+++ b/etc/Translation/LameXP_IT.ts
@@ -2113,6 +2113,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
ProgressModel
diff --git a/etc/Translation/LameXP_KR.ts b/etc/Translation/LameXP_KR.ts
index 6250ab9a..0cc50eab 100644
--- a/etc/Translation/LameXP_KR.ts
+++ b/etc/Translation/LameXP_KR.ts
@@ -2112,6 +2112,18 @@
컴퓨터 종료 취소
+
+
+
+
+
+
+
+
+
+
+
+
ProgressModel
diff --git a/etc/Translation/LameXP_PL.ts b/etc/Translation/LameXP_PL.ts
index 3624ae60..bfba6690 100644
--- a/etc/Translation/LameXP_PL.ts
+++ b/etc/Translation/LameXP_PL.ts
@@ -378,8 +378,8 @@
-
-
+
+
Błąd pliku Cue Sheet
@@ -436,67 +436,67 @@
Błąd: Nie można zapisać w wybranej lokalizacji wyjściowej!
-
+
Ostrzeżenie o małej ilości miejsca na dysku
-
+
Jest mniej niż %1 GB wolnego miejsca w wybranej lokalizacji wyjściowej.
-
+
Jest wysoce zalecane zwolnić miejsce na dysku zanim zaczniesz importować!
-
+
Analizowanie pliku/ów, prosze czekać...
-
+
Analiza zakończona niepowodzeniem
-
+
Ostrzeżenie: Nie można rozpoznać formatu kilku plików wejściowych!
-
+
Kontynuuj pomimo to
-
+
Przerwij
-
+
Dzielenie pliku/ów, prosze czekać...
-
+
Proces został przerwany przez użytkownika po imporcie %1 ścieżek!
-
+
Wystąpił nieoczekiwany błąd podczas podziału pliku Cue Sheet!
-
+
Zaimportowano %1 ścieżek i opuszczono %2 ścieżek z pliku Cue Sheet.
-
+
Stworzono plik Cue Sheet
@@ -606,7 +606,7 @@
DiskObserverThread
-
+
Mało miejsca na dysku '%1' (tylko %2 MB dostępnych), mogą wystąpić problemy!
@@ -1410,13 +1410,13 @@
-
+
Wyłącz przypominanie o aktualizacji
-
+
Wyłącz efekty dźwiękowe
@@ -1502,7 +1502,7 @@
-
+
Dostęp zablokowany
@@ -1652,8 +1652,8 @@
-
-
+
+
Zamknij
@@ -1675,8 +1675,8 @@
-
-
+
+
Powiadomienie aktualizacji
@@ -1747,8 +1747,8 @@
-
-
+
+
LameXP
@@ -1778,12 +1778,12 @@
Anuluj
-
+
Ostrzeżenie o małej ilości miejsca na dysku
-
+
Jest mniej niż %1 GB dostępnego miejsca w systemowym folderze TEMP.
@@ -1798,402 +1798,402 @@
-
+
Jest wysoce zalecane zwolnić miejsce na dysku zanim zaczniesz kompresję!
-
+
Twój folder TEMP znajduję się:
-
+
Przerwij proces kompresji
-
+
Wykonaj oczyszczanie dysku
-
+
Ignoruj
-
+
Mało miejsca na dysku
-
+
Chcesz zacząć działać z małą ilością miejsca na dysku. Mogą wystąpić problemy!
-
+
Został wybrany koder, który nie jest wspierany!
-
+
Nie można zapisać do wybranej lokalizacji.
-
+
Prosze wybrać inną lokalizację!
-
+
Zaladuj plik językowy
-
+
Pliki językowe
-
+
Czy na pewno chcesz wyłączyć przypominanie o aktualizacjach?
-
-
-
-
-
-
-
+
+
+
+
+
+
+
Tak
-
-
-
-
-
-
-
+
+
+
+
+
+
+
Nie
-
+
Przypominanie o aktualizacjach wyłączone.
-
+
Prosze pamiętać o okresowym sprawdzaniu aktualizacji!
-
+
Przypominanie o aktualizacjach ponownie włączone.
-
+
Czy na pewno chcesz wyłączyć wszystkie dźwiękowe?
-
-
+
+
Efekty dźwiękowe
-
+
Wszystkie efekty dźwiękowe zostały wyłączone.
-
+
Efekty dźwiękowe zostały ponownie włączone.
-
-
+
+
Powiadomienia Nero AAC
-
+
Czy na pewno chcesz wyłączyć wszystkie powiadomienia Nero AAC?
-
+
Wszystkie powiadomienia kodera Nero AAC zostały wyłączone.
-
+
Powiadomienia Nero AAC zostały ponownie włączone.
-
-
+
+
Powiadomienia o powolnym starcie
-
+
Czy na pewno chcesz wyłączyć powiadomienia o powolnym starcie?
-
+
Powiadomienia o powolnym starcie zostały wyłączone.
-
+
Powiadomienia o powolnym starcie zostały ponownie włączone.
-
-
+
+
Otwórz plik Cue Sheet
-
-
+
+
Plik Cue Sheet
-
-
+
+
Aktualizacje Beta
-
+
Czy na pewno chcesz aby LameXP sprawdzał aktualizacje Beta?
-
+
Od teraz LameXP będzie sprawdzał aktualizacje Beta.
-
+
Sprawdź teraz
-
+
LameXP od teraz <i>nie będzie</i> sprawdzał aktualizacji Beta.
-
-
+
+
-
+
-
+
-
+
-
-
-
+
+
+
Integracja z systemem
-
+
Czy na pewno chcesz wyłączyć integrację LameXP z systemem?
-
+
Integracja LameXP z systemem zostałą wyłączona.
-
+
Integracja LameXP z systemem została ponownie włączona.
-
-
+
+
Dodaj plik(i)
-
-
+
+
Dodaj folder
-
-
+
+
Nowy folder
-
+
Wprowadź nazwę nowego folderu:
-
+
Utworzenie folderu zakończone niepowodzeniem
-
+
Nowy folder nie mógł zostać stworzony:
-
+
Dysk tylko do odczytu lub brak praw dostępu!
-
-
-
-
+
+
+
+
Poziom jakości %1
-
-
-
+
+
+
Kompresja %1
-
-
-
+
+
+
Nieskompresowany
-
+
Najlepsza jakość (Bardzo wolno)
-
+
Wysoka jakość (Zalecane)
-
+
Średnia jakość (Domyślnie)
-
+
Niska jakość (Szybko)
-
+
Najniższa jakość (Bardzo szybko)
-
+
Nazwa pliku bez rozszerzenia
-
+
Numer ścieżki z zerem na początku
-
+
Nazwa ścieżki
-
+
Nazwa Artysty
-
+
Nazwa Albumu
-
+
Rok z (przynajmniej) czterema cyframi
-
+
Komentarz
-
+
Zabronione znaki w nazwach plików:
-
+
Zmień nazwy makr
-
+
%1 wątek/ki
-
+
Nie można zapisać do wybranej lokalizacji. Prosze wybierz inną lokalizację!
-
+
Już działa
-
+
LameXP już działa, przejdź do działającego programu!
@@ -2600,129 +2600,147 @@
Inicjowanie, prosze czekać...
-
+
Wyłącz komputer po przetworzeniu wszystkich plików
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Przerwij
-
+
Powrót
-
+
Pokaż szczegóły wybranego zadania
-
+
Wybierz lokalizację dla plików wyjściowych
-
+
Kompresowanie plików
-
+
Twoje pliki są właśnie kompresowane, prosze być cierpliwy...
-
+
Kompresowanie plików, prosze czekać...
-
+
Wielowątkowosć włączona: Równolegle wykonywanych jest %1 kodowań!
-
+
Przerwano! Czekanie na wyłączenie procesu...
-
+
Kompresja: Prosze czekać, jak dotąd wykonano %1 z %2 plików...
-
+
Tworzenie pliku playlisty, prosze czekać...
-
+
Proces został przerwany przez użytkownika po wykonaniu %1 plików!
-
+
Proces został przedwcześnie zakończony przez użytkownika!
-
+
LameXP - Przerwano
-
+
Proces został przerwany przez użytkownika.
-
+
Błąd: %1 z %2 plików nie zostało skompresowanych. Kliknij dwukrotnie na plik aby zobaczyć szczegóły!
-
+
LameXP - Błąd
-
+
Przynajmniej jeden plik nie został skompresowany!
-
-
+
+
Kompresja wszystkich plików zakończona powodzeniem.
-
+
LameXP - Zrobione
-
+
Tworzenie playlisty zakończone niepowodzeniem
-
+
Playlista nie mogła zostać utworzona:
-
+
Ostrzeżenie: Komputer zostanie zamknięty za %1 sekund/y...
-
-
+
+
Anuluj wyłączenie komputera
diff --git a/etc/Translation/LameXP_RU.ts b/etc/Translation/LameXP_RU.ts
index 7d1eff61..5a9836ec 100644
--- a/etc/Translation/LameXP_RU.ts
+++ b/etc/Translation/LameXP_RU.ts
@@ -2120,6 +2120,18 @@
Отменить выключение
+
+
+
+
+
+
+
+
+
+
+
+
ProgressModel
diff --git a/etc/Translation/LameXP_UK.ts b/etc/Translation/LameXP_UK.ts
index 8d131585..8f671dc5 100644
--- a/etc/Translation/LameXP_UK.ts
+++ b/etc/Translation/LameXP_UK.ts
@@ -2113,6 +2113,18 @@
Відмінити Вимкнення
+
+
+
+
+
+
+
+
+
+
+
+
ProgressModel
diff --git a/etc/Translation/update.lst b/etc/Translation/update.lst
index 9a713dbf..2ec4c8c2 100644
--- a/etc/Translation/update.lst
+++ b/etc/Translation/update.lst
@@ -62,6 +62,7 @@
..\..\src\PlaylistImporter.cpp
..\..\src\Registry_Decoder.cpp
..\..\src\ShellIntegration.cpp
+..\..\src\Thread_CPUObserver.cpp
..\..\src\Thread_CueSplitter.cpp
..\..\src\Thread_DiskObserver.cpp
..\..\src\Thread_FileAnalyzer.cpp
@@ -69,6 +70,7 @@
..\..\src\Thread_MessageHandler.cpp
..\..\src\Thread_MessageProducer.cpp
..\..\src\Thread_Process.cpp
+..\..\src\Thread_RAMObserver.cpp
..\..\src\Tool_Abstract.cpp
..\..\src\WinSevenTaskbar.cpp
..\..\src\Config.h
@@ -128,6 +130,7 @@
..\..\src\Resource.h
..\..\src\ShellIntegration.h
..\..\src\Targetver.h
+..\..\src\Thread_CPUObserver.h
..\..\src\Thread_CueSplitter.h
..\..\src\Thread_DiskObserver.h
..\..\src\Thread_FileAnalyzer.h
@@ -135,6 +138,7 @@
..\..\src\Thread_MessageHandler.h
..\..\src\Thread_MessageProducer.h
..\..\src\Thread_Process.h
+..\..\src\Thread_RAMObserver.h
..\..\src\Tools.h
..\..\src\Tool_Abstract.h
..\..\src\WinSevenTaskbar.h
diff --git a/gui/ProcessingDialog.ui b/gui/ProcessingDialog.ui
index 5225d7f5..dcc00921 100644
--- a/gui/ProcessingDialog.ui
+++ b/gui/ProcessingDialog.ui
@@ -302,11 +302,264 @@
-
-
-
- Shutdown the computer as soon as all files have been converted
+
+
+ 0
-
+
-
+
+
+
+ 0
+ 0
+
+
+
+ Shutdown the computer as soon as all files have been converted
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QSizePolicy::Fixed
+
+
+
+ 12
+ 20
+
+
+
+
+ -
+
+
+ CPU Usage (Overall)
+
+
+
+
+
+ :/icons/cpu.png
+
+
+
+ -
+
+
+
+
+
+
+
+ 0
+ 0
+ 255
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 255
+
+
+
+
+
+
+
+
+ 120
+ 120
+ 120
+
+
+
+
+
+
+
+
+ 50
+ false
+
+
+
+ CPU Usage (Overall)
+
+
+ 0%
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+
+ 8
+ 0
+
+
+
+ QFrame::VLine
+
+
+ QFrame::Raised
+
+
+
+ -
+
+
+ Physical RAM Usage
+
+
+
+
+
+ :/icons/memory.png
+
+
+
+ -
+
+
+
+
+
+
+
+ 0
+ 0
+ 255
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 255
+
+
+
+
+
+
+
+
+ 120
+ 120
+ 120
+
+
+
+
+
+
+
+ Physical RAM Usage
+
+
+ 0%
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+
+ 8
+ 0
+
+
+
+ QFrame::VLine
+
+
+ QFrame::Raised
+
+
+
+ -
+
+
+ Free Disk Space (Temp Folder)
+
+
+
+
+
+ :/icons/drive.png
+
+
+
+ -
+
+
+
+
+
+
+
+ 0
+ 0
+ 255
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 255
+
+
+
+
+
+
+
+
+ 120
+ 120
+ 120
+
+
+
+
+
+
+
+ Free Disk Space (Temp Folder)
+
+
+ 0%
+
+
+
+
-
diff --git a/res/Icons.qrc b/res/Icons.qrc
index 3fbdcb8d..5eaa89a2 100644
--- a/res/Icons.qrc
+++ b/res/Icons.qrc
@@ -31,6 +31,7 @@
icons/controller.png
icons/control_pause_blue.png
icons/control_play_blue.png
+ icons/cpu.png
icons/cross.png
icons/date.png
icons/delete.png
@@ -60,6 +61,7 @@
icons/information.png
icons/lightning.png
icons/media_play.png
+ icons/memory.png
icons/money_dollar.png
icons/monitor.png
icons/music.png
diff --git a/res/icons/cpu.png b/res/icons/cpu.png
new file mode 100644
index 00000000..37e97942
Binary files /dev/null and b/res/icons/cpu.png differ
diff --git a/res/icons/memory.png b/res/icons/memory.png
new file mode 100644
index 00000000..4c71a247
Binary files /dev/null and b/res/icons/memory.png differ
diff --git a/res/localization/LameXP_DE.qm b/res/localization/LameXP_DE.qm
index c1e09ba1..0c133e09 100644
Binary files a/res/localization/LameXP_DE.qm and b/res/localization/LameXP_DE.qm differ
diff --git a/src/Config.h b/src/Config.h
index 52cd1d37..bc62ca57 100644
--- a/src/Config.h
+++ b/src/Config.h
@@ -30,7 +30,7 @@
#define VER_LAMEXP_MINOR_LO 3
#define VER_LAMEXP_TYPE RC
#define VER_LAMEXP_PATCH 2
-#define VER_LAMEXP_BUILD 756
+#define VER_LAMEXP_BUILD 760
///////////////////////////////////////////////////////////////////////////////
// Tools versions
diff --git a/src/Dialog_CueImport.cpp b/src/Dialog_CueImport.cpp
index efaec198..97d3468d 100644
--- a/src/Dialog_CueImport.cpp
+++ b/src/Dialog_CueImport.cpp
@@ -192,8 +192,8 @@ void CueImportDialog::browseButtonClicked(void)
void CueImportDialog::importButtonClicked(void)
{
- static const __int64 oneGigabyte = 1073741824i64;
- static const __int64 minimumFreeDiskspaceMultiplier = 2i64;
+ static const unsigned __int64 oneGigabyte = 1073741824ui64;
+ static const unsigned __int64 minimumFreeDiskspaceMultiplier = 2ui64;
static const char *writeTestBuffer = "LAMEXP_WRITE_TEST";
QDir outputDir(m_outputDir);
@@ -216,8 +216,10 @@ void CueImportDialog::importButtonClicked(void)
writeTest.remove();
}
- qint64 currentFreeDiskspace = lamexp_free_diskspace(m_outputDir);
- if(currentFreeDiskspace < (oneGigabyte * minimumFreeDiskspaceMultiplier))
+ bool ok = false;
+ unsigned __int64 currentFreeDiskspace = lamexp_free_diskspace(m_outputDir, &ok);
+
+ if(ok && (currentFreeDiskspace < (oneGigabyte * minimumFreeDiskspaceMultiplier)))
{
QMessageBox::warning(this, tr("Low Diskspace Warning"), QString("%1
%2").arg(tr("There are less than %1 GB of free diskspace available in the selected output directory.").arg(QString::number(minimumFreeDiskspaceMultiplier)), tr("It is highly recommend to free up more diskspace before proceeding with the import!")));
return;
diff --git a/src/Dialog_MainWindow.cpp b/src/Dialog_MainWindow.cpp
index 21c9e90d..cafecd92 100644
--- a/src/Dialog_MainWindow.cpp
+++ b/src/Dialog_MainWindow.cpp
@@ -1145,8 +1145,8 @@ void MainWindow::showAnnounceBox(void)
*/
void MainWindow::encodeButtonClicked(void)
{
- static const __int64 oneGigabyte = 1073741824i64;
- static const __int64 minimumFreeDiskspaceMultiplier = 2i64;
+ static const unsigned __int64 oneGigabyte = 1073741824ui64;
+ static const unsigned __int64 minimumFreeDiskspaceMultiplier = 2ui64;
static const char *writeTestBuffer = "LAMEXP_WRITE_TEST";
ABORT_IF_BUSY;
@@ -1168,8 +1168,10 @@ void MainWindow::encodeButtonClicked(void)
return;
}
- qint64 currentFreeDiskspace = lamexp_free_diskspace(tempFolder);
- if(currentFreeDiskspace < (oneGigabyte * minimumFreeDiskspaceMultiplier))
+ bool ok = false;
+ unsigned __int64 currentFreeDiskspace = lamexp_free_diskspace(tempFolder, &ok);
+
+ if(ok && (currentFreeDiskspace < (oneGigabyte * minimumFreeDiskspaceMultiplier)))
{
QStringList tempFolderParts = tempFolder.split("/", QString::SkipEmptyParts, Qt::CaseInsensitive);
tempFolderParts.takeLast();
diff --git a/src/Dialog_Processing.cpp b/src/Dialog_Processing.cpp
index d4b323e2..e0fd6b2b 100644
--- a/src/Dialog_Processing.cpp
+++ b/src/Dialog_Processing.cpp
@@ -27,6 +27,8 @@
#include "Model_Progress.h"
#include "Model_Settings.h"
#include "Thread_Process.h"
+#include "Thread_CPUObserver.h"
+#include "Thread_RAMObserver.h"
#include "Thread_DiskObserver.h"
#include "Dialog_LogView.h"
#include "Encoder_MP3.h"
@@ -97,7 +99,9 @@ ProcessingDialog::ProcessingDialog(FileListModel *fileListModel, AudioFileModel
m_settings(settings),
m_metaInfo(metaInfo),
m_shutdownFlag(shutdownFlag_None),
- m_diskObserver(NULL)
+ m_diskObserver(NULL),
+ m_cpuObserver(NULL),
+ m_ramObserver(NULL)
{
//Init the dialog, from the .ui file
setupUi(this);
@@ -188,7 +192,29 @@ ProcessingDialog::~ProcessingDialog(void)
if(m_diskObserver)
{
m_diskObserver->stop();
- m_diskObserver->wait(15000);
+ if(!m_diskObserver->wait(15000))
+ {
+ m_diskObserver->terminate();
+ m_diskObserver->wait();
+ }
+ }
+ if(m_cpuObserver)
+ {
+ m_cpuObserver->stop();
+ if(!m_cpuObserver->wait(15000))
+ {
+ m_cpuObserver->terminate();
+ m_cpuObserver->wait();
+ }
+ }
+ if(m_ramObserver)
+ {
+ m_ramObserver->stop();
+ if(!m_ramObserver->wait(15000))
+ {
+ m_ramObserver->terminate();
+ m_ramObserver->wait();
+ }
}
LAMEXP_DELETE(m_progressIndicator);
@@ -196,6 +222,8 @@ ProcessingDialog::~ProcessingDialog(void)
LAMEXP_DELETE(m_contextMenu);
LAMEXP_DELETE(m_systemTray);
LAMEXP_DELETE(m_diskObserver);
+ LAMEXP_DELETE(m_cpuObserver);
+ LAMEXP_DELETE(m_ramObserver);
WinSevenTaskbar::setOverlayIcon(this, NULL);
WinSevenTaskbar::setTaskbarState(this, WinSevenTaskbar::WinSevenTaskbarNoState);
@@ -225,6 +253,10 @@ void ProcessingDialog::showEvent(QShowEvent *event)
SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
}
+ ramUsageHasChanged(0.0);
+ cpuUsageHasChanged(0.0);
+ diskUsageHasChanged(0ui64);
+
QTimer::singleShot(1000, this, SLOT(initEncoding()));
}
@@ -302,8 +334,21 @@ void ProcessingDialog::initEncoding(void)
{
m_diskObserver = new DiskObserverThread(m_settings->customTempPathEnabled() ? m_settings->customTempPath() : lamexp_temp_folder2());
connect(m_diskObserver, SIGNAL(messageLogged(QString,bool)), m_progressModel, SLOT(addSystemMessage(QString,bool)), Qt::QueuedConnection);
+ connect(m_diskObserver, SIGNAL(freeSpaceChanged(quint64)), this, SLOT(diskUsageHasChanged(quint64)), Qt::QueuedConnection);
m_diskObserver->start();
}
+ if(!m_cpuObserver)
+ {
+ m_cpuObserver = new CPUObserverThread();
+ connect(m_cpuObserver, SIGNAL(currentUsageChanged(double)), this, SLOT(cpuUsageHasChanged(double)), Qt::QueuedConnection);
+ m_cpuObserver->start();
+ }
+ if(!m_ramObserver)
+ {
+ m_ramObserver = new RAMObserverThread();
+ connect(m_ramObserver, SIGNAL(currentUsageChanged(double)), this, SLOT(ramUsageHasChanged(double)), Qt::QueuedConnection);
+ m_ramObserver->start();
+ }
int maximumInstances = max(min(m_settings->maximumInstances(), MAX_INSTANCES), 0);
if(maximumInstances < 1)
@@ -831,6 +876,33 @@ void ProcessingDialog::systemTrayActivated(QSystemTrayIcon::ActivationReason rea
}
}
+void ProcessingDialog::cpuUsageHasChanged(const double val)
+{
+
+ this->label_cpu->setText(QString().sprintf(" %d%%", qRound(val * 100.0)));
+}
+
+void ProcessingDialog::ramUsageHasChanged(const double val)
+{
+
+ this->label_ram->setText(QString().sprintf(" %d%%", qRound(val * 100.0)));
+}
+
+void ProcessingDialog::diskUsageHasChanged(const quint64 val)
+{
+ int postfix = 0;
+ const char *postfixStr[6] = {"B", "KB", "MB", "GB", "TB", "PB"};
+ double space = static_cast(val);
+
+ while((space >= 1000.0) && (postfix < 5))
+ {
+ space = space / 1024.0;
+ postfix++;
+ }
+
+ this->label_disk->setText(QString().sprintf(" %3.1f %s", space, postfixStr[postfix]));
+}
+
bool ProcessingDialog::shutdownComputer(void)
{
const int iTimeout = m_settings->hibernateComputer() ? 10 : 30;
diff --git a/src/Dialog_Processing.h b/src/Dialog_Processing.h
index c4caf06a..d4567601 100644
--- a/src/Dialog_Processing.h
+++ b/src/Dialog_Processing.h
@@ -33,6 +33,8 @@ class ProcessThread;
class FileListModel;
class AudioFileModel;
class SettingsModel;
+class CPUObserverThread;
+class RAMObserverThread;
class DiskObserverThread;
enum shutdownFlag_t
@@ -64,6 +66,9 @@ private slots:
void contextMenuDetailsActionTriggered(void);
void contextMenuShowFileActionTriggered(void);
void systemTrayActivated(QSystemTrayIcon::ActivationReason reason);
+ void cpuUsageHasChanged(const double val);
+ void ramUsageHasChanged(const double val);
+ void diskUsageHasChanged(const quint64 val);
protected:
void showEvent(QShowEvent *event);
@@ -93,5 +98,7 @@ private:
bool m_userAborted;
QSystemTrayIcon *m_systemTray;
int m_shutdownFlag;
+ CPUObserverThread *m_cpuObserver;
+ RAMObserverThread *m_ramObserver;
DiskObserverThread *m_diskObserver;
};
diff --git a/src/Global.cpp b/src/Global.cpp
index 792a4c0b..add998b5 100644
--- a/src/Global.cpp
+++ b/src/Global.cpp
@@ -1486,15 +1486,17 @@ bool lamexp_themes_enabled(void)
/*
* Get number of free bytes on disk
*/
-__int64 lamexp_free_diskspace(const QString &path)
+unsigned __int64 lamexp_free_diskspace(const QString &path, bool *ok)
{
ULARGE_INTEGER freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes;
if(GetDiskFreeSpaceExW(reinterpret_cast(QDir::toNativeSeparators(path).utf16()), &freeBytesAvailable, &totalNumberOfBytes, &totalNumberOfFreeBytes))
{
+ if(ok) *ok = true;
return freeBytesAvailable.QuadPart;
}
else
{
+ if(ok) *ok = false;
return 0;
}
}
diff --git a/src/Global.h b/src/Global.h
index 18db832b..4e54423c 100644
--- a/src/Global.h
+++ b/src/Global.h
@@ -119,7 +119,7 @@ static const char* LAMEXP_DEFAULT_LANGID = "en";
bool lamexp_clean_folder(const QString &folderPath);
const QString lamexp_version2string(const QString &pattern, unsigned int version, const QString &defaultText);
QString lamexp_known_folder(lamexp_known_folder_t folder_id);
-__int64 lamexp_free_diskspace(const QString &path);
+unsigned __int64 lamexp_free_diskspace(const QString &path, bool *ok = NULL);
bool lamexp_remove_file(const QString &filename);
bool lamexp_themes_enabled(void);
void lamexp_blink_window(QWidget *poWindow, unsigned int count = 10, unsigned int delay = 150);
diff --git a/src/Thread_CPUObserver.cpp b/src/Thread_CPUObserver.cpp
new file mode 100644
index 00000000..99b04086
--- /dev/null
+++ b/src/Thread_CPUObserver.cpp
@@ -0,0 +1,131 @@
+///////////////////////////////////////////////////////////////////////////////
+// LameXP - Audio Encoder Front-End
+// Copyright (C) 2004-2011 LoRd_MuldeR
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program; if not, write to the Free Software Foundation, Inc.,
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+//
+// http://www.gnu.org/licenses/gpl-2.0.txt
+///////////////////////////////////////////////////////////////////////////////
+
+#include "Thread_CPUObserver.h"
+#include "Global.h"
+
+#include
+
+////////////////////////////////////////////////////////////
+// Constructor & Destructor
+////////////////////////////////////////////////////////////
+
+CPUObserverThread::CPUObserverThread(void)
+{
+ m_terminated = false;
+}
+
+CPUObserverThread::~CPUObserverThread(void)
+{
+}
+
+////////////////////////////////////////////////////////////
+// Protected functions
+////////////////////////////////////////////////////////////
+
+void CPUObserverThread::run(void)
+{
+ qDebug("CPU observer started!");
+ m_terminated = false;
+
+ try
+ {
+ observe();
+ }
+ catch(...)
+ {
+ fflush(stdout);
+ fflush(stderr);
+ fprintf(stderr, "\nGURU MEDITATION !!!\n");
+ FatalAppExit(0, L"Unhandeled exception error, application will exit!");
+ TerminateProcess(GetCurrentProcess(), -1);
+ }
+}
+
+ULONGLONG CPUObserverThread::filetime2ulonglong(const void *ftime)
+{
+ ULARGE_INTEGER tmp; tmp.QuadPart = 0UI64;
+ const FILETIME* fileTime = reinterpret_cast(ftime);
+ tmp.LowPart = fileTime->dwLowDateTime;
+ tmp.HighPart = fileTime->dwHighDateTime;
+ return tmp.QuadPart;
+}
+
+void CPUObserverThread::observe(void)
+{
+ ULONGLONG sys[2], usr[2], idl[2];
+ FILETIME sysTime, usrTime, idlTime;
+ bool first = true;
+ double previous = -1.0;
+
+ for(size_t i = 0; i < 2; i++)
+ {
+ sys[i] = 0; usr[i] = 0; idl[i] = 0;
+ }
+
+ while(!m_terminated)
+ {
+ if(GetSystemTimes(&idlTime, &sysTime, &usrTime))
+ {
+ sys[1] = sys[0]; sys[0] = filetime2ulonglong(&sysTime);
+ usr[1] = usr[0]; usr[0] = filetime2ulonglong(&usrTime);
+ idl[1] = idl[0]; idl[0] = filetime2ulonglong(&idlTime);
+
+ if(first)
+ {
+ first = false;
+ emit currentUsageChanged(1.0);
+ msleep(250);
+ continue;
+ }
+
+ ULONGLONG timeIdl = (idl[0] - idl[1]); //Idle time only
+ ULONGLONG timeSys = (sys[0] - sys[1]); //Kernel mode time (incl. Idle time!)
+ ULONGLONG timeUsr = (usr[0] - usr[1]); //User mode time only
+
+ ULONGLONG timeSum = timeUsr + timeSys; //Overall CPU time that has elapsed
+ ULONGLONG timeWrk = timeSum - timeIdl; //Time the CPU spent working
+
+ if((timeSum > 0) || (timeWrk > 0))
+ {
+ double current = static_cast(timeWrk) / static_cast(timeSum);
+ if(current != previous)
+ {
+ emit currentUsageChanged(current);
+ previous = current;
+ }
+ }
+ }
+ msleep(1000);
+ }
+}
+
+////////////////////////////////////////////////////////////
+// SLOTS
+////////////////////////////////////////////////////////////
+
+/*NONE*/
+
+////////////////////////////////////////////////////////////
+// EVENTS
+////////////////////////////////////////////////////////////
+
+/*NONE*/
diff --git a/src/Thread_CPUObserver.h b/src/Thread_CPUObserver.h
new file mode 100644
index 00000000..dda416ee
--- /dev/null
+++ b/src/Thread_CPUObserver.h
@@ -0,0 +1,46 @@
+///////////////////////////////////////////////////////////////////////////////
+// LameXP - Audio Encoder Front-End
+// Copyright (C) 2004-2011 LoRd_MuldeR
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program; if not, write to the Free Software Foundation, Inc.,
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+//
+// http://www.gnu.org/licenses/gpl-2.0.txt
+///////////////////////////////////////////////////////////////////////////////
+
+#pragma once
+
+#include
+
+class CPUObserverThread: public QThread
+{
+ Q_OBJECT
+
+public:
+ CPUObserverThread(void);
+ ~CPUObserverThread(void);
+
+ void stop(void) { m_terminated = true; }
+
+protected:
+ void run(void);
+ void observe(void);
+
+signals:
+ void currentUsageChanged(const double usage);
+
+private:
+ volatile bool m_terminated;
+ static inline unsigned __int64 filetime2ulonglong(const void *ftime);
+};
diff --git a/src/Thread_DiskObserver.cpp b/src/Thread_DiskObserver.cpp
index 564521bd..5d0aaa5d 100644
--- a/src/Thread_DiskObserver.cpp
+++ b/src/Thread_DiskObserver.cpp
@@ -25,7 +25,7 @@
#include
-#define MIN_DISKSPACE 104857600LL //100 MB
+#define MIN_DISKSPACE 104857600ui64 //100 MB
////////////////////////////////////////////////////////////
// Constructor & Destructor
@@ -49,6 +49,7 @@ DiskObserverThread::~DiskObserverThread(void)
void DiskObserverThread::run(void)
{
qDebug("DiskSpace observer started!");
+ m_terminated = false;
try
{
@@ -66,18 +67,28 @@ void DiskObserverThread::run(void)
void DiskObserverThread::observe(void)
{
- __int64 freeSpace, minimumSpace = MIN_DISKSPACE;
+ unsigned __int64 minimumSpace = MIN_DISKSPACE;
+ unsigned __int64 freeSpace, previousSpace = 0ui64;
+ bool ok = false;
while(!m_terminated)
{
- freeSpace = lamexp_free_diskspace(m_path);
- if(freeSpace < minimumSpace)
+ freeSpace = lamexp_free_diskspace(m_path, &ok);
+ if(ok)
{
- qWarning("Free diskspace on '%s' dropped below %s MB, only %s MB free!", m_path.toUtf8().constData(), QString::number(minimumSpace / 1048576ui64).toUtf8().constData(), QString::number(freeSpace / 1048576ui64).toUtf8().constData());
- emit messageLogged(tr("Low diskspace on drive '%1' detected (only %2 MB are free), problems can occur!").arg(QDir::toNativeSeparators(m_path), QString::number(freeSpace / 1048576ui64)), true);
- minimumSpace = min(freeSpace, (minimumSpace >> 1));
+ if(freeSpace < minimumSpace)
+ {
+ qWarning("Free diskspace on '%s' dropped below %s MB, only %s MB free!", m_path.toUtf8().constData(), QString::number(minimumSpace / 1048576ui64).toUtf8().constData(), QString::number(freeSpace / 1048576ui64).toUtf8().constData());
+ emit messageLogged(tr("Low diskspace on drive '%1' detected (only %2 MB are free), problems can occur!").arg(QDir::toNativeSeparators(m_path), QString::number(freeSpace / 1048576ui64)), true);
+ minimumSpace = min(freeSpace, (minimumSpace >> 1));
+ }
+ if(freeSpace != previousSpace)
+ {
+ emit freeSpaceChanged(freeSpace);
+ previousSpace = freeSpace;
+ }
}
- Sleep(1000);
+ msleep(1000);
}
}
diff --git a/src/Thread_DiskObserver.h b/src/Thread_DiskObserver.h
index 05c71c84..1bf4a0c2 100644
--- a/src/Thread_DiskObserver.h
+++ b/src/Thread_DiskObserver.h
@@ -41,6 +41,7 @@ protected:
signals:
void messageLogged(const QString &text, bool isWarning);
+ void freeSpaceChanged(const quint64);
private:
volatile bool m_terminated;
diff --git a/src/Thread_RAMObserver.cpp b/src/Thread_RAMObserver.cpp
new file mode 100644
index 00000000..d7979bf5
--- /dev/null
+++ b/src/Thread_RAMObserver.cpp
@@ -0,0 +1,96 @@
+///////////////////////////////////////////////////////////////////////////////
+// LameXP - Audio Encoder Front-End
+// Copyright (C) 2004-2011 LoRd_MuldeR
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program; if not, write to the Free Software Foundation, Inc.,
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+//
+// http://www.gnu.org/licenses/gpl-2.0.txt
+///////////////////////////////////////////////////////////////////////////////
+
+#include "Thread_RAMObserver.h"
+#include "Global.h"
+
+#include
+
+////////////////////////////////////////////////////////////
+// Constructor & Destructor
+////////////////////////////////////////////////////////////
+
+RAMObserverThread::RAMObserverThread(void)
+{
+ m_terminated = false;
+}
+
+RAMObserverThread::~RAMObserverThread(void)
+{
+}
+
+////////////////////////////////////////////////////////////
+// Protected functions
+////////////////////////////////////////////////////////////
+
+void RAMObserverThread::run(void)
+{
+ qDebug("RAM observer started!");
+ m_terminated = false;
+
+ try
+ {
+ observe();
+ }
+ catch(...)
+ {
+ fflush(stdout);
+ fflush(stderr);
+ fprintf(stderr, "\nGURU MEDITATION !!!\n");
+ FatalAppExit(0, L"Unhandeled exception error, application will exit!");
+ TerminateProcess(GetCurrentProcess(), -1);
+ }
+}
+
+void RAMObserverThread::observe(void)
+{
+ MEMORYSTATUSEX memoryStatus;
+ double previous = -1.0;
+
+ while(!m_terminated)
+ {
+ memset(&memoryStatus, 0, sizeof(MEMORYSTATUSEX));
+ memoryStatus.dwLength = sizeof(MEMORYSTATUSEX);
+
+ if(GlobalMemoryStatusEx(&memoryStatus))
+ {
+ double current = static_cast(memoryStatus.dwMemoryLoad) / 100.0;
+ if(current != previous)
+ {
+ emit currentUsageChanged(current);
+ previous = current;
+ }
+ }
+ msleep(1000);
+ }
+}
+
+////////////////////////////////////////////////////////////
+// SLOTS
+////////////////////////////////////////////////////////////
+
+/*NONE*/
+
+////////////////////////////////////////////////////////////
+// EVENTS
+////////////////////////////////////////////////////////////
+
+/*NONE*/
diff --git a/src/Thread_RAMObserver.h b/src/Thread_RAMObserver.h
new file mode 100644
index 00000000..06585f24
--- /dev/null
+++ b/src/Thread_RAMObserver.h
@@ -0,0 +1,45 @@
+///////////////////////////////////////////////////////////////////////////////
+// LameXP - Audio Encoder Front-End
+// Copyright (C) 2004-2011 LoRd_MuldeR
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program; if not, write to the Free Software Foundation, Inc.,
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+//
+// http://www.gnu.org/licenses/gpl-2.0.txt
+///////////////////////////////////////////////////////////////////////////////
+
+#pragma once
+
+#include
+
+class RAMObserverThread: public QThread
+{
+ Q_OBJECT
+
+public:
+ RAMObserverThread(void);
+ ~RAMObserverThread(void);
+
+ void stop(void) { m_terminated = true; }
+
+protected:
+ void run(void);
+ void observe(void);
+
+signals:
+ void currentUsageChanged(const double usage);
+
+private:
+ volatile bool m_terminated;
+};