diff --git a/LameXP_VS2013.vcxproj.filters b/LameXP_VS2013.vcxproj.filters
index f0af7481..711b88eb 100644
--- a/LameXP_VS2013.vcxproj.filters
+++ b/LameXP_VS2013.vcxproj.filters
@@ -1040,21 +1040,21 @@
Resources
+
+ Resources
+
+
+ Resources
+
+
+ Resources
+
Miscellaneous
-
- Resources
-
-
- Resources
-
-
- Resources
-
diff --git a/LameXP_VS2015.vcxproj.filters b/LameXP_VS2015.vcxproj.filters
index f0af7481..711b88eb 100644
--- a/LameXP_VS2015.vcxproj.filters
+++ b/LameXP_VS2015.vcxproj.filters
@@ -1040,21 +1040,21 @@
Resources
+
+ Resources
+
+
+ Resources
+
+
+ Resources
+
Miscellaneous
-
- Resources
-
-
- Resources
-
-
- Resources
-
diff --git a/etc/Translation/Blank.ts b/etc/Translation/Blank.ts
index f5524173..7ba3ce65 100644
--- a/etc/Translation/Blank.ts
+++ b/etc/Translation/Blank.ts
@@ -2980,143 +2980,143 @@
ProcessThread
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -3392,12 +3392,12 @@
ShellIntegration
-
+
-
+
diff --git a/etc/Translation/LameXP_DE.ts b/etc/Translation/LameXP_DE.ts
index c384de52..66661d11 100644
--- a/etc/Translation/LameXP_DE.ts
+++ b/etc/Translation/LameXP_DE.ts
@@ -2989,143 +2989,143 @@
ProcessThread
-
+
Starte...
-
+
Nicht gefunden!
-
+
Das Format dieser Datei wird nicht unterstützt:
-
+
-
+
Audioformat:
-
+
Nicht unterstützt!
-
+
Fertig.
-
+
Abgebrochen!
-
+
Fehler!
-
+
Kodiere
-
+
Filtere
-
+
Dekodiere
-
+
Die Quell-Audiodatei konnte nicht gefunden werden:
-
+
Die Quell-Audiodatei konnte nicht zum Lesen geöffnet werden:
-
+
Das Zielverzeichnis existiert nicht und konnte nicht erstellt werden:
-
+
In das Zielverzeichnis kann nicht geschrieben werden:
-
+
Unbekannter Dateiname
-
+
Unbekannter Titel
-
+
Unbekannter Künstler
-
+
Unbekanntes Album
-
+
Unbekannter Kommentar
-
+
Prüfe
-
+
WARNUNG: Dekodierte Dateigröße übersteigt 4 GB, Probleme sind vorprogrammiert!
-
+
Übersprungen.
-
+
Zieldatei existiert bereits, die Datei wird übersprungen:
-
+
Wenn existierende Dateien nicht übersprungen werden sollen, ändern Sie bitte den Überschreiben-Modus!
-
+
Zieldatei existiert bereits, die Datei wird gelöscht und überschrieben:
-
+
Die existierende Datei konnte nicht gelöscht werden, ein anderer Dateiname wird gewählt!
@@ -3411,12 +3411,12 @@
ShellIntegration
-
+
LameXP Audiodatei
-
+
Datei mit LameXP v%1 umwandeln
diff --git a/etc/Translation/LameXP_ES.ts b/etc/Translation/LameXP_ES.ts
index 26705c66..5d7e41f5 100644
--- a/etc/Translation/LameXP_ES.ts
+++ b/etc/Translation/LameXP_ES.ts
@@ -2989,143 +2989,143 @@
ProcessThread
-
+
Iniciando...
-
+
¡No encontrado!
-
+
El formato de este archivo NO está soportado:
-
+
Formato del contenedor:
-
+
Formato de audio:
-
+
¡No soportado!
-
+
Finalizado.
-
+
¡Abortado!
-
+
¡Error!
-
+
Codificando
-
+
Filtrando
-
+
Decodificando
-
+
No se encuentra el archivo de entrada:
-
+
No se puede abrir el archivo de entrada para su lectura:
-
+
La carpeta de salida no existe y NO puede ser creada:
-
+
NO se puede escribir en la carpeta de salida:
-
+
Nombre de archivo desconocido
-
+
Título desconocido
-
+
Artista desconocido
-
+
Álbum desconocido
-
+
Comentario desconocido
-
+
Analizando
-
+
ADVERTENCIA: ¡El tamaño del archivo decodificado supera los 4 GB, pueden producirse problemas!
-
+
Omitidos.
-
+
El archivo de destino ya existe, se omitirá este archivo:
-
+
¡Si no quiere sobreescribir los archivos existentes, cambie el modo sobreescritura por favor!
-
+
El archivo de destino ya existe, se eliminará este archivo:
-
+
¡Error al eliminar el archivo de destino existente, se guardará con otro nombre!
@@ -3411,12 +3411,12 @@
ShellIntegration
-
+
Archivo de audio soportado por LameXP
-
+
Convertir este archivo con LameXP v%1
diff --git a/etc/Translation/LameXP_FR.ts b/etc/Translation/LameXP_FR.ts
index c5bf0df0..c5d6958c 100644
--- a/etc/Translation/LameXP_FR.ts
+++ b/etc/Translation/LameXP_FR.ts
@@ -2996,144 +2996,144 @@ Sélection automatique (par défaut)
ProcessThread
-
+
Démarrage...
-
+
Non trouvé!
-
+
Le format de ce fichier N'EST PAS supporté:
-
+
Format du conteneur:
-
+
Format audio:
-
+
Non supporté!
-
+
Terminé.
-
+
Arrêté!
-
+
Échec!
-
+
Encodage
-
+
Filtrage
-
+
Décodage
-
+
Le fichier audio source n'a pas pu être trouvé:
-
+
Le fichier audio source n'a pas pu être ouvert pour la lecture:
-
+
Le répertoire de sortie cible n'existe pas et ne peut PAS être créé:
-
+
Le répertoire de sortie cible n'est pas accessible en écriture:
-
+
Nom de fichier inconnu
-
+
Titre inconnu
-
+
Artiste inconnu
-
+
Album inconnu
-
+
Commentaire inconnu
-
+
Analyse
-
+
AVERTISSEMENT : La taille du fichier décodé dépasse 4Go, des problèmes peuvent survenir!
-
+
Ignoré.
-
+
Le fichier de sortie existe déjà, il sera ignoré :
-
+
Si vous ne voulez pas ignorer les fichiers existants, veuillez changer le mode de remplacement !
-
+
Le fichier de sortie existe déjà, il sera supprimé :
-
+
Impossible de supprimer le fichier cible existant, il sera enregistré sous un autre nom !
@@ -3420,12 +3420,12 @@ Sélection automatique (par défaut)
ShellIntegration
-
+
Fichier audio pris en charge par LameXP
-
+
Convertir ce fichier avec LameXP v%1
diff --git a/etc/Translation/LameXP_HU.ts b/etc/Translation/LameXP_HU.ts
index 90ed48a3..d0f3c6c5 100644
--- a/etc/Translation/LameXP_HU.ts
+++ b/etc/Translation/LameXP_HU.ts
@@ -2980,143 +2980,143 @@
ProcessThread
-
+
Indítás...
-
+
Kihagyva.
-
+
Nem található!
-
+
FIGYELEM: A dekódolt fájl mérete meghaladja a 4 GB-ot. Ez problémákat okozhat!
-
+
A fájl formátuma NEM támogatott:
-
+
Tárolási formátum:
-
+
Hangformátum:
-
+
Nem támogatott!
-
+
Megszakítva!
-
+
Kész.
-
+
Sikertelen!
-
+
Kódolás
-
+
Elemzés
-
+
Szűrés
-
+
Dekódolás
-
+
A forrás hangfájl nem található:
-
+
A forrás hangfájl nem nyitható meg olvasásra:
-
+
A cél kimeneti könyvtár nem létezik, és NEM hozható létre:
-
+
A cél kimeneti könyvtár NEM írható:
-
+
Ismeretlen fájlnév
-
+
Ismeretlen cím
-
+
Ismeretlen előadó
-
+
Ismeretlen album
-
+
Ismeretlen hozzászólás
-
+
A cél kimeneti fájl már létezik, ez a fájl ki lesz hagyva:
-
+
Ha nem szeretné a meglévő fájlokat kihagyni, kérjük, változtassa meg a felülírási módot!
-
+
A cél kimeneti fájl már létezik, a meglévő fájl törlésre kerül:
-
+
Nem sikerült törölni a meglévő cél fájlt. Az állomány másik fájlnéven lesz elmentve!
@@ -3392,12 +3392,12 @@
ShellIntegration
-
+
LameXP által támogatott hangfájl
-
+
A fájl konvertálása a LameXP v%1 változatával
diff --git a/etc/Translation/LameXP_IT.ts b/etc/Translation/LameXP_IT.ts
index 61c68abf..dfcb62cf 100644
--- a/etc/Translation/LameXP_IT.ts
+++ b/etc/Translation/LameXP_IT.ts
@@ -3055,144 +3055,144 @@
ProcessThread
-
+
Avvio in corso...
-
+
Non trovato!
-
+
Il formato di questo file NON è supportato:
-
+
Formato Contenitore:
-
+
Formato Audio:
-
+
Non Supportato!
-
+
Fatto.
-
+
Processo Annullato!
-
+
Fallito!
-
+
Codifica in corso
-
+
Filtraggio in corso
-
+
Decodifica in corso
-
+
Il file audio sorgente non può essere trovato:
-
+
Il file audio sorgente non può essere aperto per la lettura:
-
+
La cartella di destinazione assegnata non esiste e NON può essere creata:
-
+
La directory di destinazione assegnata è di SOLA LETTURA:
La directory di destinazione assegnata NON è scrivibile:
-
+
Nome File Sconosciuto
-
+
Titolo Sconosciuto
-
+
Artista Sconosciuto
-
+
Album Sconosciuto
-
+
Commento Sconosciuto
-
+
Analisi in corso
-
+
ATTENZIONE: Il file decodificato eccede i 4 GB, potrebbero verificarsi problemi!
-
+
Saltato.
-
+
Il file di destinazione esiste già, questo file verrà saltato:
-
+
Se non vuoi saltare i file esistenti, cambia la modalità di sovrascrittura!
-
+
Il file di destinazione esiste già, il file esistente verrà eliminato:
-
+
Impossibile eliminare il file di destinazione esistente, il file verrà salvato con un altro nome!
@@ -3479,12 +3479,12 @@
ShellIntegration
-
+
File Audio supportato da LameXP
-
+
Converti il file con LameXP v%1
diff --git a/etc/Translation/LameXP_KR.ts b/etc/Translation/LameXP_KR.ts
index 5aa0b95f..fcf42799 100644
--- a/etc/Translation/LameXP_KR.ts
+++ b/etc/Translation/LameXP_KR.ts
@@ -2980,143 +2980,143 @@
ProcessThread
-
+
시작 중...
-
+
찾을 수 없음!
-
+
이 파일은 지원되지 않는 파일 형식입니다:
-
+
컨테이너 형식:
-
+
오디오 형식:
-
+
지원하지 않습니다!
-
+
완료.
-
+
취소됨!
-
+
실패됨!
-
+
인코딩
-
+
필터링
-
+
디코딩
-
+
원본 오디오 파일을 찾을 수 없음:
-
+
원본 오디오 파일을 열 수 없음:
-
+
대상 출력 디렉터리가 존재하지 않으며, 만들 수 없습니다:
-
+
대상 출력 디렉터리에 쓰기 불가:
-
+
알수 없는 파일명
-
+
알수 없는 제목
-
+
알수 없는 가수
-
+
알수 없는 앨범
-
+
알수 없는 설명
-
+
검토 중
-
+
알림: 디코드 파일 크기가 4GB 초과, 문제가 발생할 수 있습니다!
-
+
건너뜀.
-
+
대상 출력 파일이 이미 존재합니다. 건너뛰기할 파일:
-
+
기존 파일을 건너뛰기하지 않으려면, 덮어쓰기 방식을 변경하시기 바랍니다!
-
+
대상 출력 파일이 이미 존재합니다. 건너뛰기할 파일:
-
+
기존 대상 파일 삭제 실패. 다른 파일명으로 저장됩니다!
@@ -3392,12 +3392,12 @@
ShellIntegration
-
+
LameXP에서 지원되는 오디오 파일
-
+
이 파일을 LameXP v%1(으)로 변환
diff --git a/etc/Translation/LameXP_PL.ts b/etc/Translation/LameXP_PL.ts
index 14d6dc5f..2a47665e 100644
--- a/etc/Translation/LameXP_PL.ts
+++ b/etc/Translation/LameXP_PL.ts
@@ -2997,143 +2997,143 @@
ProcessThread
-
+
Rozpoczynanie...
-
+
Pominięto.
-
+
Nie znaleziono!
-
+
UWAGA: Plik po zdekodowaniu przekracza 4 GB, mogą wystąpić problemy!
-
+
Format tego pliku NIE jest obsługiwany:
-
+
Format kontenera:
-
+
Format dźwięku:
-
+
Nieobsługiwany!
-
+
Zrobione.
-
+
Przerwano!
-
+
Niepowodzenie!
-
+
Kompresowanie
-
+
Analizowanie
-
+
Filtrowanie
-
+
Dekodowanie
-
+
Źródłowy plik dźwiękowy nie został odnaleziony:
-
+
Źródłowy plik dźwiękowy nie mógł zostać otworzony:
-
+
Lokalizacja docelowa nie istnieje lu NIE mogła zostać utworzona:
-
+
Nie można zapisać do lokalizacji docelowej:
-
+
Nieznana nazwa pliku
-
+
Nieznany Tytuł
-
+
Nieznany Artysta
-
+
Nieznany Album
-
+
Nieznany Komentarz
-
+
Plik wynikowy już istnieje, zostanie pominięty plik:
-
+
Jeśli nie chcesz aby istniejące pliki były pomijane, zmień tryb nadpisywania!
-
+
Plik wynikowy już istnieje, zostanie usunięty plik:
-
+
Usuwanie istniejącego pliku zakończone niepowodzeniem, nowy plik zostanie zapisany pod inną nazwą!
@@ -3429,12 +3429,12 @@
ShellIntegration
-
+
Pliki dźwiękowe wspierane przez LameXP
-
+
Kompresuj ten plik z LameXP v%1
diff --git a/etc/Translation/LameXP_RU.ts b/etc/Translation/LameXP_RU.ts
index 82f35db2..1e8b93b9 100644
--- a/etc/Translation/LameXP_RU.ts
+++ b/etc/Translation/LameXP_RU.ts
@@ -3004,143 +3004,143 @@
ProcessThread
-
+
Начинаю...
-
+
Не найдено!
-
+
Этот тип файлов не поддерживается:
-
+
Формат Контейнера:
-
+
Формат Аудио:
-
+
Неподдерживается!
-
+
Готово.
-
+
Прервано!
-
+
Ошибка!
-
+
Кодирование
-
+
Фильтрация
-
+
Декодирование
-
+
Исходный аудио файл не найден:
-
+
Исходный аудио файл не может быть открыт:
-
+
Папка для выходных файлов не существует и не может быть создана:
-
+
Папка для выходных файлов недоступна для записи:
-
+
Неизвестное имя файла
-
+
Неизвестное Название
-
+
Неизвестный Артист
-
+
Неизвестный Альбом
-
+
Неизвестный Комментарий
-
+
Анализ
-
+
ВНИМАНИЕ: декодированный файл больше 4 ГБ, возможны проблемы!
-
+
Пропущен.
-
+
Файл уже существует, будет пропущен:
-
+
Если Вы не хотите пропускать уже существующие файлы, пожалуйста, измените режим перезаписи!
-
+
Файл уже существует, будет удалён:
-
+
Ошибка удаления существующего файла, будет сохранение с другим именем!
@@ -3436,12 +3436,12 @@
ShellIntegration
-
+
Аудио файл, поддерживаемый LameXP
-
+
Конвертировать этот файл, используя LameXP v%1
diff --git a/etc/Translation/LameXP_SV.ts b/etc/Translation/LameXP_SV.ts
index a065457b..ed02bd09 100644
--- a/etc/Translation/LameXP_SV.ts
+++ b/etc/Translation/LameXP_SV.ts
@@ -2989,144 +2989,144 @@
ProcessThread
-
+
Startar...
-
+
Överhoppad.
-
+
Hittas ej!
-
+
VARNING! Omkodad filstorlek överstiger 4 GB. Problem kan uppstå!
-
+
Det här filformatet saknar stöd i LameXP:
-
+
Behållarformat:
-
+
Ljudformat:
-
+
Stöd saknas!
-
+
Avbruten!
-
+
Klar.
-
+
Misslyckades!
-
+
Kodar
-
+
Analyserar
-
+
Filtrerar
-
+
Avkodar
-
+
Källfilen kan inte hittas:
-
+
Källfilen kan inte öppnas för läsning:
-
+
Målmappen finns inte och kan inte skapas:
-
+
Målmappen är INTE skrivbar:
-
+
Okänt filnamn
-
+
Okänd titel
-
+
Okänd artist
-
+
Okänt album
-
+
Okänd kommentar
-
+
Målfilen finns redan! Den här filen hoppas över:
-
+
Om du inte vill att befintliga filer hoppas över, måste du ändra överskrivningsläge!
-
+
Målfilen finns redan! Befintlig fil kommer att tas bort:
-
+
Kunde inte ta bort befintlig målfil. Sparar med annat filnamn!
@@ -3412,12 +3412,12 @@
ShellIntegration
-
+
Ljudfilen stöds av LameXP
-
+
Konvertera denna fil med LameXP v%1
diff --git a/etc/Translation/LameXP_TW.ts b/etc/Translation/LameXP_TW.ts
index e6d67c09..94f714d4 100644
--- a/etc/Translation/LameXP_TW.ts
+++ b/etc/Translation/LameXP_TW.ts
@@ -2980,143 +2980,143 @@
ProcessThread
-
+
正在啟動...
-
+
找不到!
-
+
此文件的格式不受支持:
-
+
容器格式:
-
+
音頻格式:
-
+
不受支持!
-
+
完成.
-
+
中止!
-
+
失敗!
-
+
編碼
-
+
過濾
-
+
解碼
-
+
找不到源音頻文件:
-
+
無法打開源音頻文件進行讀取:
-
+
目標輸出目錄不存在,無法創建:
-
+
目標輸出目錄不是可寫:
-
+
未知文件名稱
-
+
未知標題
-
+
未知藝術家
-
+
未知專輯
-
+
未知評論
-
+
分析
-
+
警告: 解碼文件大小超過4GB, 可能會出現問題!
-
+
跳過.
-
+
目標輸出文件已經存在, 將跳過此文件:
-
+
如果你不希望被跳過已存在的文件, 請更改覆蓋模式!
-
+
目標輸出文件已經存在, 要刪除現有的文件:
-
+
無法刪除現有目標文件, 將保存到另一個文件名!
@@ -3392,12 +3392,12 @@
ShellIntegration
-
+
LameXP支持的音頻文件
-
+
轉換此文件與LameXP v%1
diff --git a/etc/Translation/LameXP_UK.ts b/etc/Translation/LameXP_UK.ts
index a9363f62..da25417a 100644
--- a/etc/Translation/LameXP_UK.ts
+++ b/etc/Translation/LameXP_UK.ts
@@ -2997,143 +2997,143 @@
ProcessThread
-
+
Починається обробка...
-
+
Не знайдено!
-
+
Формат даного файла НЕ підтримуєтья:
-
+
Формат контейнера:
-
+
Формат аудіо:
-
+
Не підтримується!
-
+
Виконано.
-
+
Перервано!
-
+
Збій!
-
+
Кодування
-
+
Фільтрування
-
+
Декодування
-
+
Неможливо знайти вхідний файл аудіо:
-
+
Неможливо відкрити для читання вхідний файл аудіо:
-
+
Вихідної теки не існує і її неможливо створити:
-
+
До вихідної теки неможливо проводити запис:
-
+
Невідома назва файла
-
+
Невідомий заголовок
-
+
Невідомий виконавець
-
+
Невідомий альбом
-
+
Невідомий коментар
-
+
Аналізування
-
+
ПОПЕРЕДЖЕННЯ: Розмір декодованного файла перевищує 4 ГБ, можуть виникнути проблеми!
-
+
Пропущено.
-
+
Вихідний цільовий файл вже існує, спроба пропустити цей файл:
-
+
Якщо ви не хочете, щоб існуючі файли були пропущені, будь ласка, змініть режим перезапису!
-
+
Вихідний цільовий файл вже існує, спроба видалити існуючий файл:
-
+
Неможливо видалити існуючий файл, збереження буде проведено до файла з іншою назвою!
@@ -3429,12 +3429,12 @@
ShellIntegration
-
+
Аудіофайл, що підтримується LameXP
-
+
Конвертувати файл за допомогою LameXP v%1
diff --git a/etc/Translation/LameXP_ZH.ts b/etc/Translation/LameXP_ZH.ts
index 80eba518..246c1915 100644
--- a/etc/Translation/LameXP_ZH.ts
+++ b/etc/Translation/LameXP_ZH.ts
@@ -2980,143 +2980,143 @@
ProcessThread
-
+
正在启动...
-
+
未找到!
-
+
此文件的格式不受支持:
-
+
容器格式:
-
+
音频格式:
-
+
不支持!
-
+
完成。
-
+
中止!
-
+
失败!
-
+
编码
-
+
过滤
-
+
解码
-
+
找不到源音频文件:
-
+
无法打开源音频文件进行读取:
-
+
目标输出目录不存在且无法创建:
-
+
目标输出目录不可写:
-
+
未知文件名称
-
+
未知标题
-
+
未知艺术家
-
+
未知专辑
-
+
未知注释
-
+
分析
-
+
警告: 解码文件大小超过4GB, 可能会出现问题!
-
+
跳过。
-
+
目标输出文件已经存在, 将跳过此文件:
-
+
如果你不希望跳过已存在的文件, 请更改覆盖模式!
-
+
目标输出文件已经存在, 将删除现有的文件:
-
+
无法删除现有目标文件, 将保存为另一个文件名!
@@ -3392,12 +3392,12 @@
ShellIntegration
-
+
LameXP支持的音频文件
-
+
用LameXP v%1转换此文件
diff --git a/res/tools/sox.avx.exe b/res/tools/sox.avx.exe
index 8f47f629..9cf7c8a1 100644
Binary files a/res/tools/sox.avx.exe and b/res/tools/sox.avx.exe differ
diff --git a/res/tools/sox.i386.exe b/res/tools/sox.i386.exe
index 4e721306..cda3c0b4 100644
Binary files a/res/tools/sox.i386.exe and b/res/tools/sox.i386.exe differ
diff --git a/res/tools/sox.sse2.exe b/res/tools/sox.sse2.exe
index 968829dd..f0e75a6a 100644
Binary files a/res/tools/sox.sse2.exe and b/res/tools/sox.sse2.exe differ
diff --git a/src/Config.h b/src/Config.h
index a63819c1..b2f695b3 100644
--- a/src/Config.h
+++ b/src/Config.h
@@ -35,7 +35,7 @@
#define VER_LAMEXP_MINOR_LO 5
#define VER_LAMEXP_TYPE Beta
#define VER_LAMEXP_PATCH 4
-#define VER_LAMEXP_BUILD 1982
+#define VER_LAMEXP_BUILD 1984
#define VER_LAMEXP_CONFG 1934
///////////////////////////////////////////////////////////////////////////////
diff --git a/src/Dialog_SplashScreen.cpp b/src/Dialog_SplashScreen.cpp
index 9f30ba51..22445fa4 100644
--- a/src/Dialog_SplashScreen.cpp
+++ b/src/Dialog_SplashScreen.cpp
@@ -45,12 +45,10 @@
//Setup taskbar indicator
#define SET_TASKBAR_STATE(WIDGET,FLAG) do \
{ \
- if((WIDGET)->m_taskBarFlag != (FLAG)) \
+ const int _oldFlag = (WIDGET)->m_taskBarFlag.fetchAndStoreOrdered((FLAG) ? 1 : 0); \
+ if(_oldFlag != ((FLAG) ? 1 : 0)) \
{ \
- if((WIDGET)->m_taskbar->setTaskbarState((FLAG) ? MUtils::Taskbar7::TASKBAR_STATE_INTERMEDIATE : MUtils::Taskbar7::TASKBAR_STATE_NONE)) \
- { \
- (WIDGET)->m_taskBarFlag = (FLAG); \
- } \
+ (WIDGET)->m_taskbar->setTaskbarState((FLAG) ? MUtils::Taskbar7::TASKBAR_STATE_INTERMEDIATE : MUtils::Taskbar7::TASKBAR_STATE_NONE); \
} \
} \
while(0)
@@ -96,10 +94,8 @@ SplashScreen::SplashScreen(QWidget *parent)
m_working->start();
//Init status
- m_canClose = false;
m_status = STATUS_FADE_IN;
m_fadeValue = 0;
- m_taskBarFlag = false;
}
////////////////////////////////////////////////////////////
@@ -165,7 +161,7 @@ void SplashScreen::showSplash(QThread *thread)
QApplication::restoreOverrideCursor();
//Hide splash
- splashScreen->m_canClose = true;
+ splashScreen->m_canClose.ref();
splashScreen->close();
}
diff --git a/src/Dialog_SplashScreen.h b/src/Dialog_SplashScreen.h
index 70e85557..a425642d 100644
--- a/src/Dialog_SplashScreen.h
+++ b/src/Dialog_SplashScreen.h
@@ -72,8 +72,8 @@ private:
unsigned int m_status;
unsigned int m_fadeValue;
- volatile bool m_canClose;
- volatile bool m_taskBarFlag;
+ QAtomicInt m_canClose;
+ QAtomicInt m_taskBarFlag;
private slots:
void updateHandler(void);
diff --git a/src/ShellIntegration.cpp b/src/ShellIntegration.cpp
index cf6a5bfd..6b256c85 100644
--- a/src/ShellIntegration.cpp
+++ b/src/ShellIntegration.cpp
@@ -46,16 +46,13 @@
static const char *g_lamexpShellAction = "ConvertWithLameXP";
static const char *g_lamexpFileType = "LameXP.SupportedAudioFile";
-//Mutex
-QMutex ShellIntegration::m_mutex;
-
//State values
static const int STATE_ENABLED = 1;
static const int STATE_UNKNOWN = 0;
static const int STATE_DISABLD = -1;
//State
-volatile int ShellIntegration::m_state = STATE_UNKNOWN;
+QAtomicInt ShellIntegration::m_state(STATE_UNKNOWN);
//Macros
#define REG_WRITE_STRING(KEY, STR) RegSetValueEx(key, NULL, NULL, REG_SZ, reinterpret_cast(STR.utf16()), (STR.size() + 1) * sizeof(wchar_t))
@@ -81,12 +78,10 @@ void ShellIntegration::install(bool async)
QFuture(QtConcurrent::run(install, false));
return;
}
-
- //Serialize
- QMutexLocker lock(&m_mutex);
-
+
//Checking
- if(m_state == STATE_ENABLED)
+ const int originalState = m_state.fetchAndStoreOrdered(STATE_ENABLED);
+ if(originalState == STATE_ENABLED)
{
return; /*already enabled, don't enable again!*/
}
@@ -106,6 +101,7 @@ void ShellIntegration::install(bool async)
ok[3] = MUtils::Registry::reg_value_write(MUtils::Registry::root_user, QString("Software\\Classes\\%1\\shell\\%2\\command").arg(lamexpFileType, lamexpShellAction), QString(), lamexpShellCommand);
if(!(ok[0] && ok[1] && ok[2] && ok[3]))
{
+ m_state.fetchAndStoreOrdered(originalState);
qWarning("Failed to register the LameXP file type!");
return;
}
@@ -123,7 +119,6 @@ void ShellIntegration::install(bool async)
//Shell notification
MUtils::OS::shell_change_notification();
- m_state = STATE_ENABLED;
}
void ShellIntegration::remove(bool async)
@@ -134,12 +129,10 @@ void ShellIntegration::remove(bool async)
QFuture(QtConcurrent::run(remove, false));
return;
}
-
- //Serialize
- QMutexLocker lock(&m_mutex);
//Checking
- if(m_state == STATE_DISABLD)
+ const int originalState = m_state.fetchAndStoreOrdered(STATE_DISABLD);
+ if(originalState == STATE_DISABLD)
{
return; /*already enabled, don't enable again!*/
}
@@ -154,6 +147,7 @@ void ShellIntegration::remove(bool async)
//Find all registered file types
if(!MUtils::Registry::reg_enum_subkeys(MUtils::Registry::root_user, "Software\\Classes", fileTypes))
{
+ m_state.fetchAndStoreOrdered(originalState);
qWarning("Failed to enumerate file types!");
return;
}
@@ -195,7 +189,6 @@ void ShellIntegration::remove(bool async)
//Shell notification
MUtils::OS::shell_change_notification();
- m_state = STATE_DISABLD;
}
////////////////////////////////////////////////////////////
diff --git a/src/ShellIntegration.h b/src/ShellIntegration.h
index 578d03ab..2e77c21a 100644
--- a/src/ShellIntegration.h
+++ b/src/ShellIntegration.h
@@ -34,12 +34,11 @@ class ShellIntegration : public QObject
public:
static void install(bool async = true);
- static void remove(bool async = true);
+ static void remove (bool async = true);
private:
ShellIntegration(void);
static void initializeTypes(const QString &lamexpFileType, const QString &lamexpShellAction, QStringList &nativeTypes);
- static QMutex m_mutex;
- static volatile int m_state;
+ static QAtomicInt m_state;
};
diff --git a/src/Thread_CueSplitter.cpp b/src/Thread_CueSplitter.cpp
index 8c3cf9f7..b3497289 100644
--- a/src/Thread_CueSplitter.cpp
+++ b/src/Thread_CueSplitter.cpp
@@ -47,9 +47,6 @@
#include
#include
-//Utils
-#define IS_ABORTED (!(!m_abortFlag))
-
////////////////////////////////////////////////////////////
// Constructor
////////////////////////////////////////////////////////////
@@ -156,7 +153,7 @@ void CueSplitter::run()
m_decompressedFiles.insert(inputFileList.at(i), inputFileList.at(i));
}
- if(IS_ABORTED)
+ if(MUTILS_BOOLIFY(m_abortFlag))
{
m_bAborted = true;
qWarning("The user has requested to abort the process!");
@@ -221,7 +218,7 @@ void CueSplitter::run()
splitFile(outputFile, trackNo, trackFile, trackOffset, trackLength, trackMetaInfo, nTracksComplete);
emit progressValChanged(nTracksComplete += 10);
- if(IS_ABORTED)
+ if(MUTILS_BOOLIFY(m_abortFlag))
{
m_bAborted = true;
qWarning("The user has requested to abort the process!");
@@ -322,7 +319,7 @@ void CueSplitter::splitFile(const QString &output, const int trackNo, const QStr
while(process.state() != QProcess::NotRunning)
{
- if(IS_ABORTED)
+ if(MUTILS_BOOLIFY(m_abortFlag))
{
process.kill();
qWarning("Process was aborted on user request!");
diff --git a/src/Thread_FileAnalyzer.cpp b/src/Thread_FileAnalyzer.cpp
index 97a4e8e0..2bc4ed45 100644
--- a/src/Thread_FileAnalyzer.cpp
+++ b/src/Thread_FileAnalyzer.cpp
@@ -56,9 +56,6 @@ static inline void SAFE_APPEND_STRING(QStringList &list, const QString &str)
}
}
-//Utils
-#define IS_ABORTED (!(!m_bAborted))
-
////////////////////////////////////////////////////////////
// Constructor
////////////////////////////////////////////////////////////
@@ -207,7 +204,7 @@ void FileAnalyzer::run()
m_pool->waitForDone();
//Was opertaion aborted?
- if(IS_ABORTED)
+ if(MUTILS_BOOLIFY(m_bAborted))
{
qWarning("Operation cancelled by user!");
return;
@@ -238,7 +235,7 @@ void FileAnalyzer::run()
bool FileAnalyzer::analyzeNextFile(void)
{
- if(!(m_inputFiles.isEmpty() || IS_ABORTED))
+ if(!(m_inputFiles.isEmpty() || MUTILS_BOOLIFY(m_bAborted)))
{
const unsigned int taskId = m_tasksCounterNext++;
const QString currentFile = QDir::fromNativeSeparators(m_inputFiles.takeFirst());
diff --git a/src/Thread_FileAnalyzer.h b/src/Thread_FileAnalyzer.h
index 652a0cfc..40884810 100644
--- a/src/Thread_FileAnalyzer.h
+++ b/src/Thread_FileAnalyzer.h
@@ -22,7 +22,7 @@
#pragma once
-//#include "Model_AudioFile.h"
+#include
#include
#include
@@ -49,7 +49,7 @@ public:
FileAnalyzer(const QStringList &inputFiles);
~FileAnalyzer(void);
void run();
- bool getSuccess(void) { return (!isRunning()) && (!m_bAborted) && (!(!m_bSuccess)); }
+ bool getSuccess(void) { return (!isRunning()) && (!m_bAborted) && MUTILS_BOOLIFY(m_bSuccess); }
unsigned int filesAccepted(void);
unsigned int filesRejected(void);
diff --git a/src/Thread_FileAnalyzer_Task.cpp b/src/Thread_FileAnalyzer_Task.cpp
index 82b39975..c9aca4c7 100644
--- a/src/Thread_FileAnalyzer_Task.cpp
+++ b/src/Thread_FileAnalyzer_Task.cpp
@@ -54,7 +54,6 @@
#define IS_KEY(KEY) (key.compare(KEY, Qt::CaseInsensitive) == 0)
#define IS_SEC(SEC) (key.startsWith((SEC "_"), Qt::CaseInsensitive))
#define FIRST_TOK(STR) (STR.split(" ", QString::SkipEmptyParts).first())
-#define IS_ABORTED (!(!m_abortFlag))
////////////////////////////////////////////////////////////
// Constructor
@@ -110,7 +109,7 @@ void AnalyzeTask::run_ex(void)
AudioFileModel file = analyzeFile(currentFile, &fileType);
- if(IS_ABORTED)
+ if(MUTILS_BOOLIFY(m_abortFlag))
{
qWarning("Operation cancelled by user!");
return;
@@ -204,7 +203,7 @@ const AudioFileModel AnalyzeTask::analyzeFile(const QString &filePath, int *type
while(process.state() != QProcess::NotRunning)
{
- if(IS_ABORTED)
+ if(MUTILS_BOOLIFY(m_abortFlag))
{
process.kill();
qWarning("Process was aborted on user request!");
@@ -531,7 +530,7 @@ bool AnalyzeTask::analyzeAvisynthFile(const QString &filePath, AudioFileModel &i
while(process.state() != QProcess::NotRunning)
{
- if(IS_ABORTED)
+ if(MUTILS_BOOLIFY(m_abortFlag))
{
process.kill();
qWarning("Process was aborted on user request!");
diff --git a/src/Thread_Initialization.cpp b/src/Thread_Initialization.cpp
index a3dd6abd..841457e6 100644
--- a/src/Thread_Initialization.cpp
+++ b/src/Thread_Initialization.cpp
@@ -104,23 +104,19 @@ public:
{
}
- static void clearFlags(QMutexLocker &lock = QMutexLocker(&s_mutex))
+ static void clearFlags(void)
{
- s_bExcept = false;
+ s_exception.fetchAndStoreOrdered(0);
s_errMsg[0] = char(0);
}
static bool getExcept(void)
{
- bool ret;
- QMutexLocker lock(&s_mutex);
- ret = s_bExcept;
- return ret;
+ return MUTILS_BOOLIFY(s_exception);
}
static bool getErrMsg(char *buffer, const size_t buffSize)
{
- QMutexLocker lock(&s_mutex);
if(s_errMsg[0])
{
strncpy_s(buffer, BUFF_SIZE, s_errMsg, _TRUNCATE);
@@ -140,36 +136,28 @@ protected:
}
catch(const std::exception &e)
{
- QMutexLocker lock(&s_mutex);
- if(!s_bExcept)
+ if(!s_exception.fetchAndAddOrdered(1))
{
- s_bExcept = true;
strncpy_s(s_errMsg, BUFF_SIZE, e.what(), _TRUNCATE);
}
- lock.unlock();
qWarning("OptionalInitTask exception error:\n%s\n\n", e.what());
}
catch(...)
{
- QMutexLocker lock(&s_mutex);
- if(!s_bExcept)
+ if (!s_exception.fetchAndAddOrdered(1))
{
- s_bExcept = true;
strncpy_s(s_errMsg, BUFF_SIZE, "Unknown exception error!", _TRUNCATE);
}
- lock.unlock();
qWarning("OptionalInitTask encountered an unknown exception!");
}
}
- static volatile bool s_bExcept;
- static QMutex s_mutex;
+ static QAtomicInt s_exception;
static char s_errMsg[BUFF_SIZE];
};
-QMutex BaseTask::s_mutex;
char BaseTask::s_errMsg[BUFF_SIZE] = {'\0'};
-volatile bool BaseTask::s_bExcept = false;
+QAtomicInt BaseTask::s_exception(0);
////////////////////////////////////////////////////////////
// ExtractorTask class
@@ -197,17 +185,13 @@ public:
static bool getCustom(void)
{
- bool ret;
- QMutexLocker lock(&s_mutex);
- ret = s_bCustom;
- return ret;
+ return MUTILS_BOOLIFY(s_custom);
}
static void clearFlags(void)
{
- QMutexLocker lock(&s_mutex);
- s_bCustom = false;
- BaseTask::clearFlags(lock);
+ BaseTask::clearFlags();
+ s_custom.fetchAndStoreOrdered(0);
}
protected:
@@ -229,7 +213,7 @@ protected:
try
{
lockedFile.reset(new LockedFile(customTool.canonicalFilePath()));
- version = UINT_MAX; s_bCustom = true;
+ version = UINT_MAX; s_custom.ref();
}
catch(std::runtime_error&)
{
@@ -268,7 +252,7 @@ protected:
}
private:
- static volatile bool s_bCustom;
+ static QAtomicInt s_custom;
QScopedPointer m_toolResource;
const QDir m_appDir;
const QString m_tempPath;
@@ -278,7 +262,7 @@ private:
const QString m_toolTag;
};
-volatile bool ExtractorTask::s_bCustom = false;
+QAtomicInt ExtractorTask::s_custom = false;
////////////////////////////////////////////////////////////
// InitAacEncTask class
diff --git a/src/Thread_MessageHandler.cpp b/src/Thread_MessageHandler.cpp
index 16b00a4d..0088435e 100644
--- a/src/Thread_MessageHandler.cpp
+++ b/src/Thread_MessageHandler.cpp
@@ -47,7 +47,6 @@ MessageHandlerThread::MessageHandlerThread(MUtils::IPCChannel *const ipcChannel)
:
m_ipcChannel(ipcChannel)
{
- m_aborted = false;
}
MessageHandlerThread::~MessageHandlerThread(void)
@@ -56,7 +55,6 @@ MessageHandlerThread::~MessageHandlerThread(void)
void MessageHandlerThread::run()
{
- m_aborted = false;
setTerminationEnabled(true);
QStringList params;
quint32 command = 0, flags = 0;
@@ -109,7 +107,7 @@ void MessageHandlerThread::stop(void)
{
if(!m_aborted)
{
- m_aborted = true;
+ m_aborted.ref();
m_ipcChannel->send(0, 0, QStringList());
}
}
diff --git a/src/Thread_MessageHandler.h b/src/Thread_MessageHandler.h
index 7e8fe8e2..81dbc8a1 100644
--- a/src/Thread_MessageHandler.h
+++ b/src/Thread_MessageHandler.h
@@ -43,7 +43,7 @@ protected:
MUtils::IPCChannel *const m_ipcChannel;
private:
- volatile bool m_aborted;
+ QAtomicInt m_aborted;
signals:
void otherInstanceDetected(void);
diff --git a/src/Thread_Process.cpp b/src/Thread_Process.cpp
index 10e2b57d..10ca521d 100644
--- a/src/Thread_Process.cpp
+++ b/src/Thread_Process.cpp
@@ -56,7 +56,6 @@
#define DIFF(X,Y) ((X > Y) ? (X-Y) : (Y-X))
#define IS_WAVE(X) ((X.containerType().compare("Wave", Qt::CaseInsensitive) == 0) && (X.audioType().compare("PCM", Qt::CaseInsensitive) == 0))
-#define IS_ABORTED (!(!m_aborted))
#define STRDEF(STR,DEF) ((!STR.isEmpty()) ? STR : DEF)
////////////////////////////////////////////////////////////
@@ -324,7 +323,7 @@ void ProcessThread::processFile()
}
//Clean-up
- if((!bSuccess) || IS_ABORTED)
+ if((!bSuccess) || MUTILS_BOOLIFY(m_aborted))
{
QFileInfo fileInfo(m_outFileName);
if(fileInfo.exists() && (fileInfo.size() < 1024))
@@ -352,7 +351,7 @@ void ProcessThread::processFile()
MUtils::OS::sleep_ms(12);
//Report result
- emit processStateChanged(m_jobId, (IS_ABORTED ? tr("Aborted!") : (bSuccess ? tr("Done.") : tr("Failed!"))), ((bSuccess && (!m_aborted)) ? ProgressModel::JobComplete : ProgressModel::JobFailed));
+ emit processStateChanged(m_jobId, (MUTILS_BOOLIFY(m_aborted) ? tr("Aborted!") : (bSuccess ? tr("Done.") : tr("Failed!"))), ((bSuccess && (!m_aborted)) ? ProgressModel::JobComplete : ProgressModel::JobFailed));
emit processStateFinished(m_jobId, m_outFileName, (bSuccess ? 1 : 0));
qDebug("Process thread is done.");
diff --git a/src/Tool_Abstract.h b/src/Tool_Abstract.h
index da6dab27..1b8650f3 100644
--- a/src/Tool_Abstract.h
+++ b/src/Tool_Abstract.h
@@ -22,6 +22,7 @@
#pragma once
+#include
#include
class QMutex;
@@ -53,7 +54,7 @@ protected:
static __forceinline bool checkFlag(QAtomicInt &flag)
{
- return (!(!flag));
+ return MUTILS_BOOLIFY(flag);
}
private:
diff --git a/src/Tools.h b/src/Tools.h
index 7b4fd751..667b0d51 100644
--- a/src/Tools.h
+++ b/src/Tools.h
@@ -106,9 +106,9 @@ g_lamexp_tools[] =
{"37745174e146fedbc62671ab86ffddd3edfc9aa0ebfcfd4bff3331a95b6dda50621478c63f7a0ddf9a365e916758b6d4", CPU_TYPE_X86_ALL, "refalac.i386.exe", 161, ""},
{"b368f0490cefb80b6ff7eaaf8d6e29f253442375caf11a9405b5b21580ee3a9739fa3f406f69de5ef344fa038b1cbe72", CPU_TYPE_X64_ALL, "refalac.x64.exe", 161, ""},
{"d041b60de6c5c6e77cbad84440db57bbeb021af59dd0f7bebd3ede047d9e2ddc2a0c14179472687ba91063743d23e337", CPU_TYPE_ALL_ALL, "shorten.exe", 361, ""},
- {"2074242cde223a43f86a1efc0f1d2d3dc0a7ecc0de2e8be547f4cd35f574aaf06086eec00b8822264f71f041f6f59c58", CPU_TYPE_ALL_GEN, "sox.i386.exe", 1442, ""},
- {"644ef3a3faf572ef6ddabd67e133c45961083919a9f4933b2980d27b25f9c0b6e4ad2b5c7d518fb60e082c48cb45791f", CPU_TYPE_ALL_SSE, "sox.sse2.exe", 1442, "" },
- {"d4bfa9b155735569ece1b229a1b04d93cb76a4e0dd91d5a50b84ebdad20a4bd72926b84a5d15533137feecce606492e3", CPU_TYPE_ALL_AVX, "sox.avx.exe", 1442, "" },
+ {"3206ebd1b1c6e5db422d7a84117a7ba8256208fc7104a6668d8856c1b6407882f25f1f39e37c8e33affb343300937d2e", CPU_TYPE_ALL_GEN, "sox.i386.exe", 1442, ""},
+ {"16a71940aa5e9b393e83cdfb2a4dda4291ea01858f8ba338510013f25f4d7c53b9b5cffb86404ea49ef28e6795182fd5", CPU_TYPE_ALL_SSE, "sox.sse2.exe", 1442, "" },
+ {"25585ca9e2e025d82d93341a9db8527eb0b4ce451dade607f9784a79ed30e050ced0824835d5467aa0bf0c6b8fe08612", CPU_TYPE_ALL_AVX, "sox.avx.exe", 1442, "" },
{"5a4261e1b41a59d1a5bc92e1d2766422a67454d77e06ea29af392811b7b4704e0f3e494ab9cb6375ce9e39257867c5ed", CPU_TYPE_ALL_ALL, "speexdec.exe", 12, ""},
{"75d4c18dbb74e2dbf7342698428248d45cc4070d5f95da8831ef755e63dcd7ff9c3a760f289e8ef8b5c06b82548edbd8", CPU_TYPE_ALL_ALL, "tag.exe", 100, ""},
{"a83628880da0b7519ec368a74a92da5a5099d8d46aa0583131f92d7321f47c9e16a1841b2a3fb8ffcca7205ef4b1bb0a", CPU_TYPE_ALL_ALL, "tta.exe", 21, ""},