diff --git a/LameXP_VS2010.vcxproj b/LameXP_VS2010.vcxproj index 0c4cb832..ba632682 100644 --- a/LameXP_VS2010.vcxproj +++ b/LameXP_VS2010.vcxproj @@ -272,6 +272,7 @@ del "$(TargetDir)imageformats\q???d4.dll" + @@ -322,6 +323,7 @@ del "$(TargetDir)imageformats\q???d4.dll" + @@ -436,6 +438,17 @@ 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)" + MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp" + $(SolutionDir)tmp\MOC_%(Filename).cpp;%(Outputs) + $(SolutionDir)tmp\MOC_%(Filename).cpp;%(Outputs) + $(SolutionDir)tmp\MOC_%(Filename).cpp;%(Outputs) + MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp" + MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp" + "$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\MOC_%(Filename).cpp" "%(FullPath)" + "$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\MOC_%(Filename).cpp" "%(FullPath)" + diff --git a/LameXP_VS2010.vcxproj.filters b/LameXP_VS2010.vcxproj.filters index 869668f0..5d0e2e70 100644 --- a/LameXP_VS2010.vcxproj.filters +++ b/LameXP_VS2010.vcxproj.filters @@ -334,6 +334,12 @@ Generated Files\MOC + + Source Files\Encoders + + + Generated Files\MOC + @@ -626,6 +632,9 @@ Header Files\Threads + + Header Files\Encoders + diff --git a/doc/Changelog.html b/doc/Changelog.html index e737d62d..c13a57c4 100644 --- a/doc/Changelog.html +++ b/doc/Changelog.html @@ -17,7 +17,9 @@ a:visited { color: #0000EE; }

LameXP - Version History


Changes between v4.03 and v4.04:
    +
  • Added support for the QAAC Encoder, requires QuickTime v7.7.1 or newer (see FAQ doc for details)
  • Updated LAME encoder to v3.99.2 Final (2011-11-18), compiled with ICL 12.1.7 and MSVC 10.0 (details) +
  • Updated MediaInfo to v0.7.51+ (2011-11-19), compiled with ICL 12.1.6 and MSVC 10.0
  • Implemented coalescing of update signals in order to reduce the CPU usage of the LameXP process

diff --git a/doc/FAQ.html b/doc/FAQ.html index a7a87d90..9d0d167e 100644 --- a/doc/FAQ.html +++ b/doc/FAQ.html @@ -304,6 +304,7 @@ the same directory where your LameXP executable ('LameXP.exe') is located. For u use any suitable archiver, such as WinRAR or 7-Zip. Once the required Nero encoder binaries are located in
the LameXP directory, the AAC encoding option should be "enabled" on the next startup of LameXP.

+
Optionally LameXP also supports the FHG AAC Encoder now. Just like the Nero encoder, the FHG encoder can NOT
be redistributed along with LameXP. However the FHG AAC Encoder is included with Winamp v5.62, which is
available as a free download (you don't need to buy the "Pro" version!) from the official Winamp web-site at:

Please follow the install instructions that are included with the 'FHG AAC Encoder Add-in' download package!
-Note that you do NOT need to install the Add-in, if you only want to use the Nero AAC Encoder.

+Note that you do NOT need to install the Add-in, if you only want to use the Nero AAC Encoder.
+
+
+As a third option, LameXP supports the QAAC encoder, i.e. the AAC encoder of QuickTime/iTunes. Just like the
+other two AAC encoders, the QAAC encoder can NOT be redistributed along with LameXP. Thus if you want to use
+the QAAC encoder, then you have to install QuickTime v7.7.1 (or newer). Alternatively iTunes v10.5 (or newer)
+can be installed. Both, QuickTime and iTunes, can be downloaded for free from the official Apple web-site.
+
+In addition to installing QuickTime/iTunes, you must download the QAAC encoder from this web-site. Then put
+'qaac.exe' and 'libsoxrate.dll' as well as 'msvcr100.dll' and 'msvcp100.dll' into the same directory where
+your LameXP executable ('LameXP.exe') is located. QAAC will then be "enabled" on the next startup of LameXP.



diff --git a/etc/Translation/Blank.ts b/etc/Translation/Blank.ts index b2bddfbc..4e068ca7 100644 --- a/etc/Translation/Blank.ts +++ b/etc/Translation/Blank.ts @@ -710,7 +710,7 @@ - + Show Details @@ -1367,9 +1367,9 @@ - - - + + + Check for Updates @@ -1410,13 +1410,13 @@ - + Disable Update Reminder - + Disable Sound Effects @@ -1496,704 +1496,704 @@ - + Adding file(s), please wait... - - + + Access Denied - + %1 file(s) have been rejected, because read access was not granted! - + This usually means the file is locked by another process. - + CDDA Files - + %1 file(s) have been rejected, because they are dummy CDDA files! - + Sorry, LameXP cannot extract audio tracks from an Audio-CD at present. - + We recommend using %1 for that purpose. - + Cue Sheet - + %1 file(s) have been rejected, because they appear to be Cue Sheet images! - + Please use LameXP's Cue Sheet wizard for importing Cue Sheet files. - + Files Rejected - + %1 file(s) have been rejected, because the file format could not be recognized! - + This usually means the file is damaged or the file format is not supported. - + Scanning folder(s) for files, please wait... - + DEMO VERSION - + You can drop in audio files here! - + Open File in External Application - + Browse File Location - + Browse Selected Folder - + Bookmark Current Output Folder - + License Declined - + You have declined the license. Consequently the application will exit now! - + Goodbye! - + LameXP - Expired - + This demo (pre-release) version of LameXP has expired at %1. - + LameXP is free software and release versions won't expire. - - + + Exit Program - + It seems that a bogus anti-virus software is slowing down the startup of LameXP. - + Please refer to the %1 document for details and solutions! - + Slow Startup - - - + + - - + + + Discard - - + + Don't Show Again - + Urgent Update - + Your version of LameXP is more than a year old. Time for an update! - - - + + + Update Reminder - + Your last update check was more than 14 days ago. Check for updates now? - + Your did not check for LameXP updates yet. Check for updates now? - + Postpone - + LameXP detected that your version of the Nero AAC encoder is outdated! - + The current version available is %1 (or later), but you still have version %2 installed. - + n/a - + You can download the latest version of the Nero AAC encoder from the Nero website at: - + (Hint: Please ignore the name of the downloaded ZIP file and check the included 'changelog.txt' instead!) - + AAC Encoder Outdated - + The Nero AAC encoder could not be found. AAC encoding support will be disabled. - + Please put 'neroAacEnc.exe', 'neroAacDec.exe' and 'neroAacTag.exe' into the LameXP directory! - + Your LameXP directory is located here: - + You can download the Nero AAC encoder for free from the official Nero website at: - + AAC Support Disabled - - - + + + LameXP - + You must add at least one file to the list before proceeding! - + Not Found - + Your currently selected TEMP folder does not exist anymore: - + Restore Default - + Cancel - + There are less than %1 GB of free diskspace available on your system's TEMP folder. - + It is highly recommend to free up more diskspace before proceeding with the encode! - + Your TEMP folder is located at: - + Low Diskspace Warning - + Abort Encoding Process - + Clean Disk Now - + Ignore - + Low Diskspace - + You are proceeding with low diskspace. Problems might occur! - + Sorry, an unsupported encoder has been chosen! - + Cannot write to the selected output directory. - + Please choose a different directory! - + Load Translation - + Translation Files - + Do you really want to disable the update reminder? - - - - - - - + + + + + + + Yes - - - - - - - + + + + + + + No - + The update reminder has been disabled. - + Please remember to check for updates at regular intervals! - + The update reminder has been re-enabled. - + Do you really want to disable all sound effects? - - + + Sound Effects - + All sound effects have been disabled. - + The sound effects have been re-enabled. - - - + + + Nero AAC Notifications - + Do you really want to disable all Nero AAC Encoder notifications? - + All Nero AAC Encoder notifications have been disabled. - + The Nero AAC Encoder notifications have been re-enabled. - - - + + + Slow Startup Notifications - + Do you really want to disable the slow startup notifications? - + The slow startup notifications have been disabled. - + The slow startup notifications have been re-enabled. - - + + Open Cue Sheet - - + + Cue Sheet File - - - + + + Beta Updates - + Do you really want LameXP to check for Beta (pre-release) updates? - + LameXP will check for Beta (pre-release) updates from now on. - + Check Now - + LameXP will <i>not</i> check for Beta (pre-release) updates from now on. - - - + + + Hibernate Computer - + Do you really want the computer to be hibernated on shutdown? - + LameXP will hibernate the computer on shutdown from now on. - + LameXP will <i>not</i> hibernate the computer on shutdown from now on. - - - + + + Shell Integration - + Do you really want to disable the LameXP shell integration? - + The LameXP shell integration has been disabled. - + The LameXP shell integration has been re-enabled. - - + + Add file(s) - - + + Add Folder - - + + New Folder - + Enter the name of the new folder: - + Failed to create folder - + The new folder could not be created: - + Drive is read-only or insufficient access rights! - - - - + + + + Quality Level %1 - - - + + + Compression %1 - - - + + + Uncompressed - + Best Quality (Very Slow) - + High Quality (Recommended) - + Average Quality (Default) - + Low Quality (Fast) - + Poor Quality (Very Fast) - + File name without extension - + Track number with leading zero - + Track title - + Artist name - + Album name - + Year with (at least) four digits - + Comment - + Characters forbidden in file names: - + Rename Macros - + %1 Instance(s) - + Cannot write to the selected directory. Please choose another directory! - + Already Running - + LameXP is already running, please use the running instance! @@ -2633,114 +2633,114 @@ - + Show details for selected job - + Browse Output File Location - + Encoding Files - + Your files are being encoded, please be patient... - + Encoding files, please wait... - + Multi-threading enabled: Running %1 instances in parallel! - + Aborted! Waiting for running jobs to terminate... - + Encoding: %1 files of %2 completed so far, please wait... - + Creating the playlist file, please wait... - + Process was aborted by the user after %1 file(s)! - + Process was aborted prematurely by the user! - + LameXP - Aborted - + Process was aborted by the user. - + Error: %1 of %2 files failed. Double-click failed items for detailed information! - + LameXP - Error - + At least one file has failed! - + All files completed successfully. - + LameXP - Done - + Playlist creation failed - + The playlist file could not be created: - + Warning: Computer will shutdown in %1 seconds... - - + + Cancel Shutdown @@ -2761,17 +2761,17 @@ QApplication - + Executable '%1' doesn't support Windows compatibility mode. - + Executable '%1' requires Qt v%2, but found Qt v%3. - + Executable '%1' requires Windows 2000 or later. diff --git a/etc/Translation/LameXP_PL.ts b/etc/Translation/LameXP_PL.ts index 1b9533f9..a5efd7cb 100644 --- a/etc/Translation/LameXP_PL.ts +++ b/etc/Translation/LameXP_PL.ts @@ -710,7 +710,7 @@ - + Show Details Pokaż szczegóły @@ -1367,9 +1367,9 @@ - - - + + + Check for Updates Sprawdź aktualizacje @@ -1410,13 +1410,13 @@ - + Disable Update Reminder Wyłącz przypominanie o aktualizacji - + Disable Sound Effects Wyłącz efekty dźwiękowe @@ -1496,704 +1496,704 @@ - + Adding file(s), please wait... Dodawanie plików, prosze czekać... - - + + Access Denied Dostęp zablokowany - + %1 file(s) have been rejected, because read access was not granted! %1 plik(ów) zostało odrzuconych z powodu braku dostępu do pliku! - + This usually means the file is locked by another process. To przeważnie oznacza, że plik jest zablokowany przez inny proces. - + CDDA Files Pliki CDDA - + %1 file(s) have been rejected, because they are dummy CDDA files! %1 plik(ów) zostało odrzuconych ponieważ to nie są właściwe pliki CDDA! - + Sorry, LameXP cannot extract audio tracks from an Audio-CD at present. LameXP nie może teraz wyekstrachować ścieżki z płyty Audio-CD. - + We recommend using %1 for that purpose. Zaleca się użycie w tym celu %1. - + Cue Sheet Cue Sheet - + %1 file(s) have been rejected, because they appear to be Cue Sheet images! %1 plik(ów) zostało odrzuconych, ponieważ to nie są pliki obrazów Cue Sheet! - + Please use LameXP's Cue Sheet wizard for importing Cue Sheet files. Prosze użyć przewodnika Cue Sheet w LameXP w celu importowania tych plików. - + Files Rejected Pliki odrzucone - + %1 file(s) have been rejected, because the file format could not be recognized! %1 plik(ów) zostało odrzuconych, ponieważ ich format nie został rozpoznany! - + This usually means the file is damaged or the file format is not supported. To przeważnie oznacza że plik jest uszkodzony lub format pliku nie jest wspierany. - + Scanning folder(s) for files, please wait... Skanowanie folderu/ów, prosze czekać... - + You can drop in audio files here! Tutaj możesz upuścić pliki dźwiękowe! - + Open File in External Application Otwórz plik w zewnętrznym programie - + Browse File Location Otwórz lokalizację pliku - + Browse Selected Folder Otwórz wybrany folder - + Bookmark Current Output Folder Zapamiętaj wybrany folder - + License Declined Licencja odrzucona - + You have declined the license. Consequently the application will exit now! Odrzuciłeś licencję. W takim razie program zostanie teraz zamknięty! - + Goodbye! Naraska! - + LameXP - Expired LameXP - Termin wygasł - + This demo (pre-release) version of LameXP has expired at %1. Ta wersja demo (beta) LameXP wygasła %1. - + LameXP is free software and release versions won't expire. LameXP jest darmowym oprogramowaniem i pełna wersja nie wygasa. - - + + Exit Program Wyjdź z programu - + It seems that a bogus anti-virus software is slowing down the startup of LameXP. - + Please refer to the %1 document for details and solutions! Prosze sprawdzić dokument %1 w celu dalszych szcegółów i rozwiązań! - + Slow Startup Powolny start - - - + + - - + + + Discard Zamknij - - + + Don't Show Again Nie pokazuj ponownie - + Urgent Update Ważna aktualizacja - + Your version of LameXP is more than a year old. Time for an update! Twoja wersja LameXP jest starsza niż rok! Czas na aktualizację! - - - + + + Update Reminder Powiadomienie aktualizacji - + Your last update check was more than 14 days ago. Check for updates now? Ostatnie sprawdzenie aktualizacji było ponad 14 dni temu. Sprawdzić teraz aktualizacje? - + Your did not check for LameXP updates yet. Check for updates now? Nie sprawdzałeś jeszcze aktualizacji LameXP. Sprawdzić teraz aktualizacje? - + Postpone Przełóż - + LameXP detected that your version of the Nero AAC encoder is outdated! LameXP wykrył że Twoja wersja kodera Nero AAC jest nieaktualna! - + The current version available is %1 (or later), but you still have version %2 installed. Wersją dostępną obecnie jest %1, Twoja wersja to %2. - + n/a n/d - + You can download the latest version of the Nero AAC encoder from the Nero website at: Możesz pobrać najnowszą wersję kodera Nero AAC ze strony Nero: - + AAC Encoder Outdated Koder AAC jest nieaktualny - + The Nero AAC encoder could not be found. AAC encoding support will be disabled. Nie można odnaleźć kodera Nero AAC. Kompresja formatu AAC zostanie wyłączona. - + Please put 'neroAacEnc.exe', 'neroAacDec.exe' and 'neroAacTag.exe' into the LameXP directory! Prosze skopiować 'neroAacEnc.exe', 'neroAacDec.exe', oraz 'neroAacTag.exe' do folderu LameXP! - + Your LameXP directory is located here: Folder aplikacji LameXP znajduje się tutaj: - + You can download the Nero AAC encoder for free from the official Nero website at: Możesz pobrać koder Nero AAC za darmo z oficjalnej strony Nero: - + AAC Support Disabled Wsparcie dla AAC wyłączone - - - + + + LameXP LameXP - + You must add at least one file to the list before proceeding! Powinienieś dodać przynajmniej jeden plik do listy aby zacząć działać! - + Not Found Nie znaleziono - + Your currently selected TEMP folder does not exist anymore: Wybrany przez Ciebie folder tymczasowy TEMP już nie istnieje: - + Restore Default Przywróć domyślne - + Cancel Anuluj - + Low Diskspace Warning Ostrzeżenie o małej ilości miejsca na dysku - + There are less than %1 GB of free diskspace available on your system's TEMP folder. Jest mniej niż %1 GB dostępnego miejsca w systemowym folderze TEMP. - + DEMO VERSION - + (Hint: Please ignore the name of the downloaded ZIP file and check the included 'changelog.txt' instead!) - + It is highly recommend to free up more diskspace before proceeding with the encode! Jest wysoce zalecane zwolnić miejsce na dysku zanim zaczniesz kompresję! - + Your TEMP folder is located at: Twój folder TEMP znajduję się: - + Abort Encoding Process Przerwij proces kompresji - + Clean Disk Now Wykonaj oczyszczanie dysku - + Ignore Ignoruj - + Low Diskspace Mało miejsca na dysku - + You are proceeding with low diskspace. Problems might occur! Chcesz zacząć działać z małą ilością miejsca na dysku. Mogą wystąpić problemy! - + Sorry, an unsupported encoder has been chosen! Został wybrany koder, który nie jest wspierany! - + Cannot write to the selected output directory. Nie można zapisać do wybranej lokalizacji. - + Please choose a different directory! Prosze wybrać inną lokalizację! - + Load Translation Zaladuj plik językowy - + Translation Files Pliki językowe - + Do you really want to disable the update reminder? Czy na pewno chcesz wyłączyć przypominanie o aktualizacjach? - - - - - - - + + + + + + + Yes Tak - - - - - - - + + + + + + + No Nie - + The update reminder has been disabled. Przypominanie o aktualizacjach wyłączone. - + Please remember to check for updates at regular intervals! Prosze pamiętać o okresowym sprawdzaniu aktualizacji! - + The update reminder has been re-enabled. Przypominanie o aktualizacjach ponownie włączone. - + Do you really want to disable all sound effects? Czy na pewno chcesz wyłączyć wszystkie dźwiękowe? - - + + Sound Effects Efekty dźwiękowe - + All sound effects have been disabled. Wszystkie efekty dźwiękowe zostały wyłączone. - + The sound effects have been re-enabled. Efekty dźwiękowe zostały ponownie włączone. - - - + + + Nero AAC Notifications Powiadomienia Nero AAC - + Do you really want to disable all Nero AAC Encoder notifications? Czy na pewno chcesz wyłączyć wszystkie powiadomienia Nero AAC? - + All Nero AAC Encoder notifications have been disabled. Wszystkie powiadomienia kodera Nero AAC zostały wyłączone. - + The Nero AAC Encoder notifications have been re-enabled. Powiadomienia Nero AAC zostały ponownie włączone. - - - + + + Slow Startup Notifications Powiadomienia o powolnym starcie - + Do you really want to disable the slow startup notifications? Czy na pewno chcesz wyłączyć powiadomienia o powolnym starcie? - + The slow startup notifications have been disabled. Powiadomienia o powolnym starcie zostały wyłączone. - + The slow startup notifications have been re-enabled. Powiadomienia o powolnym starcie zostały ponownie włączone. - - + + Open Cue Sheet Otwórz plik Cue Sheet - - + + Cue Sheet File Plik Cue Sheet - - - + + + Beta Updates Aktualizacje Beta - + Do you really want LameXP to check for Beta (pre-release) updates? Czy na pewno chcesz aby LameXP sprawdzał aktualizacje Beta? - + LameXP will check for Beta (pre-release) updates from now on. Od teraz LameXP będzie sprawdzał aktualizacje Beta. - + Check Now Sprawdź teraz - + LameXP will <i>not</i> check for Beta (pre-release) updates from now on. LameXP od teraz <i>nie będzie</i> sprawdzał aktualizacji Beta. - - - + + + Hibernate Computer - + Do you really want the computer to be hibernated on shutdown? - + LameXP will hibernate the computer on shutdown from now on. - + LameXP will <i>not</i> hibernate the computer on shutdown from now on. - - - + + + Shell Integration Integracja z systemem - + Do you really want to disable the LameXP shell integration? Czy na pewno chcesz wyłączyć integrację LameXP z systemem? - + The LameXP shell integration has been disabled. Integracja LameXP z systemem zostałą wyłączona. - + The LameXP shell integration has been re-enabled. Integracja LameXP z systemem została ponownie włączona. - - + + Add file(s) Dodaj plik(i) - - + + Add Folder Dodaj folder - - + + New Folder Nowy folder - + Enter the name of the new folder: Wprowadź nazwę nowego folderu: - + Failed to create folder Utworzenie folderu zakończone niepowodzeniem - + The new folder could not be created: Nowy folder nie mógł zostać stworzony: - + Drive is read-only or insufficient access rights! Dysk tylko do odczytu lub brak praw dostępu! - - - - + + + + Quality Level %1 Poziom jakości %1 - - - + + + Compression %1 Kompresja %1 - - - + + + Uncompressed Nieskompresowany - + Best Quality (Very Slow) Najlepsza jakość (Bardzo wolno) - + High Quality (Recommended) Wysoka jakość (Zalecane) - + Average Quality (Default) Średnia jakość (Domyślnie) - + Low Quality (Fast) Niska jakość (Szybko) - + Poor Quality (Very Fast) Najniższa jakość (Bardzo szybko) - + File name without extension Nazwa pliku bez rozszerzenia - + Track number with leading zero Numer ścieżki z zerem na początku - + Track title Nazwa ścieżki - + Artist name Nazwa Artysty - + Album name Nazwa Albumu - + Year with (at least) four digits Rok z (przynajmniej) czterema cyframi - + Comment Komentarz - + Characters forbidden in file names: Zabronione znaki w nazwach plików: - + Rename Macros Zmień nazwy makr - + %1 Instance(s) %1 wątek/ki - + Cannot write to the selected directory. Please choose another directory! Nie można zapisać do wybranej lokalizacji. Prosze wybierz inną lokalizację! - + Already Running Już działa - + LameXP is already running, please use the running instance! LameXP już działa, przejdź do działającego programu! @@ -2633,114 +2633,114 @@ Powrót - + Show details for selected job Pokaż szczegóły wybranego zadania - + Browse Output File Location Wybierz lokalizację dla plików wyjściowych - + Encoding Files Kompresowanie plików - + Your files are being encoded, please be patient... Twoje pliki są właśnie kompresowane, prosze być cierpliwy... - + Encoding files, please wait... Kompresowanie plików, prosze czekać... - + Multi-threading enabled: Running %1 instances in parallel! Wielowątkowosć włączona: Równolegle wykonywanych jest %1 kodowań! - + Aborted! Waiting for running jobs to terminate... Przerwano! Czekanie na wyłączenie procesu... - + Encoding: %1 files of %2 completed so far, please wait... Kompresja: Prosze czekać, jak dotąd wykonano %1 z %2 plików... - + Creating the playlist file, please wait... Tworzenie pliku playlisty, prosze czekać... - + Process was aborted by the user after %1 file(s)! Proces został przerwany przez użytkownika po wykonaniu %1 plików! - + Process was aborted prematurely by the user! Proces został przedwcześnie zakończony przez użytkownika! - + LameXP - Aborted LameXP - Przerwano - + Process was aborted by the user. Proces został przerwany przez użytkownika. - + Error: %1 of %2 files failed. Double-click failed items for detailed information! Błąd: %1 z %2 plików nie zostało skompresowanych. Kliknij dwukrotnie na plik aby zobaczyć szczegóły! - + LameXP - Error LameXP - Błąd - + At least one file has failed! Przynajmniej jeden plik nie został skompresowany! - + All files completed successfully. Kompresja wszystkich plików zakończona powodzeniem. - + LameXP - Done LameXP - Zrobione - + Playlist creation failed Tworzenie playlisty zakończone niepowodzeniem - + The playlist file could not be created: Playlista nie mogła zostać utworzona: - + Warning: Computer will shutdown in %1 seconds... Ostrzeżenie: Komputer zostanie zamknięty za %1 sekund/y... - - + + Cancel Shutdown Anuluj wyłączenie komputera @@ -2761,17 +2761,17 @@ QApplication - + Executable '%1' doesn't support Windows compatibility mode. Plik wykonywalny '%1' nie działa w trybie kompatybilności z Windows. - + Executable '%1' requires Qt v%2, but found Qt v%3. Plik wykonywalny '%1' wymaga Qt v%2, znaleziono jednak Qt v%3. - + Executable '%1' requires Windows 2000 or later. Plik wykonywalny '%1' wymaga do uruchomienia Windows 2000 lub nowszego. diff --git a/src/Config.h b/src/Config.h index 0aa377d5..360676c3 100644 --- a/src/Config.h +++ b/src/Config.h @@ -29,8 +29,8 @@ #define VER_LAMEXP_MINOR_HI 0 #define VER_LAMEXP_MINOR_LO 4 #define VER_LAMEXP_TYPE Alpha -#define VER_LAMEXP_PATCH 1 -#define VER_LAMEXP_BUILD 781 +#define VER_LAMEXP_PATCH 2 +#define VER_LAMEXP_BUILD 782 /////////////////////////////////////////////////////////////////////////////// // Tools versions @@ -38,6 +38,7 @@ #define VER_LAMEXP_TOOL_NEROAAC 1540 #define VER_LAMEXP_TOOL_FHGAACENC 20110822 +#define VER_LAMEXP_TOOL_QAAC 104 /////////////////////////////////////////////////////////////////////////////// // Helper macros (aka: having fun with the C pre-processor) diff --git a/src/Dialog_MainWindow.cpp b/src/Dialog_MainWindow.cpp index b2427898..bed1b7ed 100644 --- a/src/Dialog_MainWindow.cpp +++ b/src/Dialog_MainWindow.cpp @@ -90,6 +90,7 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S m_settings(settingsModel), m_neroEncoderAvailable(lamexp_check_tool("neroAacEnc.exe") && lamexp_check_tool("neroAacDec.exe") && lamexp_check_tool("neroAacTag.exe")), m_fhgEncoderAvailable(lamexp_check_tool("fhgaacenc.exe") && lamexp_check_tool("enc_fhgaac.dll") && lamexp_check_tool("nsutil.dll") && lamexp_check_tool("libmp4v2.dll")), + m_qaacEncoderAvailable(lamexp_check_tool("qaac.exe") && lamexp_check_tool("libsoxrate.dll") && lamexp_check_tool("msvcp100.dll") && lamexp_check_tool("msvcr100.dll")), m_accepted(false), m_firstTimeShown(true), m_OutputFolderViewInitialized(false) @@ -207,10 +208,10 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S m_modeButtonGroup->addButton(radioButtonModeQuality, SettingsModel::VBRMode); m_modeButtonGroup->addButton(radioButtonModeAverageBitrate, SettingsModel::ABRMode); m_modeButtonGroup->addButton(radioButtonConstBitrate, SettingsModel::CBRMode); - radioButtonEncoderAAC->setEnabled(m_neroEncoderAvailable || m_fhgEncoderAvailable); + radioButtonEncoderAAC->setEnabled(m_neroEncoderAvailable || m_fhgEncoderAvailable || m_qaacEncoderAvailable); radioButtonEncoderMP3->setChecked(m_settings->compressionEncoder() == SettingsModel::MP3Encoder); radioButtonEncoderVorbis->setChecked(m_settings->compressionEncoder() == SettingsModel::VorbisEncoder); - radioButtonEncoderAAC->setChecked((m_settings->compressionEncoder() == SettingsModel::AACEncoder) && (m_neroEncoderAvailable || m_fhgEncoderAvailable)); + radioButtonEncoderAAC->setChecked((m_settings->compressionEncoder() == SettingsModel::AACEncoder) && (m_neroEncoderAvailable || m_fhgEncoderAvailable || m_qaacEncoderAvailable)); radioButtonEncoderAC3->setChecked(m_settings->compressionEncoder() == SettingsModel::AC3Encoder); radioButtonEncoderFLAC->setChecked(m_settings->compressionEncoder() == SettingsModel::FLACEncoder); radioButtonEncoderPCM->setChecked(m_settings->compressionEncoder() == SettingsModel::PCMEncoder); @@ -246,7 +247,7 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S while(checkBoxUseSystemTempFolder->isChecked() == m_settings->customTempPathEnabled()) checkBoxUseSystemTempFolder->click(); while(checkBoxRenameOutput->isChecked() != m_settings->renameOutputFilesEnabled()) checkBoxRenameOutput->click(); while(checkBoxForceStereoDownmix->isChecked() != m_settings->forceStereoDownmix()) checkBoxForceStereoDownmix->click(); - checkBoxNeroAAC2PassMode->setEnabled(!m_fhgEncoderAvailable); + checkBoxNeroAAC2PassMode->setEnabled(!(m_fhgEncoderAvailable || m_qaacEncoderAvailable)); lineEditCustomParamLAME->setText(m_settings->customParametersLAME()); lineEditCustomParamOggEnc->setText(m_settings->customParametersOggEnc()); lineEditCustomParamNeroAAC->setText(m_settings->customParametersAacEnc()); @@ -1042,7 +1043,7 @@ void MainWindow::windowShown(void) } else { - if(m_settings->neroAacNotificationsEnabled() && (!m_fhgEncoderAvailable)) + if(m_settings->neroAacNotificationsEnabled() && (!(m_fhgEncoderAvailable || m_qaacEncoderAvailable))) { QString appPath = QDir(QCoreApplication::applicationDirPath()).canonicalPath(); if(appPath.isEmpty()) appPath = QCoreApplication::applicationDirPath(); diff --git a/src/Dialog_MainWindow.h b/src/Dialog_MainWindow.h index b055938c..ce672129 100644 --- a/src/Dialog_MainWindow.h +++ b/src/Dialog_MainWindow.h @@ -160,6 +160,7 @@ private: const bool m_neroEncoderAvailable; const bool m_fhgEncoderAvailable; + const bool m_qaacEncoderAvailable; WorkingBanner *m_banner; QStringList *m_delayedFileList; diff --git a/src/Dialog_Processing.cpp b/src/Dialog_Processing.cpp index 326b33a8..7eb6f359 100644 --- a/src/Dialog_Processing.cpp +++ b/src/Dialog_Processing.cpp @@ -35,6 +35,7 @@ #include "Encoder_Vorbis.h" #include "Encoder_AAC.h" #include "Encoder_AAC_FHG.h" +#include "Encoder_AAC_QAAC.h" #include "Encoder_AC3.h" #include "Encoder_FLAC.h" #include "Encoder_Wave.h" @@ -660,7 +661,16 @@ void ProcessingDialog::startNextJob(void) break; case SettingsModel::AACEncoder: { - if(lamexp_check_tool("fhgaacenc.exe") && lamexp_check_tool("enc_fhgaac.dll")) + if(lamexp_check_tool("qaac.exe") && lamexp_check_tool("libsoxrate.dll")) + { + QAACEncoder *aacEncoder = new QAACEncoder(); + aacEncoder->setBitrate(m_settings->compressionBitrate()); + aacEncoder->setRCMode(m_settings->compressionRCMode()); + aacEncoder->setProfile(m_settings->aacEncProfile()); + aacEncoder->setCustomParams(m_settings->customParametersAacEnc()); + encoder = aacEncoder; + } + else if(lamexp_check_tool("fhgaacenc.exe") && lamexp_check_tool("enc_fhgaac.dll")) { FHGAACEncoder *aacEncoder = new FHGAACEncoder(); aacEncoder->setBitrate(m_settings->compressionBitrate()); diff --git a/src/Encoder_AAC.cpp b/src/Encoder_AAC.cpp index 2f311842..253d4579 100644 --- a/src/Encoder_AAC.cpp +++ b/src/Encoder_AAC.cpp @@ -54,7 +54,7 @@ bool AACEncoder::encode(const QString &sourceFile, const AudioFileModel &metaInf switch(m_configRCMode) { case SettingsModel::VBRMode: - args << "-q" << QString().sprintf("%.2f", qMin(1.0, qMax(0.0, static_cast(m_configBitrate * 5) / 100.0))); + args << "-q" << QString().sprintf("%.2f", qBound(0.0, static_cast(m_configBitrate * 5) / 100.0, 1.0)); break; case SettingsModel::ABRMode: args << "-br" << QString::number(qMax(32, qMin(500, (m_configBitrate * 8))) * 1000); diff --git a/src/Encoder_AAC_QAAC.cpp b/src/Encoder_AAC_QAAC.cpp new file mode 100644 index 00000000..f9c95fd9 --- /dev/null +++ b/src/Encoder_AAC_QAAC.cpp @@ -0,0 +1,184 @@ +/////////////////////////////////////////////////////////////////////////////// +// 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 "Encoder_AAC_QAAC.h" + +#include "Global.h" +#include "Model_Settings.h" + +#include +#include +#include + +QAACEncoder::QAACEncoder(void) +: + m_binary_enc(lamexp_lookup_tool("qaac.exe")), + m_binary_dll(lamexp_lookup_tool("libsoxrate.dll")) +{ + if(m_binary_enc.isEmpty() || m_binary_dll.isEmpty()) + { + throw "Error initializing QAAC. Tool 'qaac.exe' is not registred!"; + } + + m_configProfile = 0; +} + +QAACEncoder::~QAACEncoder(void) +{ +} + +bool QAACEncoder::encode(const QString &sourceFile, const AudioFileModel &metaInfo, const QString &outputFile, volatile bool *abortFlag) +{ + QProcess process; + QStringList args; + + if(m_configRCMode != SettingsModel::VBRMode) + { + switch(m_configProfile) + { + case 2: + case 3: + args << "--he"; //Forces use of HE AAC profile (there is no explicit HEv2 switch for QAAC) + break; + } + } + + switch(m_configRCMode) + { + case SettingsModel::CBRMode: + args << "--cbr" << QString::number(qBound(32, m_configBitrate * 8, 500)); + break; + case SettingsModel::ABRMode: + args << "--abr" << QString::number(qBound(32, m_configBitrate * 8, 500)); + break; + case SettingsModel::VBRMode: + args << "--tvbr" << QString::number(qBound(0, qRound((static_cast(m_configBitrate * 5) / 100.0) * 127.0), 127)); + break; + default: + throw "Bad rate-control mode!"; + break; + } + + if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts); + + if(!metaInfo.fileName().isEmpty()) args << "--title" << metaInfo.fileName(); + if(!metaInfo.fileArtist().isEmpty()) args << "--artist" << metaInfo.fileArtist(); + if(!metaInfo.fileAlbum().isEmpty()) args << "--album" << metaInfo.fileAlbum(); + if(!metaInfo.fileGenre().isEmpty()) args << "--genre" << metaInfo.fileGenre(); + if(!metaInfo.fileComment().isEmpty()) args << "--comment" << metaInfo.fileComment(); + if(metaInfo.fileYear()) args << "--date" << QString::number(metaInfo.fileYear()); + if(metaInfo.filePosition()) args << "--track" << QString::number(metaInfo.filePosition()); + if(!metaInfo.fileCover().isEmpty()) args << "--artwork" << metaInfo.fileCover(); + + args << "-o" << QDir::toNativeSeparators(outputFile); + args << QDir::toNativeSeparators(sourceFile); + + if(!startProcess(process, m_binary_enc, args)) + { + return false; + } + + bool bTimeout = false; + bool bAborted = false; + int prevProgress = -1; + + QRegExp regExp("\\[(\\d+)\\.(\\d)%\\]"); + + while(process.state() != QProcess::NotRunning) + { + if(*abortFlag) + { + process.kill(); + bAborted = true; + emit messageLogged("\nABORTED BY USER !!!"); + break; + } + process.waitForReadyRead(m_processTimeoutInterval); + if(!process.bytesAvailable() && process.state() == QProcess::Running) + { + process.kill(); + qWarning("QAAC process timed out <-- killing!"); + emit messageLogged("\nPROCESS TIMEOUT !!!"); + bTimeout = true; + break; + } + while(process.bytesAvailable() > 0) + { + QByteArray line = process.readLine(); + QString text = QString::fromUtf8(line.constData()).simplified(); + if(regExp.lastIndexIn(text) >= 0) + { + bool ok = false; + int progress = regExp.cap(1).toInt(&ok); + if(ok && (progress > prevProgress)) + { + emit statusUpdated(progress); + prevProgress = qMin(progress + 2, 99); + } + } + else if(!text.isEmpty()) + { + emit messageLogged(text); + } + } + } + + process.waitForFinished(); + if(process.state() != QProcess::NotRunning) + { + process.kill(); + process.waitForFinished(-1); + } + + emit statusUpdated(100); + emit messageLogged(QString().sprintf("\nExited with code: 0x%04X", process.exitCode())); + + if(bTimeout || bAborted || process.exitStatus() != QProcess::NormalExit) + { + return false; + } + + return true; +} + +QString QAACEncoder::extension(void) +{ + return "mp4"; +} + +bool QAACEncoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion) +{ + if(containerType.compare("Wave", Qt::CaseInsensitive) == 0) + { + if(formatType.compare("PCM", Qt::CaseInsensitive) == 0) + { + return true; + } + } + + return false; +} + + +void QAACEncoder::setProfile(int profile) +{ + m_configProfile = profile; +} diff --git a/src/Encoder_AAC_QAAC.h b/src/Encoder_AAC_QAAC.h new file mode 100644 index 00000000..ca52c0c6 --- /dev/null +++ b/src/Encoder_AAC_QAAC.h @@ -0,0 +1,47 @@ +/////////////////////////////////////////////////////////////////////////////// +// 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 "Encoder_Abstract.h" + +#include + +class QAACEncoder : public AbstractEncoder +{ + Q_OBJECT + +public: + QAACEncoder(void); + ~QAACEncoder(void); + + virtual bool encode(const QString &sourceFile, const AudioFileModel &metaInfo, const QString &outputFile, volatile bool *abortFlag); + virtual bool isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion); + virtual QString extension(void); + + //Advanced options + virtual void setProfile(int profile); + +private: + const QString m_binary_enc; + const QString m_binary_dll; + int m_configProfile; +}; diff --git a/src/Global.cpp b/src/Global.cpp index 050eff40..40b7404c 100644 --- a/src/Global.cpp +++ b/src/Global.cpp @@ -169,6 +169,7 @@ static const char *g_lamexp_support_url = "http://forum.doom9.org/showthread.php //Tool versions (expected versions!) static const unsigned int g_lamexp_toolver_neroaac = VER_LAMEXP_TOOL_NEROAAC; static const unsigned int g_lamexp_toolver_fhgaacenc = VER_LAMEXP_TOOL_FHGAACENC; +static const unsigned int g_lamexp_toolver_qaacenc = VER_LAMEXP_TOOL_QAAC; //Special folders static QString g_lamexp_temp_folder; @@ -239,7 +240,7 @@ const char *lamexp_version_compiler(void) { return g_lamexp_version_compiler; } const char *lamexp_version_arch(void) { return g_lamexp_version_arch; } unsigned int lamexp_toolver_neroaac(void) { return g_lamexp_toolver_neroaac; } unsigned int lamexp_toolver_fhgaacenc(void) { return g_lamexp_toolver_fhgaacenc; } - +unsigned int lamexp_toolver_qaacenc(void) { return g_lamexp_toolver_qaacenc; } /* * URL getters */ diff --git a/src/Global.h b/src/Global.h index 4e54423c..9655aff4 100644 --- a/src/Global.h +++ b/src/Global.h @@ -81,6 +81,7 @@ const char *lamexp_version_arch(void); QDate lamexp_version_expires(void); unsigned int lamexp_toolver_neroaac(void); unsigned int lamexp_toolver_fhgaacenc(void); +unsigned int lamexp_toolver_qaacenc(void); const char *lamexp_website_url(void); const char *lamexp_support_url(void); DWORD lamexp_get_os_version(void); diff --git a/src/Model_Settings.cpp b/src/Model_Settings.cpp index b135fce6..7094f9a1 100644 --- a/src/Model_Settings.cpp +++ b/src/Model_Settings.cpp @@ -222,10 +222,13 @@ void SettingsModel::validate(void) { if(!(lamexp_check_tool("fhgaacenc.exe") && lamexp_check_tool("enc_fhgaac.dll"))) { - if(this->compressionEncoder() == SettingsModel::AACEncoder) + if(!(lamexp_check_tool("qaac.exe") && lamexp_check_tool("libsoxrate.dll"))) { - qWarning("AAC encoder selected, but not available any more. Reverting to MP3!"); - this->compressionEncoder(SettingsModel::MP3Encoder); + if(this->compressionEncoder() == SettingsModel::AACEncoder) + { + qWarning("AAC encoder selected, but not available any more. Reverting to MP3!"); + this->compressionEncoder(SettingsModel::MP3Encoder); + } } } } diff --git a/src/Thread_Initialization.cpp b/src/Thread_Initialization.cpp index eb7b4f2d..f2a1e375 100644 --- a/src/Thread_Initialization.cpp +++ b/src/Thread_Initialization.cpp @@ -202,11 +202,10 @@ void InitializationThread::run() //Register all translations initTranslations(); - //Look for Nero AAC encoder + //Look for AAC encoders initNeroAac(); - - //Look for FHG AAC encoder initFhgAac(); + initQAac(); delay(); m_bSuccess = true; @@ -482,6 +481,111 @@ void InitializationThread::initFhgAac(void) } } +void InitializationThread::initQAac(void) +{ + const QString appPath = QDir(QCoreApplication::applicationDirPath()).canonicalPath(); + + QFileInfo qaacFileInfo[4]; + qaacFileInfo[0] = QFileInfo(QString("%1/qaac.exe").arg(appPath)); + qaacFileInfo[1] = QFileInfo(QString("%1/libsoxrate.dll").arg(appPath)); + qaacFileInfo[2] = QFileInfo(QString("%1/msvcp100.dll").arg(appPath)); + qaacFileInfo[3] = QFileInfo(QString("%1/msvcr100.dll").arg(appPath)); + + bool qaacFilesFound = true; + for(int i = 0; i < 4; i++) { if(!qaacFileInfo[i].exists()) qaacFilesFound = false; } + + //Lock the FhgAacEnc binaries + if(!qaacFilesFound) + { + qDebug("QAAC binaries not found -> QAAC support will be disabled!\n"); + return; + } + + qDebug("Found QAAC encoder:\n%s\n", qaacFileInfo[0].canonicalFilePath().toUtf8().constData()); + + LockedFile *qaacBin[4]; + for(int i = 0; i < 4; i++) qaacBin[i] = NULL; + + try + { + for(int i = 0; i < 4; i++) + { + qaacBin[i] = new LockedFile(qaacFileInfo[i].canonicalFilePath()); + } + } + catch(...) + { + for(int i = 0; i < 4; i++) LAMEXP_DELETE(qaacBin[i]); + qWarning("Failed to get excluive lock to FhgAacEnc binary -> FhgAacEnc support will be disabled!"); + return; + } + + QProcess process; + process.setProcessChannelMode(QProcess::MergedChannels); + process.setReadChannel(QProcess::StandardOutput); + process.start(qaacFileInfo[0].canonicalFilePath(), QStringList()); + + if(!process.waitForStarted()) + { + qWarning("QAAC process failed to create!"); + qWarning("Error message: \"%s\"\n", process.errorString().toLatin1().constData()); + process.kill(); + process.waitForFinished(-1); + for(int i = 0; i < 4; i++) LAMEXP_DELETE(qaacBin[i]); + return; + } + + QRegExp qaacEncSig("qaac (\\d)\\.(\\d)(\\d)", Qt::CaseInsensitive); + unsigned int qaacVersion = 0; + + while(process.state() != QProcess::NotRunning) + { + process.waitForReadyRead(); + if(!process.bytesAvailable() && process.state() == QProcess::Running) + { + qWarning("QAAC process time out -> killing!"); + process.kill(); + process.waitForFinished(-1); + for(int i = 0; i < 4; i++) LAMEXP_DELETE(qaacBin[i]); + return; + } + while(process.bytesAvailable() > 0) + { + QString line = QString::fromUtf8(process.readLine().constData()).simplified(); + if(qaacEncSig.lastIndexIn(line) >= 0) + { + unsigned int tmp[3] = {0, 0, 0}; + bool ok[3] = {false, false, false}; + tmp[0] = qaacEncSig.cap(1).toUInt(&ok[0]); + tmp[1] = qaacEncSig.cap(2).toUInt(&ok[1]); + tmp[2] = qaacEncSig.cap(3).toUInt(&ok[2]); + if(ok[0] && ok[1] && ok[2]) + { + qaacVersion = (qBound(0U, tmp[0], 9U) * 100) + (qBound(0U, tmp[1], 9U) * 10) + qBound(0U, tmp[2], 9U); + } + } + } + } + + if(!(qaacVersion > 0)) + { + qWarning("QAAC version couldn't be determined -> QAAC support will be disabled!"); + for(int i = 0; i < 4; i++) LAMEXP_DELETE(qaacBin[i]); + return; + } + else if(qaacVersion < lamexp_toolver_qaacenc()) + { + qWarning("QAAC version is too much outdated -> QAAC support will be disabled!"); + for(int i = 0; i < 4; i++) LAMEXP_DELETE(qaacBin[i]); + return; + } + + for(int i = 0; i < 4; i++) + { + lamexp_register_tool(qaacFileInfo[i].fileName(), qaacBin[i], qaacVersion); + } +} + void InitializationThread::selfTest(void) { const unsigned int cpu[4] = {CPU_TYPE_X86_GEN, CPU_TYPE_X86_SSE, CPU_TYPE_X64_GEN, CPU_TYPE_X64_SSE}; diff --git a/src/Thread_Initialization.h b/src/Thread_Initialization.h index 73aa956c..94870d1a 100644 --- a/src/Thread_Initialization.h +++ b/src/Thread_Initialization.h @@ -45,6 +45,7 @@ private: void initTranslations(void); void initNeroAac(void); void initFhgAac(void); + void initQAac(void); bool m_bSuccess; lamexp_cpu_t m_cpuFeatures;