aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/General/rgscan/rgscanner.cpp
blob: e1311bd97ea1e3e886bb1072123e45b3af2a4669 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
/***************************************************************************
 *   Copyright (C) 2013-2018 by Ilya Kotov                                 *
 *   forkotov02@ya.ru                                                      *
 *                                                                         *
 *   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.         *
 ***************************************************************************/

#include <QStringList>
#include <math.h>
#include <qmmp/inputsourcefactory.h>
#include <qmmp/decoderfactory.h>
#include <qmmp/audioconverter.h>
#include "rgscanner.h"

#define BUFFER_FRAMES 4096

RGScanner::RGScanner()
{
    m_gain = 0.;
    m_peak = 0.;
    m_user_stop = false;
    m_is_running = false;
    m_is_pending = false;
    m_has_values = false;
    m_handle = 0;
    m_decoder = 0;
    m_source = 0;
}

RGScanner::~RGScanner()
{
    stop();
    deinit();
    if(m_handle)
    {
        DeinitGainAnalysis(m_handle);
        m_handle = 0;
    }
}

bool RGScanner::prepare(const QString &url)
{
    m_is_pending = false;
    deinit();
    m_url = url;
    QString name = m_url.section("/", -1);
    InputSource *source = InputSource::create(url, 0);
    if(!source->initialize())
    {
        delete source;
        qWarning("RGScanner: Invalid url");
        return false;
    }

    if(source->ioDevice() && !source->ioDevice()->open(QIODevice::ReadOnly))
    {
        qWarning("RGScanner: [%s] unable to open input stream, error: %s",
                 qPrintable(name),
                 qPrintable(source->ioDevice()->errorString()));
        delete source;
        return false;
    }

    DecoderFactory *factory = Decoder::findByFilePath(source->path());

    if(!factory)
    {
        qWarning("RGScanner: [%s] unable to find factory", qPrintable(name));
        delete source;
        return false;
    }
    qDebug("RGScanner: [%s] selected decoder: %s",qPrintable(name),
           qPrintable(factory->properties().shortName));

    if(factory->properties().noInput && source->ioDevice())
        source->ioDevice()->close();

    Decoder *decoder = factory->create(source->path(), source->ioDevice());
    if(!decoder->initialize())
    {
        qWarning("RGScanner: [%s] invalid file format", qPrintable(name));
        delete source;
        delete decoder;
        return false;
    }
    if(decoder->audioParameters().channels() > 2)
    {
        qWarning("RGScanner: [%s] unsupported channel number: %d",
                 qPrintable(name),
                 decoder->audioParameters().channels());
        delete source;
        delete decoder;
        return false;
    }
    m_decoder = decoder;
    m_source = source;
    m_user_stop = false;
    m_has_values = false;
    m_is_pending = true;
    return true;
}

void RGScanner::stop()
{
    m_mutex.lock();
    m_user_stop = true;
    m_mutex.unlock();
}

bool RGScanner::isRunning() const
{
    return m_is_running;
}

bool RGScanner::isPending() const
{
    return m_is_pending;
}

bool RGScanner::hasValues() const
{
    return m_has_values;
}

QMap<Qmmp::ReplayGainKey, double> RGScanner::oldReplayGainInfo() const
{
    if(!m_decoder)
        return QMap<Qmmp::ReplayGainKey, double>();

    return m_decoder->replayGainInfo();
}

double RGScanner::gain() const
{
    return m_gain;
}

double RGScanner::peak() const
{
    return m_peak;
}

QString RGScanner::url() const
{
    return m_url;
}

GainHandle_t *RGScanner::handle()
{
    return m_handle;
}

void RGScanner::run()
{
    if(m_user_stop)
    {
        m_is_pending = false;
        return;
    }
    QString name = m_url.section("/", -1);
    qDebug("RGScanner: [%s] staring thread", qPrintable(name));
    m_is_running = true;
    m_is_pending = false;
    bool error = false;

    AudioParameters ap = m_decoder->audioParameters();
    AudioConverter converter;
    converter.configure(ap.format());
    //buffers
    double out_left[BUFFER_FRAMES] = {0}, out_right[BUFFER_FRAMES] = {0}; //replay gain buffers
    float float_buf[BUFFER_FRAMES*ap.channels()]; //float buffer
    qint64 buf_size = BUFFER_FRAMES*ap.frameSize();
    unsigned char char_buf[buf_size]; //char buffer


    //counters
    qint64 totalSamples = m_decoder->totalTime() * ap.sampleRate() * ap.channels() / 1000, len = 0;
    quint64 sample_counter = 0;
    quint64 samples = 0;
    double max = 0;

    if(m_handle)
        DeinitGainAnalysis(m_handle);
    InitGainAnalysis(&m_handle, ap.sampleRate());

    forever
    {
        len = m_decoder->read(char_buf, buf_size);

        if(len < 0)
        {
            error = true;
            break;
        }
        else if(len == 0)
            break;

        samples = len / ap.sampleSize();

        converter.toFloat(char_buf, float_buf, samples);

        if(ap.channels() == 2)
        {
            for(uint i = 0; i < (samples >> 1); ++i)
            {
                out_left[i] = float_buf[i*2]*32768.0;
                out_right[i] = float_buf[i*2+1]*32768.0;
                max = qMax(fabs(out_left[i]), max);
                max = qMax(fabs(out_right[i]), max);
            }
        }
        else if(ap.channels() == 1)
        {
            for(uint i = 0; i < samples; ++i)
            {
                out_left[i] = float_buf[i]*32768.0;
                max = qMax(fabs(out_left[i]), max);
            }
        }

        size_t samples_per_channel = samples >> ((ap.channels() == 2) ? 1 : 0);

        AnalyzeSamples(m_handle, out_left, out_right, samples_per_channel, ap.channels());
        sample_counter += samples;
        emit progress(100 * sample_counter / totalSamples);

        m_mutex.lock();
        if(m_user_stop)
        {
            m_mutex.unlock();
            break;
        }
        m_mutex.unlock();
    }

    if(error)
    {
        qWarning("RGScanner: [%s] finished with error", qPrintable(name));
    }
    else if(m_user_stop)
    {
        qDebug("RGScanner: [%s] stopped by user", qPrintable(name));
    }
    else
    {
        m_gain = GetTitleGain(m_handle);
        m_peak = max/32768.0;
        emit progress(100);
        qDebug("RGScanner: [%s] peak=%f, gain=%f", qPrintable(name), m_peak, m_gain);
        qDebug("RGScanner: [%s] finished with success ", qPrintable(name));
        m_has_values = true;
    }
    deinit();
    m_is_running = false;
    emit finished(m_url);
}

void RGScanner::deinit()
{
    if(m_decoder)
    {
        delete m_decoder;
        m_decoder = 0;
    }
    if(m_source)
    {
        delete m_source;
        m_source = 0;
    }
}
/a> 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="ru">
<context>
    <name>AboutDialog</name>
    <message>
        <location filename="../forms/aboutdialog.ui" line="14"/>
        <source>About Qmmp</source>
        <translation>О Qmmp</translation>
    </message>
    <message>
        <location filename="../forms/aboutdialog.ui" line="49"/>
        <source>About</source>
        <translation>О программе</translation>
    </message>
    <message>
        <location filename="../forms/aboutdialog.ui" line="63"/>
        <source>Authors</source>
        <translation>Авторы</translation>
    </message>
    <message>
        <location filename="../forms/aboutdialog.ui" line="77"/>
        <source>Translators</source>
        <translation>Переводчики</translation>
    </message>
    <message>
        <location filename="../forms/aboutdialog.ui" line="91"/>
        <source>Thanks To</source>
        <translation>Благодарности</translation>
    </message>
    <message>
        <location filename="../forms/aboutdialog.ui" line="105"/>
        <source>License Agreement</source>
        <translation>Лицензия</translation>
    </message>
    <message>
        <location filename="../aboutdialog.cpp" line="63"/>
        <source>Qt-based Multimedia Player (Qmmp)</source>
        <translation type="unfinished"></translation>
    </message>
    <message>
        <location filename="../aboutdialog.cpp" line="67"/>
        <source>Version: %1</source>
        <translation>Версия: %1</translation>
    </message>
    <message>
        <location filename="../aboutdialog.cpp" line="68"/>
        <source>Using Qt %1 (compiled with Qt %2)</source>
        <translation>Используется Qt %1 (собрано с Qt %2)</translation>
    </message>
    <message>
        <location filename="../aboutdialog.cpp" line="71"/>
        <source>(c) %1-%2 Qmmp Development Team</source>
        <translation>(с) %1-%2 Команда разработчиков Qmmp</translation>
    </message>
    <message>
        <location filename="../aboutdialog.cpp" line="76"/>
        <source>Input plugins:</source>
        <translation>Модули ввода:</translation>
    </message>
    <message>
        <location filename="../aboutdialog.cpp" line="85"/>
        <source>Output plugins:</source>
        <translation>Модули вывода:</translation>
    </message>
    <message>
        <location filename="../aboutdialog.cpp" line="94"/>
        <source>Visual plugins:</source>
        <translation>Модули визуализации:</translation>
    </message>
    <message>
        <location filename="../aboutdialog.cpp" line="103"/>
        <source>Effect plugins:</source>
        <translation>Модули эффектов:</translation>
    </message>
    <message>
        <location filename="../aboutdialog.cpp" line="112"/>
        <source>General plugins:</source>
        <translation>Общие модули:</translation>
    </message>
</context>
<context>
    <name>AddUrlDialog</name>
    <message>
        <location filename="../forms/addurldialog.ui" line="14"/>
        <source>Enter URL to add</source>
        <translation>Введите адрес для добавления</translation>
    </message>
    <message>
        <location filename="../forms/addurldialog.ui" line="46"/>
        <source>&amp;Add</source>
        <translation>&amp;Добавить</translation>
    </message>
    <message>
        <location filename="../forms/addurldialog.ui" line="53"/>
        <source>&amp;Cancel</source>
        <translation>&amp;Отмена</translation>
    </message>
    <message>
        <location filename="../addurldialog.cpp" line="124"/>
        <source>Error</source>
        <translation>Ошибка</translation>
    </message>
</context>
<context>
    <name>ColumnEditor</name>
    <message>
        <location filename="../forms/columneditor.ui" line="14"/>
        <source>Edit Column</source>
        <translation>Изменить колонку</translation>
    </message>
    <message>
        <location filename="../forms/columneditor.ui" line="36"/>
        <source>Name:</source>
        <translation>Имя:</translation>
    </message>
    <message>
        <location filename="../forms/columneditor.ui" line="76"/>
        <source>Format:</source>
        <translation>Формат:</translation>
    </message>
    <message>
        <location filename="../forms/columneditor.ui" line="64"/>
        <source>...</source>
        <translation>...</translation>
    </message>
    <message>
        <location filename="../forms/columneditor.ui" line="29"/>
        <source>Type:</source>
        <translation>Тип:</translation>
    </message>
    <message>
        <location filename="../columneditor.cpp" line="78"/>
        <location filename="../columneditor.cpp" line="100"/>
        <source>Artist</source>
        <translation>Исполнитель</translation>
    </message>
    <message>
        <location filename="../columneditor.cpp" line="79"/>
        <location filename="../columneditor.cpp" line="101"/>
        <source>Album</source>
        <translation>Альбом</translation>
    </message>
    <message>
        <location filename="../columneditor.cpp" line="81"/>
        <location filename="../columneditor.cpp" line="105"/>
        <source>Title</source>
        <translation>Название</translation>
    </message>
    <message>
        <location filename="../columneditor.cpp" line="84"/>
        <location filename="../columneditor.cpp" line="108"/>
        <source>Genre</source>
        <translation>Жанр</translation>
    </message>
    <message>
        <location filename="../columneditor.cpp" line="85"/>
        <location filename="../columneditor.cpp" line="109"/>
        <source>Comment</source>
        <translation>Комментарий</translation>
    </message>
    <message>
        <location filename="../columneditor.cpp" line="86"/>
        <location filename="../columneditor.cpp" line="110"/>
        <source>Composer</source>
        <translation>Композитор</translation>
    </message>
    <message>
        <location filename="../columneditor.cpp" line="87"/>
        <location filename="../columneditor.cpp" line="111"/>
        <source>Duration</source>
        <translation>Длительность</translation>
    </message>
    <message>
        <location filename="../columneditor.cpp" line="91"/>
        <location filename="../columneditor.cpp" line="116"/>
        <source>Year</source>
        <translation>Год</translation>
    </message>
    <message>
        <location filename="../columneditor.cpp" line="92"/>
        <location filename="../columneditor.cpp" line="115"/>
        <source>Track Index</source>
        <translation>Индекс трека</translation>
    </message>
    <message>
        <location filename="../columneditor.cpp" line="93"/>
        <source>Condition</source>
        <translation>Условие</translation>
    </message>
    <message>
        <location filename="../columneditor.cpp" line="102"/>
        <source>Artist - Album</source>
        <translation>Исполнитель - альбом</translation>
    </message>
    <message>
        <location filename="../columneditor.cpp" line="103"/>
        <source>Artist - Title</source>
        <translation>Исполнитель - название</translation>
    </message>
    <message>
        <location filename="../columneditor.cpp" line="80"/>
        <location filename="../columneditor.cpp" line="104"/>
        <source>Album Artist</source>
        <translation>Исполнитель альбома</translation>
    </message>
    <message>
        <location filename="../columneditor.cpp" line="82"/>
        <location filename="../columneditor.cpp" line="106"/>
        <source>Track Number</source>
        <translation>Номер трека</translation>
    </message>
    <message>
        <location filename="../columneditor.cpp" line="83"/>
        <location filename="../columneditor.cpp" line="107"/>
        <source>Two-digit Track Number</source>
        <translation>2-х разрядный номер трека</translation>
    </message>
    <message>
        <location filename="../columneditor.cpp" line="88"/>
        <location filename="../columneditor.cpp" line="112"/>
        <source>Disc Number</source>
        <translation>Номер диска</translation>
    </message>
    <message>
        <location filename="../columneditor.cpp" line="89"/>
        <location filename="../columneditor.cpp" line="113"/>
        <source>File Name</source>
        <translation>Имя файла</translation>
    </message>
    <message>
        <location filename="../columneditor.cpp" line="90"/>
        <location filename="../columneditor.cpp" line="114"/>
        <source>File Path</source>
        <translation>Путь к файлу</translation>
    </message>
    <message>
        <location filename="../columneditor.cpp" line="117"/>
        <source>Custom</source>
        <translation>Пользовательский</translation>
    </message>
</context>
<context>
    <name>ConfigDialog</name>
    <message>
        <location filename="../forms/configdialog.ui" line="14"/>
        <source>Qmmp Settings</source>
        <translation>Настройки Qmmp</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="58"/>
        <source>Playlist</source>
        <translation>Список</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="67"/>
        <source>Plugins</source>
        <translation>Модули</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="76"/>
        <source>Advanced</source>
        <translation>Дополнительно</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="85"/>
        <source>Connectivity</source>
        <translation>Сеть</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="94"/>
        <location filename="../forms/configdialog.ui" line="758"/>
        <source>Audio</source>
        <translation>Аудио</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="123"/>
        <source>Metadata</source>
        <translation>Метаданные</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="143"/>
        <source>Convert %20 to blanks</source>
        <translation>Преобразовывать %20 в пробел</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="129"/>
        <source>Load metadata from files</source>
        <translation>Считывать метаданные из файлов</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="136"/>
        <source>Convert underscores to blanks</source>
        <translation>Преобразовывать подчёркивание в пробел</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="150"/>
        <source>Group format:</source>
        <translation>Формат группы:</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="160"/>
        <source>...</source>
        <translation>...</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="170"/>
        <source>Directory Scanning Options</source>
        <translation>Опции сканирования директорий</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="176"/>
        <source>Restrict files to:</source>
        <translation>Ограничить выбор файлов до:</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="186"/>
        <location filename="../forms/configdialog.ui" line="437"/>
        <source>Exclude files:</source>
        <translation>Исключить файлы:</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="199"/>
        <source>Miscellaneous</source>
        <translation>Разное</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="205"/>
        <source>Auto-save playlist when modified</source>
        <translation>Автоматически сохранять список после изменения</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="212"/>
        <source>Clear previous playlist when opening new one</source>
        <translation>Очищать предыдущий список при открытии нового</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="260"/>
        <location filename="../configdialog.cpp" line="320"/>
        <source>Preferences</source>
        <translation>Настройки</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="273"/>
        <location filename="../configdialog.cpp" line="323"/>
        <source>Information</source>
        <translation>Информация</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="315"/>
        <source>Description</source>
        <translation>Описание</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="320"/>
        <source>Filename</source>
        <translation>Имя файла</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="332"/>
        <source>Look and Feel</source>
        <translation>Параметры интерфейса</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="338"/>
        <source>Language:</source>
        <translation>Язык:</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="374"/>
        <source>Playback</source>
        <translation>Воспроизведение</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="380"/>
        <source>Continue playback on startup</source>
        <translation>Продолжить воспроизведение после запуска</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="387"/>
        <source>Determine file type by content</source>
        <translation>Определять тип файла по содержимому</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="394"/>
        <source>Add files from command line to this playlist:</source>
        <translation>Добавлять файлы из командной строки в этот список:</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="411"/>
        <source>Cover Image Retrieve</source>
        <translation>Поиск обложки альбома</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="417"/>
        <source>Use separate image files</source>
        <translation>Использовать отдельные файлы с изображениями</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="427"/>
        <source>Include files:</source>
        <translation>Включить файлы:</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="449"/>
        <source>Recursive search depth:</source>
        <translation>Глубина рекурсивного поиска:</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="481"/>
        <source>URL Dialog</source>
        <translation>URL-диалог</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="487"/>
        <source>Auto-paste URL from clipboard</source>
        <translation>Автоматически вставлять URL из буфера обмена</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="526"/>
        <source>Proxy</source>
        <translation>Прокси</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="538"/>
        <source>Enable proxy usage</source>
        <translation>Использовать прокси</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="545"/>
        <source>Proxy host name:</source>
        <translation>Прокси сервер:</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="558"/>
        <source>Proxy port:</source>
        <translation>Прокси порт:</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="571"/>
        <source>Use authentication with proxy</source>
        <translation>Использовать авторизацию на прокси</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="578"/>
        <source>Proxy user name:</source>
        <translation>Имя пользователя прокси:</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="591"/>
        <source>Proxy password:</source>
        <translation>Пароль прокси:</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="628"/>
        <source>Replay Gain</source>
        <translation>Выравнивание громкости (Replay Gain)</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="634"/>
        <source>Replay Gain mode:</source>
        <translation>Режим Replay Gain:</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="651"/>
        <source>Preamp:</source>
        <translation>Предусиление:</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="683"/>
        <location filename="../forms/configdialog.ui" line="728"/>
        <source>dB</source>
        <translation>дБ</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="696"/>
        <source>Default gain:</source>
        <translation>Усиление по умолчанию:</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="748"/>
        <source>Use  peak info to prevent clipping</source>
        <translation>Использовать пиковое значение для предотвращения срезания</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="778"/>
        <source>Buffer size:</source>
        <translation>Размер буфера:</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="797"/>
        <source>ms</source>
        <translation>мс</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="813"/>
        <source>Use software volume control</source>
        <translation>Использовать программную регулировку громкости</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="823"/>
        <source>Volume adjustment step:</source>
        <translation>Шаг регулировки громкости:</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="764"/>
        <source>Output bit depth:</source>
        <translation>Разрядность вывода:</translation>
    </message>
    <message>
        <location filename="../forms/configdialog.ui" line="771"/>
        <source>Use dithering</source>
        <translation>Использовать дитеринг</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="69"/>
        <source>Track</source>
        <translation>Дорожка</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="70"/>
        <location filename="../configdialog.cpp" line="304"/>
        <source>Album</source>
        <translation>Альбом</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="71"/>
        <source>Disabled</source>
        <translation>Отключено</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="87"/>
        <source>File Types</source>
        <translation>Типы файлов</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="191"/>
        <source>Transports</source>
        <translation>Транспорты</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="201"/>
        <source>Decoders</source>
        <translation>Декодеры</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="211"/>
        <source>Engines</source>
        <translation>Внешние проигрыватели</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="221"/>
        <source>Effects</source>
        <translation>Эффекты</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="231"/>
        <source>Visualization</source>
        <translation>Визуализация</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="241"/>
        <source>General</source>
        <translation>Общие</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="251"/>
        <source>Output</source>
        <translation>Вывод</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="261"/>
        <source>File Dialogs</source>
        <translation>Файловые диалоги</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="271"/>
        <source>User Interfaces</source>
        <translation>Пользовательские интерфейсы</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="303"/>
        <source>Artist</source>
        <translation>Исполнитель</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="305"/>
        <source>Album Artist</source>
        <translation>Исполнитель альбома</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="306"/>
        <source>Genre</source>
        <translation>Жанр</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="307"/>
        <source>Comment</source>
        <translation>Комментарий</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="308"/>
        <source>Composer</source>
        <translation>Композитор</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="309"/>
        <source>Disc Number</source>
        <translation>Номер диска</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="310"/>
        <source>Year</source>
        <translation>Год</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="311"/>
        <source>Condition</source>
        <translation>Условие</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="312"/>
        <source>Artist/Album</source>
        <translation>Исполнитель/Альбом</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="313"/>
        <source>Artist/Year/Album</source>
        <translation>Исполнитель/Год/Альбом</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="333"/>
        <source>&lt;Autodetect&gt;</source>
        <translation>&lt;aвтоопределение&gt;</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="334"/>
        <source>Brazilian Portuguese</source>
        <translation>бразильский португальский</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="335"/>
        <source>Chinese Simplified</source>
        <translation>китайский упрощённый</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="336"/>
        <source>Chinese Traditional</source>
        <translation>китайский традиционный</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="337"/>
        <source>Czech</source>
        <translation>чешский</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="338"/>
        <source>Dutch</source>
        <translation>голландский</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="339"/>
        <source>English</source>
        <translation>английский</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="340"/>
        <source>French</source>
        <translation>французский</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="341"/>
        <source>Galician</source>
        <translation>галисийский</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="342"/>
        <source>German</source>
        <translation>немецкий</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="343"/>
        <source>Hebrew</source>
        <translation>иврит</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="344"/>
        <source>Hungarian</source>
        <translation>венгерский</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="345"/>
        <source>Italian</source>
        <translation>итальянский</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="346"/>
        <source>Japanese</source>
        <translation>японский</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="347"/>
        <source>Kazakh</source>
        <translation>казахский</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="348"/>
        <source>Lithuanian</source>
        <translation>литовский</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="349"/>
        <source>Polish</source>
        <translation>польский</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="350"/>
        <source>Portuguese</source>
        <translation>португальский</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="351"/>
        <source>Russian</source>
        <translation>русский</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="352"/>
        <source>Slovak</source>
        <translation>словацкий</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="353"/>
        <source>Spanish</source>
        <translation>испанский</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="354"/>
        <source>Turkish</source>
        <translation>турецкий</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="355"/>
        <source>Ukrainian</source>
        <translation>украинский</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="356"/>
        <source>Serbian (Ijekavian)</source>
        <translation>Сербский (иекавский)</translation>
    </message>
    <message>
        <location filename="../configdialog.cpp" line="357"/>
        <source>Serbian (Ekavian)</source>
        <translation>Сербский (экавский)</translation>
    </message>
</context>
<context>
    <name>DetailsDialog</name>
    <message>
        <location filename="../forms/detailsdialog.ui" line="14"/>
        <source>Details</source>
        <translation>Информация</translation>
    </message>
    <message>
        <location filename="../forms/detailsdialog.ui" line="44"/>
        <source>Open the directory containing this file</source>
        <translation>Открыть директорию, содержащую файл</translation>
    </message>
    <message>
        <location filename="../forms/detailsdialog.ui" line="47"/>
        <source>...</source>
        <translation>...</translation>
    </message>
    <message>
        <location filename="../forms/detailsdialog.ui" line="63"/>
        <source>Summary</source>
        <translation>Общая информация</translation>
    </message>
    <message>
        <location filename="../detailsdialog.cpp" line="132"/>
        <source>%1/%2</source>
        <translation type="unfinished"></translation>
    </message>
    <message>
        <location filename="../detailsdialog.cpp" line="177"/>
        <source>Title</source>
        <translation>Название</translation>
    </message>
    <message>
        <location filename="../detailsdialog.cpp" line="178"/>
        <source>Artist</source>
        <translation>Исполнитель</translation>
    </message>
    <message>
        <location filename="../detailsdialog.cpp" line="179"/>
        <source>Album artist</source>
        <translation>Исполнитель альбома</translation>
    </message>
    <message>
        <location filename="../detailsdialog.cpp" line="180"/>
        <source>Album</source>
        <translation>Альбом</translation>
    </message>
    <message>
        <location filename="../detailsdialog.cpp" line="181"/>
        <source>Comment</source>
        <translation>Комментарий</translation>
    </message>
    <message>
        <location filename="../detailsdialog.cpp" line="182"/>
        <source>Genre</source>
        <translation>Жанр</translation>
    </message>
    <message>
        <location filename="../detailsdialog.cpp" line="183"/>
        <source>Composer</source>
        <translation>Композитор</translation>
    </message>
    <message>
        <location filename="../detailsdialog.cpp" line="185"/>
        <source>Year</source>
        <translation>Год</translation>
    </message>
    <message>
        <location filename="../detailsdialog.cpp" line="187"/>
        <source>Track</source>
        <translation>Дорожка</translation>
    </message>
    <message>
        <location filename="../detailsdialog.cpp" line="189"/>
        <source>Disc number</source>
        <translation>Номер диска</translation>
    </message>
</context>
<context>
    <name>JumpToTrackDialog</name>
    <message>
        <location filename="../forms/jumptotrackdialog.ui" line="14"/>
        <source>Jump To Track</source>
        <translation>Перейти к треку</translation>
    </message>
    <message>
        <location filename="../forms/jumptotrackdialog.ui" line="37"/>
        <source>Filter:</source>
        <translation>Фильтр:</translation>
    </message>
    <message>
        <location filename="../forms/jumptotrackdialog.ui" line="70"/>
        <location filename="../jumptotrackdialog.cpp" line="90"/>
        <location filename="../jumptotrackdialog.cpp" line="137"/>
        <source>Queue</source>
        <translation>В очередь</translation>
    </message>
    <message>
        <location filename="../forms/jumptotrackdialog.ui" line="83"/>
        <source>Refresh</source>
        <translation>Обновить</translation>
    </message>
    <message>
        <location filename="../forms/jumptotrackdialog.ui" line="96"/>
        <source>Jump To</source>
        <translation>Перейти к</translation>
    </message>
    <message>
        <location filename="../jumptotrackdialog.cpp" line="58"/>
        <source>Q</source>
        <translation type="unfinished"></translation>
    </message>
    <message>
        <location filename="../jumptotrackdialog.cpp" line="59"/>
        <source>J</source>
        <translation type="unfinished"></translation>
    </message>
    <message>
        <location filename="../jumptotrackdialog.cpp" line="60"/>
        <source>F5</source>
        <translation type="unfinished"></translation>
    </message>
    <message>
        <location filename="../jumptotrackdialog.cpp" line="88"/>
        <location filename="../jumptotrackdialog.cpp" line="135"/>
        <source>Unqueue</source>
        <translation>Снять с очереди</translation>
    </message>
</context>
<context>
    <name>PlayListDownloader</name>
    <message>
        <location filename="../playlistdownloader.cpp" line="108"/>
        <source>Unsupported playlist format</source>
        <translation>Неподдерживаемый формат списка воспроизведения</translation>
    </message>
</context>
<context>
    <name>PlayListHeaderModel</name>
    <message>
        <location filename="../playlistheadermodel.cpp" line="36"/>
        <source>Artist - Title</source>
        <translation>Исполнитель - название</translation>
    </message>
    <message>
        <location filename="../playlistheadermodel.cpp" line="186"/>
        <source>Title</source>
        <translation>Название</translation>
    </message>
    <message>
        <location filename="../playlistheadermodel.cpp" line="187"/>
        <source>Add Column</source>
        <translation>Добавить колонку</translation>
    </message>
</context>
<context>
    <name>PlayListManager</name>
    <message>
        <location filename="../playlistmanager.cpp" line="152"/>
        <location filename="../playlistmanager.cpp" line="309"/>
        <source>Playlist</source>
        <translation>Список</translation>
    </message>
</context>
<context>
    <name>PlayListTrack</name>
    <message>
        <location filename="../playlisttrack.cpp" line="255"/>
        <source>Streams</source>
        <translation>Потоковое радио</translation>
    </message>
    <message>
        <location filename="../playlisttrack.cpp" line="260"/>
        <source>Empty group</source>
        <translation>Пустая группа</translation>
    </message>
</context>
<context>
    <name>QObject</name>
    <message>
        <location filename="../winfileassoc.cpp" line="278"/>
        <source>Enqueue in Qmmp</source>
        <translation>Добавить в список Qmmp</translation>
    </message>
</context>
<context>
    <name>QmmpUiSettings</name>
    <message>
        <location filename="../qmmpuisettings.cpp" line="56"/>
        <source>Playlist</source>
        <translation>Список</translation>
    </message>
</context>
<context>
    <name>QtFileDialogFactory</name>
    <message>
        <location filename="../qtfiledialog.cpp" line="34"/>
        <source>Qt File Dialog</source>
        <translation>Файловый диалог Qt</translation>
    </message>
</context>
<context>
    <name>TagEditor</name>
    <message>
        <location filename="../forms/tageditor.ui" line="14"/>
        <source>Tag Editor</source>
        <translation>Редактор тегов</translation>
    </message>
    <message>
        <location filename="../forms/tageditor.ui" line="38"/>
        <source>Title:</source>
        <translation>Название:</translation>
    </message>
    <message>
        <location filename="../forms/tageditor.ui" line="64"/>
        <source>Artist:</source>
        <translation>Исполнитель:</translation>
    </message>
    <message>
        <location filename="../forms/tageditor.ui" line="90"/>
        <source>Album:</source>
        <translation>Альбом:</translation>
    </message>
    <message>
        <location filename="../forms/tageditor.ui" line="113"/>
        <source>Album artist:</source>
        <translation>Исполнитель альбома:</translation>
    </message>
    <message>
        <location filename="../forms/tageditor.ui" line="123"/>
        <source>Composer:</source>
        <translation>Композитор:</translation>
    </message>
    <message>
        <location filename="../forms/tageditor.ui" line="143"/>
        <source>Genre:</source>
        <translation>Жанр:</translation>
    </message>
    <message>
        <location filename="../forms/tageditor.ui" line="169"/>
        <source>Track:</source>
        <translation>Дорожка:</translation>
    </message>
    <message>
        <location filename="../forms/tageditor.ui" line="190"/>
        <location filename="../forms/tageditor.ui" line="228"/>
        <location filename="../forms/tageditor.ui" line="260"/>
        <source>?</source>
        <translation>?</translation>
    </message>
    <message>
        <location filename="../forms/tageditor.ui" line="203"/>
        <source>Year:</source>
        <translation>Год:</translation>
    </message>
    <message>
        <location filename="../forms/tageditor.ui" line="250"/>
        <source>Disc number:</source>
        <translation>Номер диска:</translation>
    </message>
    <message>
        <location filename="../forms/tageditor.ui" line="275"/>
        <source>Comment:</source>
        <translation>Комментарий:</translation>
    </message>
    <message>
        <location filename="../forms/tageditor.ui" line="311"/>
        <source>Include selected tag in file</source>
        <translation>Включить выбранный тег в файл</translation>
    </message>
</context>
<context>
    <name>TemplateEditor</name>
    <message>
        <location filename="../forms/templateeditor.ui" line="14"/>
        <source>Template Editor</source>
        <translation>Редактор шаблонов</translation>
    </message>
    <message>
        <location filename="../forms/templateeditor.ui" line="39"/>
        <source>Reset</source>
        <translation>Сбросить</translation>
    </message>
    <message>
        <location filename="../forms/templateeditor.ui" line="46"/>
        <source>Insert</source>
        <translation>Вставить</translation>
    </message>
    <message>
        <location filename="../templateeditor.cpp" line="50"/>
        <source>Artist</source>
        <translation>Исполнитель</translation>
    </message>
    <message>
        <location filename="../templateeditor.cpp" line="51"/>
        <source>Album</source>
        <translation>Альбом</translation>
    </message>
    <message>
        <location filename="../templateeditor.cpp" line="53"/>
        <source>Title</source>
        <translation>Название</translation>
    </message>
    <message>
        <location filename="../templateeditor.cpp" line="52"/>
        <source>Album Artist</source>
        <translation>Исполнитель альбома</translation>
    </message>
    <message>
        <location filename="../templateeditor.cpp" line="54"/>
        <source>Track Number</source>
        <translation>Номер трека</translation>
    </message>
    <message>
        <location filename="../templateeditor.cpp" line="55"/>
        <source>Two-digit Track Number</source>
        <translation>2-х разрядный номер трека</translation>
    </message>
    <message>
        <location filename="../templateeditor.cpp" line="56"/>
        <source>Genre</source>
        <translation>Жанр</translation>
    </message>
    <message>
        <location filename="../templateeditor.cpp" line="57"/>
        <source>Comment</source>
        <translation>Комментарий</translation>
    </message>
    <message>
        <location filename="../templateeditor.cpp" line="58"/>
        <source>Composer</source>
        <translation>Композитор</translation>
    </message>
    <message>
        <location filename="../templateeditor.cpp" line="59"/>
        <source>Duration</source>
        <translation>Длительность</translation>
    </message>
    <message>
        <location filename="../templateeditor.cpp" line="60"/>