aboutsummaryrefslogblamecommitdiff
path: root/README.RUS
blob: 4cc0861cc14ce80eca17c2c89dc5ad80854c34df (plain) (tree)
1
2
3
4
5
6
7
8
9


                                                                                                                                            
                                                                                     
 


                                                                     
                   
 

                                            
            
          







                                                                           
      
     
                                                                                                                        


                          
                                    
                       
                                           
                                                         





                                       
                





                                    
                                                      

                                                          

                                           
                                                                                                        
                                                                        
                                                                  








                                                                                                                                  
                           
                                                            
                                                                       
 
                     
           




                         
               
              
                                        






                                                 
                                               
                                                                
                                          
                                                           
                                           
                                         
                                                  

                                          
                                                 
                                                
                                           
                                               
                                         
                                  
                                                   
 
                                                                                                                                                            
 
                         




             
                   

            
                                                                                                                                                                                       
                              

                              

                                                                                                              
                                                                                          
                                                                                                       
                                                                            

                                                                                                                
                                                                                                                                         

                                                                                    


                                                                                                                                 
 

                                                                                                                                                                  

                                                     
                                  
                                                                                            
                                                                                                                                                    
 





                                                                                                                                                                                                                                    
                                                                                                                                
 
             
             








                                                                                                                                                        
                                                                                               
 
                                                                                                                                                                                                     
                                                                                                                                                                      

                                                                                                                  
      
                        

 
                                                                                                                            



                                                                                                                                                   
                                                                                                                             
 
                                                                                                                                                                 
                                                                                   
Qmmp - Qt-based multimedia player

Программа является аудио-плеером, написанным с использованием библиотеки Qt.
Официальная домашняя страница: http://qmmp.ylsoftware.com/

Поддерживаемые операционные системы:
- GNU/Linux
- FreeBSD
- Microsoft Windows

Поддерживаемые форматы:
- MPEG1 layer 2/3
- Ogg Vorbis
- Ogg Opus
- Native FLAC, Ogg FLAC
- Musepack
- WavePack
- трекерные форматы (mod, s3m, it, xm и т.д.)
- ADTS AAC
- CD Audio
- WMA, Monkey's Audio (и др. форматы библиотеки FFmpeg)
- PCM WAVE (и др. форматы библиотеки libsndfile)
- midi
- SID
- форматы звука игровых консолей (AY, GBS, GYM, HES, KSS, NSF, NSFE, SAP, SPC, VGM, VGZ, VTX)

Аудио-эффекты:
- эффект BS2B
- Передискретизация
- эффекты LADSPA
- расширение стереобазы
- плавный переход между треками

Визуальные эффекты:
- визуализация projectM
- анализатор спектра

Системы вывода звука:
- OSS4 (FreeBSD)
- ALSA (Linux)
- Pulse Audio
- JACK
- WaveOut (Win32)

Другие возможности:
- поддержка обложек XMMS и Winamp 2.x
- 10-полосный эквалайзер
- поддержка потоков MP3, Vorbis, AAC, AAC+
- поддержка протокола MMS
- MPRIS (1.0 и 2.0)
- автоопределение съёмных устройств (с помощью HAL или UDisks)
- воспроизведение видео с помощью Mplayer-а
- получение текстов песен с lyrics.wikia.com
- просмотр обложек
- поддержка CUE
- поддержка "встроенного" CUE (для файлов FLAC и WavPack)
- возможность использовать несколько списков воспроизведения
- автоматической определение кодировки для cue-файлов и ShoutCast-метаданных
- поддерживаемые форматы списков воспроизведения: m3u, pls, xspf
- поддержка ReplayGain
- скробблер Last.fm/Libre.fm
- поддержка CDDB
- обзор потоков
- преобразователь аудио-форматов
- запуск внешних команд при смене трека

Требования:
- Qt >= 4.6
- tar, unzip, bzip2, gzip
- libmad
- libvorbis
- libogg
- libalsa >= 1.0.1
- taglib >= 1.6
- curl >= 7.16
- libmms >= 0.4 (Опционально)
- flac >= 1.1.3 (Опционально)
- libmpcdec >= 1.2.6 (Опционально)
- jackit >= 0.102.5 (Опционально)
- libsamplerate >= 0.1.2 (Опционально)
- libmodplug >= 0.8.4 (Опционально)
- libsndfile >= 1.0.17 (Опционально)
- wavpack >= 4.41 (Опционально)
- pulseaudio >= 0.9.15 (Опционально)
- ffmpeg >= 0.9.1 или libav >= 0.8.0 (Опционально)
- libcdio >= 0.80 (Опционально)
- libcdio-paranoia >= 10.2 (начиная с libcdio 0.90)
- libcddb >= 1.3.1 (Опционально)
- faad2 >= 2.6.1 (Опционально)
- game-music-emu >= 0.5.5 (Опционально)
- opus >= 1.0.2 (Опционально)
- opusfile >= 0.2 (Опционально)
- libWildMidi >= 0.2.3.4 (Опционально)
- libsidplayfp >= 1.0.3 (Опционально)
- libbs2b >= 3.0.0 (Опционально)
- libprojectM >= 1.2.0 (Опционально)
- libenca >= 1.9 (Опционально)
- mplayer (Опционально)
- cmake >= 2.6.0 (только для сборки)

Внимание! Для сборки Qmmp нужна утилита lrelease. Очень часто она находится в пакете libqt4-devel.

Конфигурация:
cmake ./

Сборка:
make

Установка:
make install

Если какой-либо модуль (например, Jack) не собирается или не нужен, то вы можете отключить его командой:
cmake ./ -DUSE_JACK:BOOL=FALSE

Доступные опции:
- USE_CURL, USE_MMS (транспортные модули);
- USE_MAD, USE_FLAC, USE_VORBIS, USE_MPC, USE_MODPLUG, USE_SNDFILE, USE_WAVPACK, USE_FFMPEG, USE_AAC, USE_CUE,
  USE_MPLAYER, USE_CDA, USE_MIDI, USE_GME, USE_FFMPEG_LEGACY, USE_OPUS (декодеры);
- USE_ALSA, USE_OSS, USE_JACK, USE_PULSE, USE_NULL, USE_OSS4, USE_WAVEOUT (модули  вывода);
- USE_SRC, USE_BS2B, USE_LADSPA, USE_CROSSFADE, USE_STEREO (эффекты);
- USE_ANALYZER, USE_PROJECTM (визуализация);
- USE_MPRIS, USE_SCROBBLER, USE_STATICON, USE_NOTIFIER, USE_LYRICS, USE_HAL, USE_HOTKEY, USE_FILEOPS, USE_COVER,
  USE_KDENOTIFY, USE_UDISKS2, USE_UDISKS, USE_CONVERTER, USE_TRACKCHANGE, USE_COPYPASTE (модули общего назначения);
- USE_QMMP_DIALOG (файловый диалог);
- USE_ENCA (автоматическое определение кодировки);
- USE_SKINNED (стандартный пользовательский интерфейс);
- USE_DIR_ASSOC (привязка к mime-типу inode/directory);
- USE_RPATH (включает опцию CMAKE_INSTALL_RPATH_USE_LINK_PATH, см. http://www.cmake.org/Wiki/CMake_RPATH_handling)

Также вы можете использовать ccmake для изменения конфигурации модулей.
По умолчанию программа будет установлена в /usr/local. Вы можете изменить этот путь командой:
cmake ./ -DCMAKE_INSTALL_PREFIX=другой_путь

Поддержка OSS3 и Udisks.
Модули OSS3 и UDisks2 устарели и отключёны по умолчанию.
Для их включения выполните 'cmake ./ -DUSE_OSS:BOOL=TRUE' или 'cmake ./ -DUSE_OSS:UDISKS2=TRUE' перед сборкой.

Поддержка HAL и UDisks2.
Большинство дистрибутивов Linux больше не поддерживает HAL. Для отключения модуля HAL выполните перед сборкой следующую команду:
cmake ./ -DUSE_HAL:BOOL=FALSE
Проект UDisks не поддерживает FreeBSD, поэтому под FreeBSD рекомендуется исключить модуль Udisks2 из сборки следующей командой:
cmake ./ -DUSE_UDISKS2:BOOL=FALSE

В некоторых случаях вы можете использовать qmake для сборки и установки.

Сборка:
qmake && make

Установка:
make install INSTALL_ROOT=/usr/local

Исполняемый файл:
./bin/qmmp

Если какой-либо модуль не собирается или не нужен, в файле qmmp.pri можно его отключить.
Для отключения необходимо закомментировать соответствующую строчку (символ "#").
Внимание! по умолчанию включены все модули кроме OSS4.

Изменение пути установки разделяемых библиотек и модулей (требуется для некоторых 64-битных дистрибутивов).
По умолчанию все библиотеки и модули будут установлены в $(INSTALL PREFIX)/lib. Вы можете сменить "lib"
на "lib64" с помощью запуска qmake или cmake со специальным параметром:
qmake LIB_DIR=/lib64
или
cmake ./ -DLIB_DIR=lib64


Патчи, багрепорты, идеи и т.п.: forkotov02@hotmail.ru или http://code.google.com/p/qmmp/issues/list

Автор выражает благодарность Вадиму Калинникову (www.ylsoftware.com) за предоставленный
хостинг и тестирование программы.

Также выражается благодарность всем, приславшим патчи и багрепорты.

Просьба к присылающим патчи. Во избежание проблем с определением авторства, пожалуйста,
указывайте также свою контактную информацию.
an class="hl opt">] = pixmap->copy (0,0,9,9); buttons[BT_MENU_P] = pixmap->copy (0,9,9,9); buttons[BT_MINIMIZE_N] = pixmap->copy (9,0,9,9); buttons[BT_MINIMIZE_P] = pixmap->copy (9,9,9,9); buttons[BT_CLOSE_N] = pixmap->copy (18,0,9,9); buttons[BT_CLOSE_P] = pixmap->copy (18,9,9,9); buttons[BT_SHADE1_N] = pixmap->copy (0,18,9,9); buttons[BT_SHADE1_P] = pixmap->copy (9,18,9,9); buttons[BT_SHADE2_N] = pixmap->copy (0,27,9,9); buttons[BT_SHADE2_P] = pixmap->copy (9,27,9,9); titlebar[TITLEBAR_A] = pixmap->copy (27, 0,275,14); titlebar[TITLEBAR_I] = pixmap->copy (27,15,275,14); titlebar[TITLEBAR_SHADED_A] = pixmap->copy (27,29,275,14); titlebar[TITLEBAR_SHADED_I] = pixmap->copy (27,42,275,14); delete pixmap; } void Skin::loadPosBar() { QPixmap *pixmap = getPixmap ("posbar"); if (!pixmap) pixmap = getDummyPixmap("posbar"); if (pixmap->width() > 249) { buttons[BT_POSBAR_N] = pixmap->copy (248,0,29, pixmap->height()); buttons[BT_POSBAR_P] = pixmap->copy (278,0,29, pixmap->height()); } else { QPixmap dummy(29, pixmap->height()); dummy.fill(Qt::transparent); buttons[BT_POSBAR_N] = dummy; buttons[BT_POSBAR_P] = dummy; } posbar = pixmap->copy (0,0,248,pixmap->height()); delete pixmap; } void Skin::loadNumbers() { QPixmap *pixmap = getPixmap ("nums_ex"); if (!pixmap) pixmap = getPixmap ("numbers"); if (!pixmap) pixmap = getDummyPixmap("numbers"); for (uint i = 0; i < 10; i++) m_numbers << pixmap->copy (i*9, 0, 9, pixmap->height()); if (pixmap->width() > 107) m_numbers << pixmap->copy(99, 0, 9, pixmap->height()); else { // We didn't find "-" symbol. So we have to extract it from "2". // Winamp uses this method too. QPixmap pix; if(pixmap->width() > 98) pix = pixmap->copy(90,0,9,pixmap->height()); else { pix = QPixmap(9, pixmap->height()); pix.fill(Qt::transparent); } QPixmap minus = pixmap->copy(18,pixmap->height()/2,9,1); QPainter paint(&pix); paint.drawPixmap(0,pixmap->height()/2, minus); m_numbers << pix; } delete pixmap; } void Skin::loadPlayList() { QPixmap *pixmap = getPixmap ("pledit"); if (!pixmap) pixmap = getDummyPixmap("pledit"); m_pl_parts[PL_CORNER_UL_A] = pixmap->copy (0,0,25,20); m_pl_parts[PL_CORNER_UL_I] = pixmap->copy (0,21,25,20); m_pl_parts[PL_CORNER_UR_A] = pixmap->copy (153,0,25,20); m_pl_parts[PL_CORNER_UR_I] = pixmap->copy (153,21,25,20); m_pl_parts[PL_TITLEBAR_A] = pixmap->copy (26,0,100,20); m_pl_parts[PL_TITLEBAR_I] = pixmap->copy (26,21,100,20); m_pl_parts[PL_TFILL1_A] = pixmap->copy (127,0,25,20); m_pl_parts[PL_TFILL1_I] = pixmap->copy (127,21,25,20); //m_pl_parts[PL_TFILL2_A] = pixmap->copy();//FIXME: ����� //m_pl_parts[PL_TFILL2_I] = pixmap->copy(); m_pl_parts[PL_LFILL] = pixmap->copy (0,42,12,29); m_pl_parts[PL_RFILL] = pixmap->copy (31,42,20,29); //??? m_pl_parts[PL_LSBAR] = pixmap->copy (0,72,125,38); m_pl_parts[PL_RSBAR] = pixmap->copy (126,72,150,38); m_pl_parts[PL_SFILL1] = pixmap->copy (179,0,25,38); m_pl_parts[PL_SFILL2] = pixmap->copy (250,21,75,38); m_pl_parts[PL_TITLEBAR_SHADED1_A] = pixmap->copy (99,42,50,14); m_pl_parts[PL_TITLEBAR_SHADED1_I] = pixmap->copy (99,57,50,14); m_pl_parts[PL_TITLEBAR_SHADED2] = pixmap->copy (72,42,25,14); m_pl_parts[PL_TFILL_SHADED] = pixmap->copy (72,57,25,14); m_pl_parts[PL_CONTROL] = pixmap->copy(129,94,60,8); buttons[PL_BT_ADD] = pixmap->copy (11,80,25,18); buttons[PL_BT_SUB] = pixmap->copy (40,80,25,18); buttons[PL_BT_SEL] = pixmap->copy (70,80,25,18); buttons[PL_BT_SORT] = pixmap->copy (99,80,25,18); buttons[PL_BT_LST] = pixmap->copy(229, 80, 25, 18); buttons[PL_BT_SCROLL_N] = pixmap->copy (52,53,8,18); buttons[PL_BT_SCROLL_P] = pixmap->copy (61,53,8,18); buttons[PL_BT_CLOSE_N] = pixmap->copy (167,3,9,9); buttons[PL_BT_CLOSE_P] = pixmap->copy (52,42,9,9); buttons[PL_BT_SHADE1_N] = pixmap->copy (158,3,9,9); buttons[PL_BT_SHADE1_P] = pixmap->copy (62,42,9,9); buttons[PL_BT_SHADE2_N] = pixmap->copy (129,45,9,9); buttons[PL_BT_SHADE2_P] = pixmap->copy (150,42,9,9); } QPixmap *Skin::getPixmap (const QString& name) { m_skin_dir.setFilter (QDir::Files | QDir::Hidden | QDir::NoSymLinks); QFileInfoList f = m_skin_dir.entryInfoList(); for (int j = 0; j < f.size(); ++j) { QFileInfo fileInfo = f.at (j); QString fn = fileInfo.fileName().toLower(); if (fn.section (".",0,0) == name) { return new QPixmap (fileInfo.filePath()); } } return 0; } QString Skin::getPath (const QString& name) { m_skin_dir.setFilter (QDir::Files | QDir::Hidden | QDir::NoSymLinks); QFileInfoList f = m_skin_dir.entryInfoList(); bool nameHasExt = name.contains('.'); for (int j = 0; j < f.size(); ++j) { QFileInfo fileInfo = f.at (j); QString fn = fileInfo.fileName().toLower(); if (!nameHasExt && fn.section (".",0,0) == name) { return fileInfo.filePath(); } else if (nameHasExt && fn == name) { return fileInfo.filePath(); } } return QString(); } void Skin::loadPLEdit() { QString path = findFile("pledit.txt", m_skin_dir); if (path.isEmpty()) path = findFile("pledit.txt", ":/default"); if (path.isEmpty()) qFatal("Skin: invalid default skin"); QFile file(path); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) qFatal("Skin: unable to open %s", qPrintable(path)); while (!file.atEnd ()) { QByteArray line = file.readLine (); QList<QByteArray> l = line.split ('='); if (l.count () == 2) { m_pledit_txt[l[0].toLower () ] = l[1].trimmed(); } else if (line.length() == 0) { break; } } if (!m_pledit_txt.keys().contains("mbbg")) m_pledit_txt["mbbg"] = m_pledit_txt["normalbg"]; if (!m_pledit_txt.keys().contains("mbfg")) m_pledit_txt["mbfg"] = m_pledit_txt["normal"]; } void Skin::loadEqMain() { QPixmap *pixmap = getPixmap ("eqmain"); if (!pixmap) pixmap = getDummyPixmap("eqmain"); m_eq_parts[ EQ_MAIN ] = pixmap->copy (0,0,275,116); m_eq_parts[ EQ_TITLEBAR_A ] = pixmap->copy (0,134,275,14); m_eq_parts[ EQ_TITLEBAR_I ] = pixmap->copy (0,149,275,14); if (pixmap->height() > 295) m_eq_parts[ EQ_GRAPH ] = pixmap->copy (0,294,113,19); else m_eq_parts[ EQ_GRAPH ] = QPixmap(); for (int i = 0; i < 14; ++i) { m_eq_bar << pixmap->copy (13 + i*15,164,14,63); } for (int i = 0; i < 14; ++i) { m_eq_bar << pixmap->copy (13 + i*15,229,14,63); } buttons[ EQ_BT_BAR_N ] = pixmap->copy (0,164,11,11); buttons[ EQ_BT_BAR_P ] = pixmap->copy (0,164+12,11,11); buttons[ EQ_BT_ON_N ] = pixmap->copy (69,119,28,12); buttons[ EQ_BT_ON_P ] = pixmap->copy (128,119,28,12); buttons[ EQ_BT_OFF_N ] = pixmap->copy (10, 119,28,12); buttons[ EQ_BT_OFF_P ] = pixmap->copy (187,119,28,12); buttons[ EQ_BT_PRESETS_N ] = pixmap->copy (224,164,44,12); buttons[ EQ_BT_PRESETS_P ] = pixmap->copy (224,176,44,12); buttons[ EQ_BT_AUTO_1_N ] = pixmap->copy (94,119,33,12); buttons[ EQ_BT_AUTO_1_P ] = pixmap->copy (153,119,33,12); buttons[ EQ_BT_AUTO_0_N ] = pixmap->copy (35, 119,33,12); buttons[ EQ_BT_AUTO_0_P ] = pixmap->copy (212,119,33,12); buttons[ EQ_BT_CLOSE_N ] = pixmap->copy (0,116,9,9); buttons[ EQ_BT_CLOSE_P ] = pixmap->copy (0,125,9,9); buttons[ EQ_BT_SHADE1_N ] = pixmap->copy (254,137,9,9); for (int i = 0; i < 19; ++i) { m_eq_spline << pixmap->copy (115, 294+i, 1, 1); } delete pixmap; } void Skin::loadEq_ex() { QPixmap *pixmap = getPixmap ("eq_ex"); if (!pixmap) pixmap = getDummyPixmap("eq_ex"); buttons[ EQ_BT_SHADE1_P ] = pixmap->copy (1,38,9,9); buttons[ EQ_BT_SHADE2_N ] = pixmap->copy (254,3,9,9); buttons[ EQ_BT_SHADE2_P ] = pixmap->copy (1,47,9,9); m_eq_parts[ EQ_TITLEBAR_SHADED_A ] = pixmap->copy(0,0,275,14); m_eq_parts[ EQ_TITLEBAR_SHADED_I ] = pixmap->copy(0,15,275,14); m_eq_parts[ EQ_VOLUME1 ] = pixmap->copy(1,30,3,8); m_eq_parts[ EQ_VOLUME2 ] = pixmap->copy(4,30,3,8); m_eq_parts[ EQ_VOLUME3 ] = pixmap->copy(7,30,3,8); m_eq_parts[ EQ_BALANCE1 ] = pixmap->copy(11,30,3,8); m_eq_parts[ EQ_BALANCE2 ] = pixmap->copy(14,30,3,8); m_eq_parts[ EQ_BALANCE3 ] = pixmap->copy(17,30,3,8); delete pixmap; } void Skin::loadVisColor() { QString path = findFile("viscolor.txt", m_skin_dir); if (path.isEmpty()) path = findFile("viscolor.txt", ":/default"); if (path.isEmpty()) qFatal("Skin: invalid default skin"); QFile file(path); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) qFatal("Skin: unable to open %s", qPrintable(path)); int j = 0; while (!file.atEnd () && j<24) { j++; QByteArray line = file.readLine (); QString tmp = QString::fromAscii (line); tmp = tmp.trimmed (); int i = tmp.indexOf ("//"); if (i>0) tmp.truncate (tmp.indexOf ("//")); QStringList list = tmp.split (","); if (list.count () >= 3) { //colors int r = list.at (0).toInt(); int g = list.at (1).toInt(); int b = list.at (2).toInt(); m_vis_colors << QColor (r,g,b); } else if (line.length() == 0) { break; } } if (m_vis_colors.size() < 24) { qWarning ("Skin: cannot parse viscolor.txt"); while (m_vis_colors.size() < 24) m_vis_colors << QColor (0,0,0); } } void Skin::loadShufRep() { QPixmap *pixmap = getPixmap ("shufrep"); if (!pixmap) pixmap = getDummyPixmap("shufrep"); buttons[ BT_EQ_ON_N ] = pixmap->copy (0,73,23,12); buttons[ BT_EQ_ON_P ] = pixmap->copy (46,73,23,12); buttons[ BT_EQ_OFF_N ] = pixmap->copy (0,61,23,12); buttons[ BT_EQ_OFF_P ] = pixmap->copy (46,61,23,12); buttons[ BT_PL_ON_N ] = pixmap->copy (23,73,23,12); buttons[ BT_PL_ON_P ] = pixmap->copy (69,73,23,12); buttons[ BT_PL_OFF_N ] = pixmap->copy (23,61,23,12); buttons[ BT_PL_OFF_P ] = pixmap->copy (69,61,23,12); //buttons[ BT_PL_CLOSE_N ] = pixmap->copy (); //buttons[ BT_PL_CLOSE_P ] = pixmap->copy (); buttons[REPEAT_ON_N] = pixmap->copy (0,30, 28, 15); buttons[REPEAT_ON_P] = pixmap->copy (0,45, 28, 15); buttons[REPEAT_OFF_N] = pixmap->copy (0, 0,28,15); buttons[REPEAT_OFF_P] = pixmap->copy (0,15,28,15); buttons[SHUFFLE_ON_N] = pixmap->copy (28,30,46,15); buttons[SHUFFLE_ON_P] = pixmap->copy (28,45,46,15); buttons[SHUFFLE_OFF_N] = pixmap->copy (28, 0,46,15); buttons[SHUFFLE_OFF_P] = pixmap->copy (28,15,46,15); delete pixmap; } void Skin::loadLetters(void) { QPixmap *img = getPixmap("text"); if (!img) img = getDummyPixmap("text"); QList<QList<QPixmap> > (letters); for (int i = 0; i < 3; i++) { QList<QPixmap> (l); for (int j = 0; j < 31; j++) { l.append (img->copy (j*5, i*6, 5, 6)); } letters.append (l); } delete img; /* alphabet */ for (uint i = 97; i < 123; i++) { m_letters.insert(i, letters[0][i-97]); } /* digits */ for (uint i = 0; i <= 9; i++) { m_letters.insert (i+48, letters[1][i]); } /* special characters */ m_letters.insert('"', letters[0][27]); m_letters.insert('@', letters[0][28]); m_letters.insert(':', letters[1][12]); m_letters.insert('(', letters[1][13]); m_letters.insert(')', letters[1][14]); m_letters.insert('-', letters[1][15]); m_letters.insert('\'', letters[1][16]); m_letters.insert('`', letters[1][16]); m_letters.insert('!', letters[1][17]); m_letters.insert('_', letters[1][18]); m_letters.insert('+', letters[1][19]); m_letters.insert('\\', letters[1][20]); m_letters.insert('/', letters[1][21]); m_letters.insert('[', letters[1][22]); m_letters.insert(']', letters[1][23]); m_letters.insert('^', letters[1][24]); m_letters.insert('&', letters[1][25]); m_letters.insert('%', letters[1][26]); m_letters.insert('.', letters[1][27]); m_letters.insert(',', letters[1][27]); m_letters.insert('=', letters[1][28]); m_letters.insert('$', letters[1][29]); m_letters.insert('#', letters[1][30]); m_letters.insert(229, letters[2][0]); m_letters.insert(246, letters[2][1]); m_letters.insert(228, letters[2][2]); m_letters.insert('?', letters[2][3]); m_letters.insert('*', letters[2][4]); m_letters.insert(' ', letters[2][5]); /* text background */ //m_items->insert (TEXTBG, letters[2][6]); } void Skin::loadMonoSter() { QPixmap *pixmap = getPixmap("monoster"); if (!pixmap) pixmap = getDummyPixmap("monoster"); m_ms_parts.clear(); m_ms_parts[ MONO_A ] = pixmap->copy (29,0,27,12); m_ms_parts[ MONO_I ] = pixmap->copy (29,12,27,12); m_ms_parts[ STEREO_A ] = pixmap->copy (0,0,27,12); m_ms_parts[ STEREO_I ] = pixmap->copy (0,12,27,12); delete pixmap; m_parts.clear(); QPainter paint; pixmap = getPixmap("playpaus"); if (!pixmap) pixmap = getDummyPixmap("playpaus"); QPixmap part(11, 9); paint.begin(&part); paint.drawPixmap (0, 0, 3, 9, *pixmap, 36, 0, 3, 9); paint.drawPixmap (3, 0, 8, 9, *pixmap, 1, 0, 8, 9); paint.end(); m_parts [PLAY] = part.copy(); part = QPixmap(11, 9); paint.begin(&part); paint.drawPixmap (0, 0, 2, 9, *pixmap, 27, 0, 2, 9); paint.drawPixmap (2, 0, 9, 9, *pixmap, 9, 0, 9, 9); paint.end(); m_parts [PAUSE] = part.copy(); part = QPixmap(11, 9); paint.begin(&part); paint.drawPixmap (0, 0, 2, 9, *pixmap, 27, 0, 2, 9); paint.drawPixmap (2, 0, 9, 9, *pixmap, 18, 0, 9, 9); paint.end(); m_parts [STOP] = part.copy(); delete pixmap; } void Skin::loadVolume() { QPixmap *pixmap = getPixmap("volume"); if (!pixmap) pixmap = getDummyPixmap("volume"); m_volume.clear(); for (int i = 0; i < 28; ++i) m_volume.append(pixmap->copy (0,i*15, pixmap->width(),13)); if (pixmap->height() > 425) { buttons [BT_VOL_N] = pixmap->copy (15,422,14, pixmap->height() - 422); buttons [BT_VOL_P] = pixmap->copy (0, 422,14, pixmap->height() - 422); } else { buttons [BT_VOL_N] = QPixmap(); buttons [BT_VOL_P] = QPixmap(); } delete pixmap; } void Skin::loadBalance() { QPixmap *pixmap = getPixmap ("balance"); if (!pixmap) pixmap = getPixmap ("volume"); if (!pixmap) pixmap = getDummyPixmap("balance"); m_balance.clear(); for (int i = 0; i < 28; ++i) m_balance.append(pixmap->copy (9,i*15,38,13)); if (pixmap->height() > 427) { buttons [BT_BAL_N] = pixmap->copy (15, 422,14,pixmap->height()-422); buttons [BT_BAL_P] = pixmap->copy (0,422,14,pixmap->height()-422); } else { buttons [BT_BAL_N] = QPixmap(); buttons [BT_BAL_P] = QPixmap(); } delete pixmap; } void Skin::loadRegion() { m_regions.clear(); QString path = findFile("region.txt", m_skin_dir); if (path.isNull ()) { qDebug ("Skin: cannot find region.txt. Transparency disabled"); return; } m_regions[NORMAL] = createRegion(path, "Normal"); m_regions[EQUALIZER] = createRegion(path, "Equalizer"); m_regions[WINDOW_SHADE] = createRegion(path, "WindowShade"); m_regions[EQUALIZER_WS] = createRegion(path, "EqualizerWS"); } QRegion Skin::createRegion(const QString &path, const QString &key) { QRegion region; QSettings settings(path, QSettings::IniFormat); QStringList numPoints = settings.value(key+"/NumPoints").toStringList(); QStringList value = settings.value(key+"/PointList").toStringList(); QStringList numbers; foreach(QString str, value) numbers << str.split(" ", QString::SkipEmptyParts); QList <QRegion> regions; QList<QString>::iterator n; n = numbers.begin(); int r = m_double_size ? 2 : 1; for (int i = 0; i < numPoints.size(); ++i) { QList <int> lp; for (int j = 0; j < numPoints.at(i).toInt()*2; j++) { lp << n->toInt(); n ++; } QVector<QPoint> points; for (int l = 0; l < lp.size(); l+=2) { points << QPoint(lp.at(l)*r, lp.at(l+1)*r); } region = region.united(QRegion(QPolygon(points))); } return region; } QPixmap * Skin::getDummyPixmap(const QString& name) { QDir dir (":/default"); dir.setFilter (QDir::Files | QDir::Hidden | QDir::NoSymLinks); QFileInfoList f = dir.entryInfoList(); for (int j = 0; j < f.size(); ++j) { QFileInfo fileInfo = f.at (j); QString fn = fileInfo.fileName().toLower(); if (fn.section (".",0,0) == name) { return new QPixmap (fileInfo.filePath()); } } qFatal("Skin: default skin is corrupted"); return 0; } QPixmap Skin::scalePixmap(const QPixmap &pix, int ratio) { return pix.scaled(pix.width() * ratio, pix.height() * ratio, Qt::KeepAspectRatio); } const QString Skin::findFile(const QString &name, QDir dir) { dir.setFilter (QDir::Files | QDir::Hidden | QDir::NoSymLinks); QString path; QFileInfoList list = dir.entryInfoList(); for (int i = 0; i < list.size(); ++i) { QFileInfo fileInfo = list.at (i); if (fileInfo.fileName().toLower() == name) { path = fileInfo.filePath (); break; } } return path; } const QString Skin::findFile(const QString &name, const QString &dir) { return findFile(name, QDir(dir)); }