aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/mad
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/Input/mad')
-rw-r--r--src/plugins/Input/mad/CMakeLists.txt90
-rw-r--r--src/plugins/Input/mad/decoder_mad.cpp572
-rw-r--r--src/plugins/Input/mad/decoder_mad.h95
-rw-r--r--src/plugins/Input/mad/decodermadfactory.cpp188
-rw-r--r--src/plugins/Input/mad/decodermadfactory.h53
-rw-r--r--src/plugins/Input/mad/detailsdialog.cpp294
-rw-r--r--src/plugins/Input/mad/detailsdialog.h63
-rw-r--r--src/plugins/Input/mad/detailsdialog.ui392
-rw-r--r--src/plugins/Input/mad/mad.pro39
-rw-r--r--src/plugins/Input/mad/settingsdialog.cpp107
-rw-r--r--src/plugins/Input/mad/settingsdialog.h52
-rw-r--r--src/plugins/Input/mad/settingsdialog.ui306
-rw-r--r--src/plugins/Input/mad/translations/mad_plugin_ru.qmbin0 -> 3625 bytes
-rw-r--r--src/plugins/Input/mad/translations/mad_plugin_ru.ts242
-rw-r--r--src/plugins/Input/mad/translations/translations.qrc6
-rw-r--r--src/plugins/Input/mad/ui_detailsdialog.h400
-rw-r--r--src/plugins/Input/mad/ui_settingsdialog.h245
17 files changed, 3144 insertions, 0 deletions
diff --git a/src/plugins/Input/mad/CMakeLists.txt b/src/plugins/Input/mad/CMakeLists.txt
new file mode 100644
index 000000000..3e4dfa9d0
--- /dev/null
+++ b/src/plugins/Input/mad/CMakeLists.txt
@@ -0,0 +1,90 @@
+project(libmad)
+
+cmake_minimum_required(VERSION 2.4.0)
+
+
+INCLUDE(UsePkgConfig)
+INCLUDE(FindQt4)
+
+find_package(Qt4 REQUIRED) # find and setup Qt4 for this project
+include(${QT_USE_FILE})
+
+# qt plugin
+ADD_DEFINITIONS( -Wall )
+ADD_DEFINITIONS(${QT_DEFINITIONS})
+ADD_DEFINITIONS(-DQT_PLUGIN)
+ADD_DEFINITIONS(-DQT_NO_DEBUG)
+ADD_DEFINITIONS(-DQT_SHARED)
+ADD_DEFINITIONS(-DQT_THREAD)
+
+include_directories(${CMAKE_CURRENT_BINARY_DIR})
+
+SET(QT_INCLUDES
+ ${QT_INCLUDES}
+ ${CMAKE_CURRENT_BINARY_DIR}/../../../
+)
+
+# libqmmp
+include_directories(${CMAKE_CURRENT_BINARY_DIR}/../../../)
+link_directories(${CMAKE_CURRENT_BINARY_DIR}/../../../)
+
+# libmad and taglib
+PKGCONFIG(mad MAD_INCLUDE_DIR MAD_LINK_DIR MAD_LINK_FLAGS MAD_CFLAGS)
+PKGCONFIG(taglib TAGLIB_INCLUDE_DIR TAGLIB_LINK_DIR TAGLIB_LINK_FLAGS TAGLIB_CFLAGS)
+
+IF(NOT MAD_LINK_FLAGS)
+ MESSAGE("Can not find mad.pc")
+ SET(MAD_LINK_FLAGS -lmad)
+ENDIF(NOT MAD_LINK_FLAGS)
+
+IF(NOT TAGLIB_LINK_FLAGS)
+ SET(TAGLIB_LINK_FLAGS -ltag)
+ SET(TAGLIB_INCLUDE_DIR /usr/include/taglib)
+ SET(TAGLIB_CFLAGS -I/usr/include/taglib)
+ENDIF(NOT TAGLIB_LINK_FLAGS)
+
+include_directories(${MAD_INCLUDE_DIR} ${TAGLIB_INCLUDE_DIR})
+link_directories(${MAD_LINK_DIR} ${TAGLIB_LINK_DIR})
+
+#ADD_DEFINITIONS(${MAD_CFLAGS})
+ADD_DEFINITIONS(${TAGLIB_CFLAGS})
+
+
+SET(libmad_SRCS
+ decoder_mad.cpp
+ decodermadfactory.cpp
+ detailsdialog.cpp
+ settingsdialog.cpp
+)
+
+SET(libmad_MOC_HDRS
+ settingsdialog.h
+ decodermadfactory.h
+ decoder_mad.h
+ detailsdialog.h
+)
+
+SET(libmad_RCCS translations/translations.qrc)
+
+QT4_ADD_RESOURCES(libmad_RCC_SRCS ${libmad_RCCS})
+
+QT4_WRAP_CPP(libmad_MOC_SRCS ${libmad_MOC_HDRS})
+
+# user interface
+
+
+SET(libmad_UIS
+ detailsdialog.ui
+ settingsdialog.ui
+)
+
+QT4_WRAP_UI(libmad_UIS_H ${libmad_UIS})
+# Don't forget to include output directory, otherwise
+# the UI file won't be wrapped!
+include_directories(${CMAKE_CURRENT_BINARY_DIR})
+
+ADD_LIBRARY(mad SHARED ${libmad_SRCS} ${libmad_MOC_SRCS} ${libmad_UIS_H}
+ ${libmad_RCC_SRCS})
+
+target_link_libraries(mad ${QT_LIBRARIES} -lqmmp ${MAD_LINK_FLAGS} ${TAGLIB_LINK_FLAGS} ${TAGLIB_CFLAGS})
+install(TARGETS mad DESTINATION ${LIB_DIR}/qmmp/Input PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ)
diff --git a/src/plugins/Input/mad/decoder_mad.cpp b/src/plugins/Input/mad/decoder_mad.cpp
new file mode 100644
index 000000000..6b4c2569a
--- /dev/null
+++ b/src/plugins/Input/mad/decoder_mad.cpp
@@ -0,0 +1,572 @@
+#include <QtGui>
+
+#include "decoder_mad.h"
+#include "constants.h"
+#include "buffer.h"
+#include "output.h"
+
+#include <math.h>
+#include <stdio.h>
+
+# define XING_MAGIC (('X' << 24) | ('i' << 16) | ('n' << 8) | 'g')
+
+
+DecoderMAD::DecoderMAD(QObject *parent, DecoderFactory *d, QIODevice *i, Output *o)
+ : Decoder(parent, d, i, o)
+{
+ inited = false;
+ user_stop = false;
+ done = false;
+ finish = false;
+ derror = false;
+ eof = false;
+ useeq = false;
+ totalTime = 0.;
+ seekTime = -1.;
+ channels = 0;
+ bks = 0;
+ bitrate = 0;
+ freq = 0;
+ len = 0;
+ input_buf = 0;
+ input_bytes = 0;
+ output_buf = 0;
+ output_bytes = 0;
+ output_at = 0;
+ output_size = 0;
+}
+
+DecoderMAD::~DecoderMAD()
+{
+ wait();
+ deinit();
+ mutex()->lock();
+ if (input_buf)
+ {
+ qDebug("DecoderMAD: deleting input_buf");
+ delete [] input_buf;
+ }
+ input_buf = 0;
+
+ if (output_buf)
+ {
+ qDebug("DecoderMAD: deleting output_buf");
+ delete [] output_buf;
+ }
+ output_buf = 0;
+ mutex()->unlock();
+}
+
+bool DecoderMAD::initialize()
+{
+ bks = blockSize();
+
+ inited = false;
+ user_stop = false;
+ done = false;
+ finish = false;
+ derror = false;
+ eof = false;
+ totalTime = 0.;
+ seekTime = -1.;
+ channels = 0;
+ bitrate = 0;
+ freq = 0;
+ len = 0;
+ input_bytes = 0;
+ output_bytes = 0;
+ output_at = 0;
+ output_size = 0;
+
+ if (! input())
+ {
+ error("DecoderMAD: cannot initialize. No input.");
+ return FALSE;
+ }
+
+ if (! input_buf)
+ input_buf = new char[globalBufferSize];
+
+ if (! output_buf)
+ output_buf = new char[globalBufferSize];
+
+ if (! input()->isOpen())
+ {
+ if (! input()->open(QIODevice::ReadOnly))
+ {
+ error("DecoderMAD: Failed to open input. Error " +
+ QString::number(input()->isOpen()) + ".");
+ return FALSE;
+ }
+ }
+
+ mad_stream_init(&stream);
+ mad_frame_init(&frame);
+ mad_synth_init(&synth);
+
+ if (! findHeader())
+ {
+ qDebug("DecoderMAD: Cannot find a valid MPEG header.");
+ return FALSE;
+ }
+ configure(freq, channels, 16, bitrate);
+
+ inited = TRUE;
+ return TRUE;
+}
+
+
+void DecoderMAD::deinit()
+{
+ if(!inited)
+ return;
+
+ mad_synth_finish(&synth);
+ mad_frame_finish(&frame);
+ mad_stream_finish(&stream);
+
+ inited = false;
+ user_stop = false;
+ done = false;
+ finish = false;
+ derror = false;
+ eof = false;
+ useeq = false;
+ totalTime = 0.;
+ seekTime = -1.;
+ channels = 0;
+ bks = 0;
+ bitrate = 0;
+ freq = 0;
+ len = 0;
+ input_bytes = 0;
+ output_bytes = 0;
+ output_at = 0;
+ output_size = 0;
+}
+
+bool DecoderMAD::findXingHeader(struct mad_bitptr ptr, unsigned int bitlen)
+{
+ if (bitlen < 64 || mad_bit_read(&ptr, 32) != XING_MAGIC)
+ goto fail;
+
+ xing.flags = mad_bit_read(&ptr, 32);
+ bitlen -= 64;
+
+ if (xing.flags & XING_FRAMES)
+ {
+ if (bitlen < 32)
+ goto fail;
+
+ xing.frames = mad_bit_read(&ptr, 32);
+ bitlen -= 32;
+ }
+
+ if (xing.flags & XING_BYTES)
+ {
+ if (bitlen < 32)
+ goto fail;
+
+ xing.bytes = mad_bit_read(&ptr, 32);
+ bitlen -= 32;
+ }
+
+ if (xing.flags & XING_TOC)
+ {
+ int i;
+
+ if (bitlen < 800)
+ goto fail;
+
+ for (i = 0; i < 100; ++i)
+ xing.toc[i] = mad_bit_read(&ptr, 8);
+
+ bitlen -= 800;
+ }
+
+ if (xing.flags & XING_SCALE)
+ {
+ if (bitlen < 32)
+ goto fail;
+
+ xing.scale = mad_bit_read(&ptr, 32);
+ bitlen -= 32;
+ }
+
+ return true;
+
+fail:
+ xing.flags = 0;
+ xing.frames = 0;
+ xing.bytes = 0;
+ xing.scale = 0;
+ return false;
+}
+
+bool DecoderMAD::findHeader()
+{
+ bool result = false;
+ int count = 0;
+
+ while (1)
+ {
+ if (input_bytes < globalBufferSize)
+ {
+ int bytes = input()->read(input_buf + input_bytes,
+ globalBufferSize - input_bytes);
+ if (bytes <= 0)
+ {
+ if (bytes == -1)
+ result = false;
+ ;
+ break;
+ }
+ input_bytes += bytes;
+ }
+
+ mad_stream_buffer(&stream, (unsigned char *) input_buf, input_bytes);
+
+ bool done = false;
+ while (! done)
+ {
+ if (mad_frame_decode(&frame, &stream) != -1)
+ done = true;
+ else if (!MAD_RECOVERABLE(stream.error))
+ {
+ qWarning("DecoderMAD: Can't decode frame");
+ break;
+ }
+
+ count++;
+ }
+
+ findXingHeader(stream.anc_ptr, stream.anc_bitlen);
+ result = done;
+ if ((stream.error != MAD_ERROR_BUFLEN))
+ break;
+
+ input_bytes = &input_buf[input_bytes] - (char *) stream.next_frame;
+ memmove(input_buf, stream.next_frame, input_bytes);
+ }
+
+ if (result && count)
+ {
+ freq = frame.header.samplerate;
+ channels = MAD_NCHANNELS(&frame.header);
+ bitrate = frame.header.bitrate / 1000;
+ calcLength(&frame.header);
+ }
+
+ return result;
+}
+
+void DecoderMAD::calcLength(struct mad_header *header)
+{
+ if (! input() || input()->isSequential())
+ return;
+
+ totalTime = 0.;
+ if (xing.flags & XING_FRAMES)
+ {
+ mad_timer_t timer;
+
+ timer = header->duration;
+ mad_timer_multiply(&timer, xing.frames);
+
+ totalTime = double(mad_timer_count(timer, MAD_UNITS_MILLISECONDS)) / 1000.;
+ }
+ else if (header->bitrate > 0)
+ totalTime = input()->size() * 8 / header->bitrate;
+}
+
+double DecoderMAD::lengthInSeconds()
+{
+ if (! inited)
+ return 0.;
+ return totalTime;
+}
+
+void DecoderMAD::seek(double pos)
+{
+ seekTime = pos;
+}
+
+void DecoderMAD::stop()
+{
+ user_stop = TRUE;
+}
+
+void DecoderMAD::flush(bool final)
+{
+ ulong min = final ? 0 : bks;
+
+ while ((! done && ! finish) && output_bytes > min)
+ {
+ output()->recycler()->mutex()->lock();
+
+ while ((! done && ! finish) && output()->recycler()->full())
+ {
+ mutex()->unlock();
+ output()->recycler()->cond()->wait(output()->recycler()->mutex());
+
+ mutex()->lock();
+ done = user_stop;
+ }
+
+ if (user_stop || finish)
+ {
+ inited = FALSE;
+ done = TRUE;
+ }
+ else
+ {
+ output_bytes -= produceSound(output_buf, output_bytes, bitrate, channels);
+ output_size += bks;
+ output_at = output_bytes;
+ }
+
+ if (output()->recycler()->full())
+ {
+ output()->recycler()->cond()->wakeOne();
+ }
+
+ output()->recycler()->mutex()->unlock();
+ }
+}
+
+void DecoderMAD::run()
+{
+ mutex()->lock();
+
+ if (! inited)
+ {
+ mutex()->unlock();
+ return;
+ }
+
+ DecoderState::Type stat = DecoderState::Decoding;
+
+ mutex()->unlock();
+
+ dispatch(stat);
+
+ while (! done && ! finish && ! derror)
+ {
+ mutex()->lock();
+
+ if (seekTime >= 0.0)
+ {
+ long seek_pos = long(seekTime * input()->size() / totalTime);
+ input()->seek(seek_pos);
+ output_size = long(seekTime) * long(freq * channels * 16 / 2);
+ input_bytes = 0;
+ output_at = 0;
+ output_bytes = 0;
+ eof = false;
+ }
+
+ finish = eof;
+
+ if (! eof)
+ {
+ if (stream.next_frame && seekTime == -1.)
+ {
+ input_bytes = &input_buf[input_bytes] - (char *) stream.next_frame;
+ memmove(input_buf, stream.next_frame, input_bytes);
+ }
+
+ if (input_bytes < globalBufferSize)
+ {
+ int len = input()->read((char *) input_buf + input_bytes,
+ globalBufferSize - input_bytes);
+
+ if (len == 0)
+ {
+ eof = true;
+ }
+ else if (len < 0)
+ {
+ derror = true;
+ break;
+ }
+
+ input_bytes += len;
+ }
+
+ mad_stream_buffer(&stream, (unsigned char *) input_buf, input_bytes);
+ }
+
+ seekTime = -1.;
+
+ mutex()->unlock();
+
+ // decode
+ while (! done && ! finish && ! derror)
+ {
+ if (mad_frame_decode(&frame, &stream) == -1)
+ {
+ if (stream.error == MAD_ERROR_BUFLEN)
+ break;
+
+ // error in decoding
+ if (! MAD_RECOVERABLE(stream.error))
+ {
+ derror = true;
+ break;
+ }
+ continue;
+ }
+
+ mutex()->lock();
+
+ if (seekTime >= 0.)
+ {
+ mutex()->unlock();
+ break;
+ }
+
+ if (useeq)
+ {
+ unsigned int nch, ch, ns, s, sb;
+
+ nch = MAD_NCHANNELS(&frame.header);
+ ns = MAD_NSBSAMPLES(&frame.header);
+
+ for (ch = 0; ch < nch; ++ch)
+ for (s = 0; s < ns; ++s)
+ for (sb = 0; sb < 32; ++sb)
+ frame.sbsample[ch][s][sb] =
+ mad_f_mul(frame.sbsample[ch][s][sb], eqbands[sb]);
+ }
+
+ mad_synth_frame(&synth, &frame);
+ madOutput();
+ mutex()->unlock();
+ }
+ }
+
+ mutex()->lock();
+
+ if (! user_stop && eof)
+ {
+ flush(TRUE);
+
+ if (output())
+ {
+ output()->recycler()->mutex()->lock();
+ // end of stream
+ while (! output()->recycler()->empty() && ! user_stop)
+ {
+ output()->recycler()->cond()->wakeOne();
+ mutex()->unlock();
+ output()->recycler()->cond()->wait(output()->recycler()->mutex());
+ mutex()->lock();
+ }
+ output()->recycler()->mutex()->unlock();
+ }
+
+ done = TRUE;
+ if (! user_stop)
+ finish = TRUE;
+ }
+
+ if (finish)
+ stat = DecoderState::Finished;
+ else if (user_stop)
+ stat = DecoderState::Stopped;
+
+ mutex()->unlock();
+
+ dispatch(stat);
+
+ if (input())
+ input()->close();
+ deinit();
+
+}
+
+static inline signed int scale(mad_fixed_t sample)
+{
+ /* round */
+ sample += (1L << (MAD_F_FRACBITS - 16));
+
+ /* clip */
+ if (sample >= MAD_F_ONE)
+ sample = MAD_F_ONE - 1;
+ else if (sample < -MAD_F_ONE)
+ sample = -MAD_F_ONE;
+
+ /* quantize */
+ return sample >> (MAD_F_FRACBITS + 1 - 16);
+}
+
+static inline signed long fix_sample(unsigned int bits, mad_fixed_t sample)
+{
+ mad_fixed_t quantized, check;
+ // clip
+ quantized = sample;
+ check = (sample >> MAD_F_FRACBITS) + 1;
+ if (check & ~1)
+ {
+ if (sample >= MAD_F_ONE)
+ quantized = MAD_F_ONE - 1;
+ else if (sample < -MAD_F_ONE)
+ quantized = -MAD_F_ONE;
+ }
+ // quantize
+ quantized &= ~((1L << (MAD_F_FRACBITS + 1 - bits)) - 1);
+ // scale
+ return quantized >> (MAD_F_FRACBITS + 1 - bits);
+}
+
+enum mad_flow DecoderMAD::madOutput()
+{
+ unsigned int samples, channels;
+ mad_fixed_t const *left, *right;
+
+ samples = synth.pcm.length;
+ channels = synth.pcm.channels;
+ left = synth.pcm.samples[0];
+ right = synth.pcm.samples[1];
+
+
+ bitrate = frame.header.bitrate / 1000;
+ done = user_stop;
+
+ while (samples-- && !user_stop)
+ {
+ signed int sample;
+
+ if (output_bytes + 4096 > globalBufferSize)
+ flush();
+
+ sample = fix_sample(16, *left++);
+ *(output_buf + output_at++) = ((sample >> 0) & 0xff);
+ *(output_buf + output_at++) = ((sample >> 8) & 0xff);
+ output_bytes += 2;
+
+ if (channels == 2)
+ {
+ sample = fix_sample(16, *right++);
+ *(output_buf + output_at++) = ((sample >> 0) & 0xff);
+ *(output_buf + output_at++) = ((sample >> 8) & 0xff);
+ output_bytes += 2;
+ }
+ }
+
+ if (done || finish)
+ {
+ return MAD_FLOW_STOP;
+ }
+
+ return MAD_FLOW_CONTINUE;
+}
+
+enum mad_flow DecoderMAD::madError(struct mad_stream *stream,
+ struct mad_frame *)
+{
+ if (MAD_RECOVERABLE(stream->error))
+ return MAD_FLOW_CONTINUE;
+ qFatal("MADERROR!\n");
+ return MAD_FLOW_STOP;
+}
diff --git a/src/plugins/Input/mad/decoder_mad.h b/src/plugins/Input/mad/decoder_mad.h
new file mode 100644
index 000000000..ecbb160cb
--- /dev/null
+++ b/src/plugins/Input/mad/decoder_mad.h
@@ -0,0 +1,95 @@
+// Copyright (c) 2000-2001 Brad Hughes <bhughes@trolltech.com>
+//
+// Use, modification and distribution is allowed without limitation,
+// warranty, or liability of any kind.
+//
+
+#ifndef __decoder_mad_h
+#define __decoder_mad_h
+
+class DecoderMAD;
+
+#include "decoder.h"
+#include "decodermadfactory.h"
+
+extern "C" {
+#include <mad.h>
+}
+
+
+class DecoderMAD : public Decoder
+{
+public:
+ DecoderMAD(QObject *parent = 0, DecoderFactory *d = 0,
+ QIODevice *i = 0, Output *o = 0);
+ virtual ~DecoderMAD();
+
+ // standard decoder API
+ bool initialize();
+ double lengthInSeconds();
+ void seek(double);
+ void stop();
+
+ // Equalizer
+ //bool isEQSupported() const { return TRUE; }
+ //void setEQEnabled(bool);
+ //void setEQ(const EqPreset &);
+
+ static const int maxDecodeRetries;
+ static const int maxFrameSize;
+ static const int maxFrameCheck;
+ static const int initialFrameSize;
+
+
+private:
+ // thread run function
+ void run();
+
+ enum mad_flow madOutput();
+ enum mad_flow madError(struct mad_stream *, struct mad_frame *);
+
+ // helper functions
+ void flush(bool = FALSE);
+ void deinit();
+ bool findHeader();
+ bool findXingHeader(struct mad_bitptr, unsigned int);
+ void calcLength(struct mad_header *);
+
+ bool inited, user_stop, done, finish, derror, eof, useeq;
+ double totalTime, seekTime;
+ int channels;
+ long bitrate, freq, len;
+ unsigned int bks;
+ mad_fixed_t eqbands[32];
+
+ // file input buffer
+ char *input_buf;
+ unsigned long input_bytes;
+
+ // output buffer
+ char *output_buf;
+ unsigned long output_bytes, output_at, output_size;
+
+ // MAD decoder
+ struct {
+ int flags;
+ unsigned long frames;
+ unsigned long bytes;
+ unsigned char toc[100];
+ long scale;
+ } xing;
+
+ enum {
+ XING_FRAMES = 0x0001,
+ XING_BYTES = 0x0002,
+ XING_TOC = 0x0004,
+ XING_SCALE = 0x0008
+ };
+
+ struct mad_stream stream;
+ struct mad_frame frame;
+ struct mad_synth synth;
+};
+
+
+#endif // __decoder_mad_h
diff --git a/src/plugins/Input/mad/decodermadfactory.cpp b/src/plugins/Input/mad/decodermadfactory.cpp
new file mode 100644
index 000000000..8bb04aca1
--- /dev/null
+++ b/src/plugins/Input/mad/decodermadfactory.cpp
@@ -0,0 +1,188 @@
+#include <QtGui>
+#include <QDialog>
+#include <QMessageBox>
+#include <mad.h>
+#include <taglib/tag.h>
+#include <taglib/fileref.h>
+#include <taglib/id3v1tag.h>
+#include <taglib/id3v2tag.h>
+#include <taglib/apetag.h>
+#include <taglib/tfile.h>
+#include <taglib/mpegfile.h>
+
+#include "detailsdialog.h"
+#include "settingsdialog.h"
+#include "decoder_mad.h"
+#include "decodermadfactory.h"
+
+// DecoderMADFactory
+
+bool DecoderMADFactory::supports(const QString &source) const
+{
+ QString ext = source.right(4).toLower();
+ return ext == ".mp1" || ext == ".mp2" || ext == ".mp3";
+}
+
+bool DecoderMADFactory::canDecode(QIODevice *input) const
+{
+ char buf[16 * 512];
+
+ if (input->peek(buf,sizeof(buf)) == sizeof(buf))
+ {
+ struct mad_stream stream;
+ struct mad_header header;
+ int dec_res;
+
+ mad_stream_init (&stream);
+ mad_header_init (&header);
+ mad_stream_buffer (&stream, (unsigned char *) buf, sizeof(buf));
+ stream.error = MAD_ERROR_NONE;
+
+ while ((dec_res = mad_header_decode(&header, &stream)) == -1
+ && MAD_RECOVERABLE(stream.error))
+ ;
+ return dec_res != -1 ? TRUE: FALSE;
+ }
+ return FALSE;
+}
+
+const DecoderProperties DecoderMADFactory::properties() const
+{
+ DecoderProperties properties;
+ properties.name = tr("MPEG Plugin");
+ properties.filter = "*.mp1 *.mp2 *.mp3";
+ properties.description = tr("MPEG Files");
+ properties.contentType = "audio/mp3;audio/mpeg";
+ properties.hasAbout = TRUE;
+ properties.hasSettings = TRUE;
+ return properties;
+}
+
+Decoder *DecoderMADFactory::create(QObject *parent, QIODevice *input, Output *output)
+{
+ return new DecoderMAD(parent, this, input, output);
+}
+
+FileTag *DecoderMADFactory::createTag(const QString &source)
+{
+ FileTag *ftag = new FileTag();
+ TagLib::Tag *tag = 0;
+ TagLib::MPEG::File fileRef(source.toLocal8Bit ());
+
+ QSettings settings(QDir::homePath()+"/.qmmp/qmmprc", QSettings::IniFormat);
+ settings.beginGroup("MAD");
+ QTextCodec *codec_v1 =
+ QTextCodec::codecForName(settings.value("ID3v1_encoding","UTF-8" )
+ .toByteArray ());
+ QTextCodec *codec_v2 =
+ QTextCodec::codecForName(settings.value("ID3v2_encoding","UTF-8" )
+ .toByteArray ());
+ if (!codec_v1)
+ codec_v1 = QTextCodec::codecForName ("UTF-8");
+ if (!codec_v2)
+ codec_v2 = QTextCodec::codecForName ("UTF-8");
+
+ QTextCodec *codec = 0;
+
+ uint tag_array[3];
+ tag_array[0] = settings.value("tag_1", SettingsDialog::ID3v2).toInt();
+ tag_array[1] = settings.value("tag_2", SettingsDialog::Disabled).toInt();
+ tag_array[2] = settings.value("tag_3", SettingsDialog::Disabled).toInt();
+
+
+ for (int i = 0; i < 3; ++i)
+ {
+ switch ((uint) tag_array[i])
+ {
+ case SettingsDialog::ID3v1:
+ {
+ codec = codec_v1;
+ tag = fileRef.ID3v1Tag();
+ break;
+ }
+ case SettingsDialog::ID3v2:
+ {
+ codec = codec_v2;
+ tag = fileRef.ID3v2Tag();
+ break;
+ }
+ case SettingsDialog::APE:
+ {
+ codec = QTextCodec::codecForName ("UTF-8");
+ tag = fileRef.APETag();
+ break;
+ }
+ case SettingsDialog::Disabled:
+ {
+ break;
+ }
+ }
+ if(tag && !tag->isEmpty())
+ break;
+ }
+ settings.endGroup();
+
+ if (tag && codec)
+ {
+ bool utf = codec->name ().contains("UTF");
+ TagLib::String album = tag->album();
+ TagLib::String artist = tag->artist();
+ TagLib::String comment = tag->comment();
+ TagLib::String genre = tag->genre();
+ TagLib::String title = tag->title();
+
+ ftag->setValue(FileTag::ALBUM,
+ codec->toUnicode(album.toCString(utf)).trimmed());
+ ftag->setValue(FileTag::ARTIST,
+ codec->toUnicode(artist.toCString(utf)).trimmed());
+ ftag->setValue(FileTag::COMMENT,
+ codec->toUnicode(comment.toCString(utf)).trimmed());
+ ftag->setValue(FileTag::GENRE,
+ codec->toUnicode(genre.toCString(utf)).trimmed());
+ ftag->setValue(FileTag::TITLE,
+ codec->toUnicode(title.toCString(utf)).trimmed());
+ ftag->setValue(FileTag::YEAR,
+ tag->year());
+ ftag->setValue(FileTag::TRACK,
+ tag->track());
+ }
+ if (fileRef.audioProperties())
+ ftag->setValue(FileTag::LENGTH,fileRef.audioProperties()->length());
+ return ftag;
+}
+
+QObject* DecoderMADFactory::showDetails(QWidget *parent, const QString &path)
+{
+ DetailsDialog *d = new DetailsDialog(parent, path);
+ d -> show();
+ return d;
+}
+
+void DecoderMADFactory::showSettings(QWidget *parent)
+{
+ SettingsDialog *s = new SettingsDialog(parent);
+ s -> show();
+}
+
+void DecoderMADFactory::showAbout(QWidget *parent)
+{
+ QMessageBox::about (parent, tr("About MPEG Audio Plugin"),
+ tr("Qmmp MPEG Audio Plugin")+"\n"+
+ tr("Compiled against libmad version:")+" "+
+ QString("%1.%2.%3%4").arg(MAD_VERSION_MAJOR)
+ .arg(MAD_VERSION_MINOR)
+ .arg(MAD_VERSION_PATCH).arg(MAD_VERSION_EXTRA)+"\n"+
+ tr("Writen by: Ilya Kotov <forkotov02@hotmail.ru>")+"\n"+
+ tr("Source code based on mq3 progect")
+ );
+}
+
+QTranslator *DecoderMADFactory::createTranslator(QObject *parent)
+{
+ QTranslator *translator = new QTranslator(parent);
+ QString locale = QLocale::system().name();
+ translator->load(QString(":/mad_plugin_") + locale);
+ return translator;
+}
+
+Q_EXPORT_PLUGIN(DecoderMADFactory)
diff --git a/src/plugins/Input/mad/decodermadfactory.h b/src/plugins/Input/mad/decodermadfactory.h
new file mode 100644
index 000000000..2c7da8e47
--- /dev/null
+++ b/src/plugins/Input/mad/decodermadfactory.h
@@ -0,0 +1,53 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ilya Kotov *
+ * forkotov02@hotmail.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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+#ifndef DECODERMADFACTORY_H
+#define DECODERMADFACTORY_H
+
+#include <QObject>
+#include <QString>
+#include <QIODevice>
+#include <QWidget>
+
+#include <decoder.h>
+#include <output.h>
+#include <decoderfactory.h>
+
+
+
+
+class DecoderMADFactory : public QObject,
+ DecoderFactory
+{
+Q_OBJECT
+Q_INTERFACES(DecoderFactory);
+
+public:
+ bool supports(const QString &source) const;
+ bool canDecode(QIODevice *input) const;
+ const DecoderProperties properties() const;
+ Decoder *create(QObject *, QIODevice *, Output *);
+ FileTag *createTag(const QString &source);
+ QObject* showDetails(QWidget *parent, const QString &path);
+ void showSettings(QWidget *parent);
+ void showAbout(QWidget *parent);
+ QTranslator *createTranslator(QObject *parent);
+};
+
+#endif
diff --git a/src/plugins/Input/mad/detailsdialog.cpp b/src/plugins/Input/mad/detailsdialog.cpp
new file mode 100644
index 000000000..af9b466cd
--- /dev/null
+++ b/src/plugins/Input/mad/detailsdialog.cpp
@@ -0,0 +1,294 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ilya Kotov *
+ * forkotov02@hotmail.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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+#include <QTextCodec>
+#include <QSettings>
+#include <QDir>
+#include <QFile>
+#include <QFileInfo>
+
+#include <taglib/tag.h>
+#include <taglib/fileref.h>
+#include <taglib/id3v1tag.h>
+#include <taglib/id3v2tag.h>
+#include <taglib/apetag.h>
+#include <taglib/tfile.h>
+#include <taglib/mpegfile.h>
+#include <taglib/mpegheader.h>
+#include <taglib/mpegproperties.h>
+
+#include "detailsdialog.h"
+
+DetailsDialog::DetailsDialog(QWidget *parent, const QString &path)
+ : QDialog(parent)
+{
+ ui.setupUi(this);
+ setAttribute(Qt::WA_DeleteOnClose);
+ m_path = path;
+ setWindowTitle (path.section('/',-1));
+ ui.pathLineEdit->setText(m_path);
+
+ if (!QFile::exists(m_path))
+ return;
+
+ QSettings settings(QDir::homePath()+"/.qmmp/qmmprc", QSettings::IniFormat);
+ settings.beginGroup("MAD");
+ m_codec_v1 =
+ QTextCodec::codecForName(settings.value("ID3v1_encoding","UTF-8" )
+ .toByteArray ());
+ m_codec_v2 =
+ QTextCodec::codecForName(settings.value("ID3v2_encoding","UTF-8" )
+ .toByteArray ());
+ if (!m_codec_v1)
+ m_codec_v1 = QTextCodec::codecForName ("UTF-8");
+ if (!m_codec_v2)
+ m_codec_v2 = QTextCodec::codecForName ("UTF-8");
+
+ QString tag_name = settings.value("current_tag","ID3v2").toString ();
+
+ if (tag_name == "ID3v1")
+ ui.id3v1RadioButton->setChecked(TRUE);
+ else if (tag_name == "ID3v2")
+ ui.id3v2RadioButton->setChecked(TRUE);
+ else if (tag_name == "APE")
+ ui.apeRadioButton->setChecked(TRUE);
+ else
+ ui.id3v2RadioButton->setChecked(TRUE);
+
+ settings.endGroup();
+
+ loadMPEGInfo();
+ QFileInfo info(m_path);
+ m_rw = info.isWritable();
+ loadTag();
+ connect(ui.saveButton, SIGNAL(clicked()), SLOT(save()));
+ connect(ui.createButton, SIGNAL(clicked()), SLOT(create()));
+ connect(ui.deleteButton, SIGNAL(clicked()), SLOT(deleteTag()));
+ connect(ui.id3v1RadioButton, SIGNAL(clicked()), SLOT(loadTag()));
+ connect(ui.id3v2RadioButton, SIGNAL(clicked()), SLOT(loadTag()));
+ connect(ui.apeRadioButton, SIGNAL(clicked()), SLOT(loadTag()));
+}
+
+
+DetailsDialog::~DetailsDialog()
+{}
+
+void DetailsDialog::loadMPEGInfo()
+{
+ TagLib::MPEG::File f (m_path.toLocal8Bit());
+ //l.label
+ //ui. f.audioProperties()->level();
+ QString text;
+ text = QString("%1").arg(f.audioProperties()->layer());
+ ui.levelLabel->setText("MPEG layer "+text); //TODO: add MPEG version
+ text = QString("%1").arg(f.audioProperties()->bitrate());
+ ui.bitRateLabel->setText(text+" "+tr("kbps"));
+ text = QString("%1").arg(f.audioProperties()->sampleRate());
+ ui.sampleRateLabel->setText(text+" "+tr("Hz"));
+ switch (f.audioProperties()->channelMode())
+ {
+ case TagLib::MPEG::Header::Stereo:
+ ui.modeLabel->setText("Stereo");
+ break;
+ case TagLib::MPEG::Header::JointStereo:
+ ui.modeLabel->setText("Joint stereo");
+ break;
+ case TagLib::MPEG::Header::DualChannel:
+ ui.modeLabel->setText("Dual channel");
+ break;
+ case TagLib::MPEG::Header::SingleChannel:
+ ui.modeLabel->setText("Single channel");
+ break;
+ }
+ text = QString("%1 "+tr("KB")).arg(f.length()/1024);
+ ui.fileSizeLabel->setText(text);
+ /*if (f.audioProperties()->protectionEnabled())
+ ui.errProtectionLabel->setText(tr("Yes"));
+ else
+ ui.errProtectionLabel->setText(tr("No"));*/
+ if (f.audioProperties()->isCopyrighted())
+ ui.copyrightLabel->setText(tr("Yes"));
+ else
+ ui.copyrightLabel->setText(tr("No"));
+ if (f.audioProperties()->isOriginal())
+ ui.originalLabel->setText(tr("Yes"));
+ else
+ ui.originalLabel->setText(tr("No"));
+}
+
+void DetailsDialog::loadTag()
+{
+ TagLib::MPEG::File f (m_path.toLocal8Bit());
+ QTextCodec *codec = QTextCodec::codecForName ("UTF-8");
+ TagLib::Tag *tag = 0;
+
+ if (selectedTag() == TagLib::MPEG::File::ID3v1)
+ {
+ tag = f.ID3v1Tag();
+ codec = m_codec_v1;
+ ui.tagGroupBox->setTitle(tr("ID3v1 Tag"));
+ }
+ else if (selectedTag() == TagLib::MPEG::File::ID3v2)
+ {
+ tag = f.ID3v2Tag();
+ codec = m_codec_v2;
+ ui.tagGroupBox->setTitle(tr("ID3v2 Tag"));
+ }
+ else if (selectedTag() == TagLib::MPEG::File::APE)
+ {
+ ui.tagGroupBox->setTitle(tr("APE Tag"));
+ tag = f.APETag();
+ }
+ ui.saveButton->setEnabled(tag && m_rw);
+ ui.createButton->setEnabled(!tag && m_rw);
+ ui.deleteButton->setEnabled(tag && m_rw);
+ ui.tagsWidget->setEnabled(tag);
+ //clear old values
+ ui.titleLineEdit->clear();
+ ui.artistLineEdit->clear();
+ ui.albumLineEdit->clear();
+ ui.commentLineEdit->clear();
+ ui.yearLineEdit->clear();
+ ui.trackLineEdit->clear();
+ ui.genreLineEdit->clear();
+
+ if (tag)
+ {
+ bool utf = codec->name().contains("UTF");
+ TagLib::String title = tag->title();
+ TagLib::String artist = tag->artist();
+ TagLib::String album = tag->album();
+ TagLib::String comment = tag->comment();
+ TagLib::String genre = tag->genre();
+ QString string = codec->toUnicode(title.toCString(utf)).trimmed();
+ ui.titleLineEdit->setText(string);
+ string = codec->toUnicode(artist.toCString(utf)).trimmed();
+ ui.artistLineEdit->setText(string);
+ string = codec->toUnicode(album.toCString(utf)).trimmed();
+ ui.albumLineEdit->setText(string);
+ string = codec->toUnicode(comment.toCString(utf)).trimmed();
+ ui.commentLineEdit->setText(string);
+ string = QString("%1").arg(tag->year());
+ ui.yearLineEdit->setText(string);
+ string = QString("%1").arg(tag->track());
+ ui.trackLineEdit->setText(string);
+ string = codec->toUnicode(genre.toCString(utf)).trimmed();
+ ui.genreLineEdit->setText(string);
+ }
+}
+
+void DetailsDialog::save()
+{
+ TagLib::MPEG::File* f = new TagLib::MPEG::File(m_path.toLocal8Bit());
+ TagLib::String::Type type = TagLib::String::Latin1;
+
+ QTextCodec *codec = 0;
+ TagLib::Tag *tag = 0;
+
+ if (selectedTag() == TagLib::MPEG::File::ID3v1)
+ {
+ codec = m_codec_v1;
+ tag = f->ID3v1Tag(TRUE);
+ if (codec->name().contains("UTF"))
+ {
+ delete f;
+ loadTag();
+ }
+ }
+ if (selectedTag() == TagLib::MPEG::File::ID3v2)
+ {
+ codec = m_codec_v2;
+ tag = f->ID3v2Tag(TRUE);
+ if (codec->name().contains("UTF"))
+ {
+ TagLib::ID3v2::FrameFactory *factory = TagLib::ID3v2::FrameFactory::instance();
+ factory->setDefaultTextEncoding(TagLib::String::UTF8);
+ f->setID3v2FrameFactory(factory);
+ type = TagLib::String::UTF8;
+ }
+ }
+ if (selectedTag() == TagLib::MPEG::File::APE)
+ {
+ codec = QTextCodec::codecForName ("UTF-8");
+ tag = f->APETag(TRUE);
+ type = TagLib::String::UTF8;
+ }
+
+ tag->setTitle(TagLib::String(codec->fromUnicode(ui.titleLineEdit->text()).constData(), type));
+ tag->setArtist(TagLib::String(codec->fromUnicode(ui.artistLineEdit->text()).constData(), type));
+ tag->setAlbum(TagLib::String(codec->fromUnicode(ui.albumLineEdit->text()).constData(), type));
+ tag->setComment(TagLib::String(codec->fromUnicode(ui.commentLineEdit->text()).constData(), type));
+ tag->setGenre(TagLib::String(codec->fromUnicode(ui.genreLineEdit->text()).constData(), type));
+ tag->setYear(ui.yearLineEdit->text().toUInt());
+ tag->setTrack(ui.trackLineEdit->text().toUInt());
+
+ f->save(selectedTag(), FALSE);
+ delete f;
+ loadTag();
+}
+
+void DetailsDialog::create()
+{
+ TagLib::MPEG::File *f = new TagLib::MPEG::File (m_path.toLocal8Bit());
+ TagLib::Tag *tag = 0;
+ if (selectedTag() == TagLib::MPEG::File::ID3v1)
+ tag = f->ID3v1Tag(TRUE);
+ else if (selectedTag() == TagLib::MPEG::File::ID3v2)
+ tag = f->ID3v2Tag(TRUE);
+ else if (selectedTag() == TagLib::MPEG::File::APE)
+ tag = f->APETag(TRUE);
+
+ f->save(selectedTag(), FALSE);
+ delete f;
+ loadTag();
+ ui.tagsWidget->setEnabled(TRUE);
+ ui.saveButton->setEnabled(m_rw);
+}
+
+void DetailsDialog::deleteTag()
+{
+ TagLib::MPEG::File *f = new TagLib::MPEG::File (m_path.toLocal8Bit());
+ f->strip(selectedTag());
+ delete f;
+ loadTag();
+}
+
+uint DetailsDialog::selectedTag()
+{
+ if (ui.id3v1RadioButton->isChecked())
+ return TagLib::MPEG::File::ID3v1;
+ else if (ui.id3v2RadioButton->isChecked())
+ return TagLib::MPEG::File::ID3v2;
+ else if (ui.apeRadioButton->isChecked())
+ return TagLib::MPEG::File::APE;
+ return TagLib::MPEG::File::ID3v2;
+}
+
+void DetailsDialog::closeEvent (QCloseEvent *)
+{
+ QSettings settings(QDir::homePath()+"/.qmmp/qmmprc", QSettings::IniFormat);
+ settings.beginGroup("MAD");
+ if (ui.id3v1RadioButton->isChecked())
+ settings.setValue("current_tag","ID3v1");
+ else if (ui.id3v2RadioButton->isChecked())
+ settings.setValue("current_tag","ID3v2");
+ else if (ui.apeRadioButton->isChecked())
+ settings.setValue("current_tag","APE");
+ settings.endGroup();
+}
diff --git a/src/plugins/Input/mad/detailsdialog.h b/src/plugins/Input/mad/detailsdialog.h
new file mode 100644
index 000000000..bc92724a3
--- /dev/null
+++ b/src/plugins/Input/mad/detailsdialog.h
@@ -0,0 +1,63 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ilya Kotov *
+ * forkotov02@hotmail.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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+#ifndef DETAILSDIALOG_H
+#define DETAILSDIALOG_H
+
+#include <QDialog>
+
+#include "ui_detailsdialog.h"
+
+/**
+ @author Ilya Kotov <forkotov02@hotmail.ru>
+*/
+
+class QTextCodec;
+
+class DetailsDialog : public QDialog
+{
+ Q_OBJECT
+public:
+ DetailsDialog(QWidget *parent = 0, const QString &path = 0);
+
+ ~DetailsDialog();
+
+protected:
+ virtual void closeEvent (QCloseEvent *);
+
+private slots:
+ void save();
+ void create();
+ void deleteTag();
+ void loadTag();
+
+private:
+ void loadMPEGInfo();
+ uint selectedTag();
+ //void loadTag();
+ //void loadID3v2Tag();
+ Ui::DetailsDialog ui;
+ QString m_path;
+ QTextCodec *m_codec_v1;
+ QTextCodec *m_codec_v2;
+ bool m_rw;
+
+};
+
+#endif
diff --git a/src/plugins/Input/mad/detailsdialog.ui b/src/plugins/Input/mad/detailsdialog.ui
new file mode 100644
index 000000000..6f9a00c31
--- /dev/null
+++ b/src/plugins/Input/mad/detailsdialog.ui
@@ -0,0 +1,392 @@
+<ui version="4.0" >
+ <class>DetailsDialog</class>
+ <widget class="QDialog" name="DetailsDialog" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>593</width>
+ <height>402</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Details</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" colspan="3" >
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="label_28" >
+ <property name="text" >
+ <string>File path:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="pathLineEdit" >
+ <property name="readOnly" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item rowspan="2" row="1" column="0" >
+ <layout class="QVBoxLayout" >
+ <item>
+ <widget class="QGroupBox" name="groupBox_3" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title" >
+ <string>Tag Choice</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QRadioButton" name="id3v1RadioButton" >
+ <property name="text" >
+ <string>ID3v1</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="id3v2RadioButton" >
+ <property name="text" >
+ <string>ID3v2</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="apeRadioButton" >
+ <property name="text" >
+ <string>APE</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox" >
+ <property name="minimumSize" >
+ <size>
+ <width>200</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="title" >
+ <string>MPEG Info</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label" >
+ <property name="text" >
+ <string>MPEG level:</string>
+ </property>
+ <property name="textFormat" >
+ <enum>Qt::AutoText</enum>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLabel" name="levelLabel" >
+ <property name="text" >
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_2" >
+ <property name="text" >
+ <string>Bit rate:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QLabel" name="bitRateLabel" >
+ <property name="text" >
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="label_3" >
+ <property name="text" >
+ <string>Sample rate:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QLabel" name="sampleRateLabel" >
+ <property name="text" >
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="label_5" >
+ <property name="text" >
+ <string>File size:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QLabel" name="fileSizeLabel" >
+ <property name="text" >
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" >
+ <widget class="QLabel" name="label_6" >
+ <property name="text" >
+ <string>Mode:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1" >
+ <widget class="QLabel" name="modeLabel" >
+ <property name="text" >
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0" >
+ <widget class="QLabel" name="label_8" >
+ <property name="text" >
+ <string>Copyright:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1" >
+ <widget class="QLabel" name="copyrightLabel" >
+ <property name="text" >
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0" >
+ <widget class="QLabel" name="label_9" >
+ <property name="text" >
+ <string>Original:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1" >
+ <widget class="QLabel" name="originalLabel" >
+ <property name="text" >
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="1" colspan="2" >
+ <widget class="QGroupBox" name="tagGroupBox" >
+ <property name="title" >
+ <string>ID3v1 Tag</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <item>
+ <widget class="QWidget" native="1" name="tagsWidget" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_21" >
+ <property name="text" >
+ <string>Title:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" colspan="3" >
+ <widget class="QLineEdit" name="titleLineEdit" />
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_22" >
+ <property name="text" >
+ <string>Artist:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" colspan="3" >
+ <widget class="QLineEdit" name="artistLineEdit" />
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="label_23" >
+ <property name="text" >
+ <string>Album:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" colspan="3" >
+ <widget class="QLineEdit" name="albumLineEdit" />
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="label_24" >
+ <property name="text" >
+ <string>Comment:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" colspan="3" >
+ <widget class="QLineEdit" name="commentLineEdit" />
+ </item>
+ <item row="4" column="0" >
+ <widget class="QLabel" name="label_25" >
+ <property name="text" >
+ <string>Year:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1" >
+ <widget class="QLineEdit" name="yearLineEdit" />
+ </item>
+ <item row="4" column="2" >
+ <widget class="QLabel" name="label_26" >
+ <property name="text" >
+ <string>Track number:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="3" >
+ <widget class="QLineEdit" name="trackLineEdit" />
+ </item>
+ <item row="5" column="0" >
+ <widget class="QLabel" name="label_27" >
+ <property name="text" >
+ <string>Genre:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1" colspan="3" >
+ <widget class="QLineEdit" name="genreLineEdit" />
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QPushButton" name="createButton" >
+ <property name="text" >
+ <string>Create</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="deleteButton" >
+ <property name="text" >
+ <string>Delete</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="saveButton" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>Save</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>111</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QPushButton" name="pushButton_3" >
+ <property name="text" >
+ <string>Close</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>pushButton_3</sender>
+ <signal>clicked()</signal>
+ <receiver>DetailsDialog</receiver>
+ <slot>close()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>623</x>
+ <y>353</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>539</x>
+ <y>352</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/src/plugins/Input/mad/mad.pro b/src/plugins/Input/mad/mad.pro
new file mode 100644
index 000000000..7a320b370
--- /dev/null
+++ b/src/plugins/Input/mad/mad.pro
@@ -0,0 +1,39 @@
+# ???? ?????? ? KDevelop ?????????? qmake.
+# -------------------------------------------
+# ?????????? ???????????? ???????? ???????? ???????: ./Plugins/Input/mad
+# ???? - ??????????:
+
+include(../../plugins.pri)
+
+
+FORMS += detailsdialog.ui \
+ settingsdialog.ui
+HEADERS += decodermadfactory.h \
+ decoder_mad.h \
+ detailsdialog.h \
+ settingsdialog.h
+SOURCES += decoder_mad.cpp \
+ decodermadfactory.cpp \
+ detailsdialog.cpp \
+ settingsdialog.cpp
+
+TARGET=$$PLUGINS_PREFIX/Input/mad
+QMAKE_CLEAN =$$PLUGINS_PREFIX/Input/libmad.so
+
+INCLUDEPATH += ../../../qmmp
+CONFIG += release \
+warn_on \
+plugin \
+link_pkgconfig
+TEMPLATE = lib
+QMAKE_LIBDIR += ../../../../lib
+LIBS += -lqmmp
+PKGCONFIG += taglib mad
+#TRANSLATIONS = translations/mad_plugin_ru.ts
+#RESOURCES = translations/translations.qrc
+
+isEmpty (LIB_DIR){
+LIB_DIR = /lib
+}
+target.path = $$LIB_DIR/qmmp/Input
+INSTALLS += target
diff --git a/src/plugins/Input/mad/settingsdialog.cpp b/src/plugins/Input/mad/settingsdialog.cpp
new file mode 100644
index 000000000..667e8598a
--- /dev/null
+++ b/src/plugins/Input/mad/settingsdialog.cpp
@@ -0,0 +1,107 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ilya Kotov *
+ * forkotov02@hotmail.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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+#include <QTextCodec>
+#include <QSettings>
+#include <QDir>
+
+#include "settingsdialog.h"
+
+SettingsDialog::SettingsDialog(QWidget *parent)
+ : QDialog(parent)
+{
+ ui.setupUi(this);
+ setAttribute(Qt::WA_DeleteOnClose);
+ findCodecs();
+ foreach (QTextCodec *codec, codecs)
+ {
+ ui.id3v1EncComboBox->addItem(codec->name());
+ ui.id3v2EncComboBox->addItem(codec->name());
+ }
+ QSettings settings(QDir::homePath()+"/.qmmp/qmmprc", QSettings::IniFormat);
+ settings.beginGroup("MAD");
+ int pos = ui.id3v1EncComboBox->findText
+ (settings.value("ID3v1_encoding","UTF-8").toString());
+ ui.id3v1EncComboBox->setCurrentIndex(pos);
+ pos = ui.id3v2EncComboBox->findText
+ (settings.value("ID3v2_encoding","UTF-8").toString());
+ ui.id3v2EncComboBox->setCurrentIndex(pos);
+
+ ui.firstTagComboBox->setCurrentIndex(settings.value("tag_1", ID3v2).toInt());
+ ui.secondTagComboBox->setCurrentIndex(settings.value("tag_2", Disabled).toInt());
+ ui.thirdTagComboBox->setCurrentIndex(settings.value("tag_3", Disabled).toInt());
+
+ settings.endGroup();
+ connect(ui.okButton, SIGNAL(clicked()), SLOT(writeSettings()));
+}
+
+
+SettingsDialog::~SettingsDialog()
+{}
+
+void SettingsDialog::writeSettings()
+{
+ QSettings settings(QDir::homePath()+"/.qmmp/qmmprc", QSettings::IniFormat);
+ settings.beginGroup("MAD");
+ settings.setValue("ID3v1_encoding", ui.id3v1EncComboBox->currentText());
+ settings.setValue("ID3v2_encoding", ui.id3v2EncComboBox->currentText());
+ settings.setValue("tag_1", ui.firstTagComboBox->currentIndex());
+ settings.setValue("tag_2", ui.secondTagComboBox->currentIndex());
+ settings.setValue("tag_3", ui.thirdTagComboBox->currentIndex());
+ settings.endGroup();
+ accept();
+}
+
+void SettingsDialog::findCodecs()
+{
+ QMap<QString, QTextCodec *> codecMap;
+ QRegExp iso8859RegExp("ISO[- ]8859-([0-9]+).*");
+
+ foreach (int mib, QTextCodec::availableMibs())
+ {
+ QTextCodec *codec = QTextCodec::codecForMib(mib);
+
+ QString sortKey = codec->name().toUpper();
+ int rank;
+
+ if (sortKey.startsWith("UTF-8"))
+ {
+ rank = 1;
+ }
+ else if (sortKey.startsWith("UTF-16"))
+ {
+ rank = 2;
+ }
+ else if (iso8859RegExp.exactMatch(sortKey))
+ {
+ if (iso8859RegExp.cap(1).size() == 1)
+ rank = 3;
+ else
+ rank = 4;
+ }
+ else
+ {
+ rank = 5;
+ }
+ sortKey.prepend(QChar('0' + rank));
+
+ codecMap.insert(sortKey, codec);
+ }
+ codecs = codecMap.values();
+}
diff --git a/src/plugins/Input/mad/settingsdialog.h b/src/plugins/Input/mad/settingsdialog.h
new file mode 100644
index 000000000..2ad1ed188
--- /dev/null
+++ b/src/plugins/Input/mad/settingsdialog.h
@@ -0,0 +1,52 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ilya Kotov *
+ * forkotov02@hotmail.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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+#ifndef SETTINGSDIALOG_H
+#define SETTINGSDIALOG_H
+
+#include <QDialog>
+
+
+#include "ui_settingsdialog.h"
+
+/**
+ @author Ilya Kotov <forkotov02@hotmail.ru>
+*/
+class SettingsDialog : public QDialog
+{
+Q_OBJECT
+public:
+ SettingsDialog(QWidget *parent = 0);
+
+ ~SettingsDialog();
+
+ enum TagType {ID3v1 = 0, ID3v2, APE, Disabled};
+
+private slots:
+ void writeSettings();
+
+private:
+ void findCodecs();
+
+ Ui::SettingsDialog ui;
+ QList<QTextCodec *> codecs;
+
+};
+
+#endif
diff --git a/src/plugins/Input/mad/settingsdialog.ui b/src/plugins/Input/mad/settingsdialog.ui
new file mode 100644
index 000000000..3ace8fcec
--- /dev/null
+++ b/src/plugins/Input/mad/settingsdialog.ui
@@ -0,0 +1,306 @@
+<ui version="4.0" >
+ <class>SettingsDialog</class>
+ <widget class="QDialog" name="SettingsDialog" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>242</width>
+ <height>303</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MPEG Plugin Settings</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <item>
+ <widget class="QGroupBox" name="groupBox_2" >
+ <property name="title" >
+ <string>Tag Priority</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <item>
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="label_15_2" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>First:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="firstTagComboBox" >
+ <property name="currentIndex" >
+ <number>0</number>
+ </property>
+ <item>
+ <property name="text" >
+ <string>ID3v1</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>ID3v2</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>APE</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Disabled</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="label_15_3" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Second:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="secondTagComboBox" >
+ <property name="currentIndex" >
+ <number>0</number>
+ </property>
+ <item>
+ <property name="text" >
+ <string>ID3v1</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>ID3v2</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>APE</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Disabled</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="label_15_4" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Third:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="thirdTagComboBox" >
+ <property name="currentIndex" >
+ <number>0</number>
+ </property>
+ <item>
+ <property name="text" >
+ <string>ID3v1</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>ID3v2</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>APE</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Disabled</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox" >
+ <property name="title" >
+ <string>Encodings</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <property name="leftMargin" >
+ <number>0</number>
+ </property>
+ <property name="topMargin" >
+ <number>0</number>
+ </property>
+ <property name="rightMargin" >
+ <number>0</number>
+ </property>
+ <property name="bottomMargin" >
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label_17_2_2" >
+ <property name="text" >
+ <string>ID3v1 encoding:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="id3v1EncComboBox" />
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <property name="leftMargin" >
+ <number>0</number>
+ </property>
+ <property name="topMargin" >
+ <number>0</number>
+ </property>
+ <property name="rightMargin" >
+ <number>0</number>
+ </property>
+ <property name="bottomMargin" >
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label_18_2_2" >
+ <property name="text" >
+ <string>ID3v2 encoding:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="id3v2EncComboBox" />
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <property name="leftMargin" >
+ <number>0</number>
+ </property>
+ <property name="topMargin" >
+ <number>0</number>
+ </property>
+ <property name="rightMargin" >
+ <number>0</number>
+ </property>
+ <property name="bottomMargin" >
+ <number>0</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>131</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="okButton" >
+ <property name="text" >
+ <string>OK</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>cancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SettingsDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>336</x>
+ <y>210</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>179</x>
+ <y>224</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/src/plugins/Input/mad/translations/mad_plugin_ru.qm b/src/plugins/Input/mad/translations/mad_plugin_ru.qm
new file mode 100644
index 000000000..16bea746b
--- /dev/null
+++ b/src/plugins/Input/mad/translations/mad_plugin_ru.qm
Binary files differ
diff --git a/src/plugins/Input/mad/translations/mad_plugin_ru.ts b/src/plugins/Input/mad/translations/mad_plugin_ru.ts
new file mode 100644
index 000000000..6406f6045
--- /dev/null
+++ b/src/plugins/Input/mad/translations/mad_plugin_ru.ts
@@ -0,0 +1,242 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS><TS version="1.1" language="ru">
+<context>
+ <name>DecoderMADFactory</name>
+ <message>
+ <location filename="../decodermadfactory.cpp" line="27"/>
+ <source>MPEG Plugin</source>
+ <translation>Модуль MPEG</translation>
+ </message>
+ <message>
+ <location filename="../decodermadfactory.cpp" line="39"/>
+ <source>MPEG Files</source>
+ <translation>Файлы MPEG</translation>
+ </message>
+ <message>
+ <location filename="../decodermadfactory.cpp" line="68"/>
+ <source>About MPEG Audio Plugin</source>
+ <translation>Об аудио-модуле MPEG</translation>
+ </message>
+ <message>
+ <location filename="../decodermadfactory.cpp" line="69"/>
+ <source>Qmmp MPEG Audio Plugin</source>
+ <translation>Аудио-модуль MPEG для Qmmp</translation>
+ </message>
+ <message>
+ <location filename="../decodermadfactory.cpp" line="70"/>
+ <source>Compiled against libmad version:</source>
+ <translation>Собрано с версией libmad:</translation>
+ </message>
+ <message>
+ <location filename="../decodermadfactory.cpp" line="74"/>
+ <source>Writen by: Ilya Kotov &lt;forkotov02@hotmail.ru&gt;</source>
+ <translation>Разработчик: Илья Котов &lt;forkotov02@hotmail.ru&gt;</translation>
+ </message>
+ <message>
+ <location filename="../decodermadfactory.cpp" line="76"/>
+ <source>Source code based on mq3 progect</source>
+ <translation>Исходный код основан на проекте mq3</translation>
+ </message>
+</context>
+<context>
+ <name>DetailsDialog</name>
+ <message>
+ <location filename="../detailsdialog.cpp" line="79"/>
+ <source>Hz</source>
+ <translation>Гц</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.cpp" line="106"/>
+ <source>Yes</source>
+ <translation>Есть</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.cpp" line="108"/>
+ <source>No</source>
+ <translation>Нет</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.ui" line="192"/>
+ <source>ID3v1 Tag</source>
+ <translation>ID3v1-тег</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.ui" line="442"/>
+ <source>Save</source>
+ <translation>Сохранить</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.ui" line="351"/>
+ <source>Track number:</source>
+ <translation>Номер трека:</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.ui" line="364"/>
+ <source>Year:</source>
+ <translation>Год:</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.ui" line="374"/>
+ <source>Genre:</source>
+ <translation>Жанр:</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.ui" line="384"/>
+ <source>Comment:</source>
+ <translation>Комментарий:</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.ui" line="394"/>
+ <source>Album:</source>
+ <translation>Альбом:</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.ui" line="404"/>
+ <source>Artist:</source>
+ <translation>Исполнитель:</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.ui" line="414"/>
+ <source>Title:</source>
+ <translation>Название:</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.ui" line="321"/>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.ui" line="336"/>
+ <source>ID3v2 Tag</source>
+ <translation>ID3v2-тег</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.ui" line="31"/>
+ <source>MPEG Info</source>
+ <translation>Информация MPEG</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.ui" line="164"/>
+ <source>-</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.ui" line="171"/>
+ <source>Original:</source>
+ <translation>Оригинальный:</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.ui" line="147"/>
+ <source>Copyright:</source>
+ <translation>Авторские права:</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.ui" line="137"/>
+ <source>Mode:</source>
+ <translation>Режим:</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.ui" line="59"/>
+ <source>File size:</source>
+ <translation>Размер файла:</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.ui" line="76"/>
+ <source>Sample rate:</source>
+ <translation>Дискретизация:</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.ui" line="86"/>
+ <source>Bit rate:</source>
+ <translation>Битовая частота:</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.ui" line="117"/>
+ <source>MPEG level:</source>
+ <translation>Уровень MPEG:</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.ui" line="452"/>
+ <source>File path:</source>
+ <translation>Путь к файлу:</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.cpp" line="95"/>
+ <source>KB</source>
+ <translation>Кб</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.ui" line="13"/>
+ <source>Details</source>
+ <translation>Информация</translation>
+ </message>
+ <message>
+ <location filename="../detailsdialog.cpp" line="77"/>
+ <source>kbps</source>
+ <translation>Кб/с</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsDialog</name>
+ <message>
+ <location filename="../settingsdialog.ui" line="25"/>
+ <source>ID3 Tags</source>
+ <translation>ID3-теги</translation>
+ </message>
+ <message>
+ <location filename="../settingsdialog.ui" line="45"/>
+ <source>Default tag version:</source>
+ <translation>Версия тегов по умолчанию:</translation>
+ </message>
+ <message>
+ <location filename="../settingsdialog.ui" line="62"/>
+ <source>ID3v1</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../settingsdialog.ui" line="67"/>
+ <source>ID3v2</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../settingsdialog.ui" line="90"/>
+ <source>Enable ID3v1</source>
+ <translation>Использовать ID3v1</translation>
+ </message>
+ <message>
+ <location filename="../settingsdialog.ui" line="97"/>
+ <source>Enable ID3v2</source>
+ <translation>Использовать ID3v2</translation>
+ </message>
+ <message>
+ <location filename="../settingsdialog.ui" line="112"/>
+ <source>ID3v1 encoding:</source>
+ <translation>Кодировка ID3v1:</translation>
+ </message>
+ <message>
+ <location filename="../settingsdialog.ui" line="165"/>
+ <source>Default</source>
+ <translation>По-умолчанию</translation>
+ </message>
+ <message>
+ <location filename="../settingsdialog.ui" line="154"/>
+ <source>ID3v2 encoding:</source>
+ <translation>Кодировка ID3v2:</translation>
+ </message>
+ <message>
+ <location filename="../settingsdialog.ui" line="212"/>
+ <source>OK</source>
+ <translation>Применить</translation>
+ </message>
+ <message>
+ <location filename="../settingsdialog.ui" line="219"/>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <location filename="../settingsdialog.ui" line="13"/>
+ <source>MPEG Plugin Settings</source>
+ <translation>Настройка модуля MPEG</translation>
+ </message>
+</context>
+</TS>
diff --git a/src/plugins/Input/mad/translations/translations.qrc b/src/plugins/Input/mad/translations/translations.qrc
new file mode 100644
index 000000000..34dbabbca
--- /dev/null
+++ b/src/plugins/Input/mad/translations/translations.qrc
@@ -0,0 +1,6 @@
+<!DOCTYPE RCC>
+<RCC version="1.0">
+ <qresource>
+ <file>mad_plugin_ru.qm</file>
+ </qresource>
+</RCC>
diff --git a/src/plugins/Input/mad/ui_detailsdialog.h b/src/plugins/Input/mad/ui_detailsdialog.h
new file mode 100644
index 000000000..d630be894
--- /dev/null
+++ b/src/plugins/Input/mad/ui_detailsdialog.h
@@ -0,0 +1,400 @@
+/********************************************************************************
+** Form generated from reading ui file 'detailsdialog.ui'
+**
+** Created: Thu Feb 7 00:21:43 2008
+** by: Qt User Interface Compiler version 4.3.0
+**
+** WARNING! All changes made in this file will be lost when recompiling ui file!
+********************************************************************************/
+
+#ifndef UI_DETAILSDIALOG_H
+#define UI_DETAILSDIALOG_H
+
+#include <QtCore/QVariant>
+#include <QtGui/QAction>
+#include <QtGui/QApplication>
+#include <QtGui/QButtonGroup>
+#include <QtGui/QDialog>
+#include <QtGui/QGridLayout>
+#include <QtGui/QGroupBox>
+#include <QtGui/QHBoxLayout>
+#include <QtGui/QLabel>
+#include <QtGui/QLineEdit>
+#include <QtGui/QPushButton>
+#include <QtGui/QRadioButton>
+#include <QtGui/QSpacerItem>
+#include <QtGui/QVBoxLayout>
+#include <QtGui/QWidget>
+
+class Ui_DetailsDialog
+{
+public:
+ QGridLayout *gridLayout;
+ QHBoxLayout *hboxLayout;
+ QLabel *label_28;
+ QLineEdit *pathLineEdit;
+ QVBoxLayout *vboxLayout;
+ QGroupBox *groupBox_3;
+ QHBoxLayout *hboxLayout1;
+ QRadioButton *id3v1RadioButton;
+ QRadioButton *id3v2RadioButton;
+ QRadioButton *apeRadioButton;
+ QGroupBox *groupBox;
+ QGridLayout *gridLayout1;
+ QLabel *label;
+ QLabel *levelLabel;
+ QLabel *label_2;
+ QLabel *bitRateLabel;
+ QLabel *label_3;
+ QLabel *sampleRateLabel;
+ QLabel *label_5;
+ QLabel *fileSizeLabel;
+ QLabel *label_6;
+ QLabel *modeLabel;
+ QLabel *label_8;
+ QLabel *copyrightLabel;
+ QLabel *label_9;
+ QLabel *originalLabel;
+ QGroupBox *tagGroupBox;
+ QVBoxLayout *vboxLayout1;
+ QWidget *tagsWidget;
+ QGridLayout *gridLayout2;
+ QLabel *label_21;
+ QLineEdit *titleLineEdit;
+ QLabel *label_22;
+ QLineEdit *artistLineEdit;
+ QLabel *label_23;
+ QLineEdit *albumLineEdit;
+ QLabel *label_24;
+ QLineEdit *commentLineEdit;
+ QLabel *label_25;
+ QLineEdit *yearLineEdit;
+ QLabel *label_26;
+ QLineEdit *trackLineEdit;
+ QLabel *label_27;
+ QLineEdit *genreLineEdit;
+ QHBoxLayout *hboxLayout2;
+ QPushButton *createButton;
+ QPushButton *deleteButton;
+ QPushButton *saveButton;
+ QSpacerItem *spacerItem;
+ QPushButton *pushButton_3;
+
+ void setupUi(QDialog *DetailsDialog)
+ {
+ if (DetailsDialog->objectName().isEmpty())
+ DetailsDialog->setObjectName(QString::fromUtf8("DetailsDialog"));
+ QSize size(593, 402);
+ size = size.expandedTo(DetailsDialog->minimumSizeHint());
+ DetailsDialog->resize(size);
+ gridLayout = new QGridLayout(DetailsDialog);
+ gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
+ hboxLayout = new QHBoxLayout();
+ hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ label_28 = new QLabel(DetailsDialog);
+ label_28->setObjectName(QString::fromUtf8("label_28"));
+ label_28->setAlignment(Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter);
+
+ hboxLayout->addWidget(label_28);
+
+ pathLineEdit = new QLineEdit(DetailsDialog);
+ pathLineEdit->setObjectName(QString::fromUtf8("pathLineEdit"));
+ pathLineEdit->setReadOnly(true);
+
+ hboxLayout->addWidget(pathLineEdit);
+
+
+ gridLayout->addLayout(hboxLayout, 0, 0, 1, 3);
+
+ vboxLayout = new QVBoxLayout();
+ vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ groupBox_3 = new QGroupBox(DetailsDialog);
+ groupBox_3->setObjectName(QString::fromUtf8("groupBox_3"));
+ QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+ sizePolicy.setHorizontalStretch(0);
+ sizePolicy.setVerticalStretch(0);
+ sizePolicy.setHeightForWidth(groupBox_3->sizePolicy().hasHeightForWidth());
+ groupBox_3->setSizePolicy(sizePolicy);
+ hboxLayout1 = new QHBoxLayout(groupBox_3);
+ hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ id3v1RadioButton = new QRadioButton(groupBox_3);
+ id3v1RadioButton->setObjectName(QString::fromUtf8("id3v1RadioButton"));
+
+ hboxLayout1->addWidget(id3v1RadioButton);
+
+ id3v2RadioButton = new QRadioButton(groupBox_3);
+ id3v2RadioButton->setObjectName(QString::fromUtf8("id3v2RadioButton"));
+
+ hboxLayout1->addWidget(id3v2RadioButton);
+
+ apeRadioButton = new QRadioButton(groupBox_3);
+ apeRadioButton->setObjectName(QString::fromUtf8("apeRadioButton"));
+
+ hboxLayout1->addWidget(apeRadioButton);
+
+
+ vboxLayout->addWidget(groupBox_3);
+
+ groupBox = new QGroupBox(DetailsDialog);
+ groupBox->setObjectName(QString::fromUtf8("groupBox"));
+ groupBox->setMinimumSize(QSize(200, 16));
+ gridLayout1 = new QGridLayout(groupBox);
+ gridLayout1->setObjectName(QString::fromUtf8("gridLayout1"));
+ label = new QLabel(groupBox);
+ label->setObjectName(QString::fromUtf8("label"));
+ label->setTextFormat(Qt::AutoText);
+ label->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+
+ gridLayout1->addWidget(label, 0, 0, 1, 1);
+
+ levelLabel = new QLabel(groupBox);
+ levelLabel->setObjectName(QString::fromUtf8("levelLabel"));
+
+ gridLayout1->addWidget(levelLabel, 0, 1, 1, 1);
+
+ label_2 = new QLabel(groupBox);
+ label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+
+ gridLayout1->addWidget(label_2, 1, 0, 1, 1);
+
+ bitRateLabel = new QLabel(groupBox);
+ bitRateLabel->setObjectName(QString::fromUtf8("bitRateLabel"));
+
+ gridLayout1->addWidget(bitRateLabel, 1, 1, 1, 1);
+
+ label_3 = new QLabel(groupBox);
+ label_3->setObjectName(QString::fromUtf8("label_3"));
+ label_3->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+
+ gridLayout1->addWidget(label_3, 2, 0, 1, 1);
+
+ sampleRateLabel = new QLabel(groupBox);
+ sampleRateLabel->setObjectName(QString::fromUtf8("sampleRateLabel"));
+
+ gridLayout1->addWidget(sampleRateLabel, 2, 1, 1, 1);
+
+ label_5 = new QLabel(groupBox);
+ label_5->setObjectName(QString::fromUtf8("label_5"));
+ label_5->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+
+ gridLayout1->addWidget(label_5, 3, 0, 1, 1);
+
+ fileSizeLabel = new QLabel(groupBox);
+ fileSizeLabel->setObjectName(QString::fromUtf8("fileSizeLabel"));
+
+ gridLayout1->addWidget(fileSizeLabel, 3, 1, 1, 1);
+
+ label_6 = new QLabel(groupBox);
+ label_6->setObjectName(QString::fromUtf8("label_6"));
+ label_6->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+
+ gridLayout1->addWidget(label_6, 4, 0, 1, 1);
+
+ modeLabel = new QLabel(groupBox);
+ modeLabel->setObjectName(QString::fromUtf8("modeLabel"));
+
+ gridLayout1->addWidget(modeLabel, 4, 1, 1, 1);
+
+ label_8 = new QLabel(groupBox);
+ label_8->setObjectName(QString::fromUtf8("label_8"));
+ label_8->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+
+ gridLayout1->addWidget(label_8, 5, 0, 1, 1);
+
+ copyrightLabel = new QLabel(groupBox);
+ copyrightLabel->setObjectName(QString::fromUtf8("copyrightLabel"));
+
+ gridLayout1->addWidget(copyrightLabel, 5, 1, 1, 1);
+
+ label_9 = new QLabel(groupBox);
+ label_9->setObjectName(QString::fromUtf8("label_9"));
+ label_9->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+
+ gridLayout1->addWidget(label_9, 6, 0, 1, 1);
+
+ originalLabel = new QLabel(groupBox);
+ originalLabel->setObjectName(QString::fromUtf8("originalLabel"));
+
+ gridLayout1->addWidget(originalLabel, 6, 1, 1, 1);
+
+
+ vboxLayout->addWidget(groupBox);
+
+
+ gridLayout->addLayout(vboxLayout, 1, 0, 2, 1);
+
+ tagGroupBox = new QGroupBox(DetailsDialog);
+ tagGroupBox->setObjectName(QString::fromUtf8("tagGroupBox"));
+ vboxLayout1 = new QVBoxLayout(tagGroupBox);
+ vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ tagsWidget = new QWidget(tagGroupBox);
+ tagsWidget->setObjectName(QString::fromUtf8("tagsWidget"));
+ tagsWidget->setEnabled(true);
+ gridLayout2 = new QGridLayout(tagsWidget);
+ gridLayout2->setObjectName(QString::fromUtf8("gridLayout2"));
+ label_21 = new QLabel(tagsWidget);
+ label_21->setObjectName(QString::fromUtf8("label_21"));
+ label_21->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+
+ gridLayout2->addWidget(label_21, 0, 0, 1, 1);
+
+ titleLineEdit = new QLineEdit(tagsWidget);
+ titleLineEdit->setObjectName(QString::fromUtf8("titleLineEdit"));
+
+ gridLayout2->addWidget(titleLineEdit, 0, 1, 1, 3);
+
+ label_22 = new QLabel(tagsWidget);
+ label_22->setObjectName(QString::fromUtf8("label_22"));
+ label_22->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+
+ gridLayout2->addWidget(label_22, 1, 0, 1, 1);
+
+ artistLineEdit = new QLineEdit(tagsWidget);
+ artistLineEdit->setObjectName(QString::fromUtf8("artistLineEdit"));
+
+ gridLayout2->addWidget(artistLineEdit, 1, 1, 1, 3);
+
+ label_23 = new QLabel(tagsWidget);
+ label_23->setObjectName(QString::fromUtf8("label_23"));
+ label_23->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+
+ gridLayout2->addWidget(label_23, 2, 0, 1, 1);
+
+ albumLineEdit = new QLineEdit(tagsWidget);
+ albumLineEdit->setObjectName(QString::fromUtf8("albumLineEdit"));
+
+ gridLayout2->addWidget(albumLineEdit, 2, 1, 1, 3);
+
+ label_24 = new QLabel(tagsWidget);
+ label_24->setObjectName(QString::fromUtf8("label_24"));
+ label_24->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+
+ gridLayout2->addWidget(label_24, 3, 0, 1, 1);
+
+ commentLineEdit = new QLineEdit(tagsWidget);
+ commentLineEdit->setObjectName(QString::fromUtf8("commentLineEdit"));
+
+ gridLayout2->addWidget(commentLineEdit, 3, 1, 1, 3);
+
+ label_25 = new QLabel(tagsWidget);
+ label_25->setObjectName(QString::fromUtf8("label_25"));
+ label_25->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+
+ gridLayout2->addWidget(label_25, 4, 0, 1, 1);
+
+ yearLineEdit = new QLineEdit(tagsWidget);
+ yearLineEdit->setObjectName(QString::fromUtf8("yearLineEdit"));
+
+ gridLayout2->addWidget(yearLineEdit, 4, 1, 1, 1);
+
+ label_26 = new QLabel(tagsWidget);
+ label_26->setObjectName(QString::fromUtf8("label_26"));
+ label_26->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+
+ gridLayout2->addWidget(label_26, 4, 2, 1, 1);
+
+ trackLineEdit = new QLineEdit(tagsWidget);
+ trackLineEdit->setObjectName(QString::fromUtf8("trackLineEdit"));
+
+ gridLayout2->addWidget(trackLineEdit, 4, 3, 1, 1);
+
+ label_27 = new QLabel(tagsWidget);
+ label_27->setObjectName(QString::fromUtf8("label_27"));
+ label_27->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+
+ gridLayout2->addWidget(label_27, 5, 0, 1, 1);
+
+ genreLineEdit = new QLineEdit(tagsWidget);
+ genreLineEdit->setObjectName(QString::fromUtf8("genreLineEdit"));
+
+ gridLayout2->addWidget(genreLineEdit, 5, 1, 1, 3);
+
+
+ vboxLayout1->addWidget(tagsWidget);
+
+ hboxLayout2 = new QHBoxLayout();
+ hboxLayout2->setObjectName(QString::fromUtf8("hboxLayout2"));
+ createButton = new QPushButton(tagGroupBox);
+ createButton->setObjectName(QString::fromUtf8("createButton"));
+
+ hboxLayout2->addWidget(createButton);
+
+ deleteButton = new QPushButton(tagGroupBox);
+ deleteButton->setObjectName(QString::fromUtf8("deleteButton"));
+
+ hboxLayout2->addWidget(deleteButton);
+
+ saveButton = new QPushButton(tagGroupBox);
+ saveButton->setObjectName(QString::fromUtf8("saveButton"));
+ saveButton->setEnabled(false);
+
+ hboxLayout2->addWidget(saveButton);
+
+
+ vboxLayout1->addLayout(hboxLayout2);
+
+
+ gridLayout->addWidget(tagGroupBox, 1, 1, 1, 2);
+
+ spacerItem = new QSpacerItem(111, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
+
+ gridLayout->addItem(spacerItem, 2, 1, 1, 1);
+
+ pushButton_3 = new QPushButton(DetailsDialog);
+ pushButton_3->setObjectName(QString::fromUtf8("pushButton_3"));
+
+ gridLayout->addWidget(pushButton_3, 2, 2, 1, 1);
+
+
+ retranslateUi(DetailsDialog);
+ QObject::connect(pushButton_3, SIGNAL(clicked()), DetailsDialog, SLOT(close()));
+
+ QMetaObject::connectSlotsByName(DetailsDialog);
+ } // setupUi
+
+ void retranslateUi(QDialog *DetailsDialog)
+ {
+ DetailsDialog->setWindowTitle(QApplication::translate("DetailsDialog", "Details", 0, QApplication::UnicodeUTF8));
+ label_28->setText(QApplication::translate("DetailsDialog", "File path:", 0, QApplication::UnicodeUTF8));
+ groupBox_3->setTitle(QApplication::translate("DetailsDialog", "Tag Choice", 0, QApplication::UnicodeUTF8));
+ id3v1RadioButton->setText(QApplication::translate("DetailsDialog", "ID3v1", 0, QApplication::UnicodeUTF8));
+ id3v2RadioButton->setText(QApplication::translate("DetailsDialog", "ID3v2", 0, QApplication::UnicodeUTF8));
+ apeRadioButton->setText(QApplication::translate("DetailsDialog", "APE", 0, QApplication::UnicodeUTF8));
+ groupBox->setTitle(QApplication::translate("DetailsDialog", "MPEG Info", 0, QApplication::UnicodeUTF8));
+ label->setText(QApplication::translate("DetailsDialog", "MPEG level:", 0, QApplication::UnicodeUTF8));
+ levelLabel->setText(QApplication::translate("DetailsDialog", "-", 0, QApplication::UnicodeUTF8));
+ label_2->setText(QApplication::translate("DetailsDialog", "Bit rate:", 0, QApplication::UnicodeUTF8));
+ bitRateLabel->setText(QApplication::translate("DetailsDialog", "-", 0, QApplication::UnicodeUTF8));
+ label_3->setText(QApplication::translate("DetailsDialog", "Sample rate:", 0, QApplication::UnicodeUTF8));
+ sampleRateLabel->setText(QApplication::translate("DetailsDialog", "-", 0, QApplication::UnicodeUTF8));
+ label_5->setText(QApplication::translate("DetailsDialog", "File size:", 0, QApplication::UnicodeUTF8));
+ fileSizeLabel->setText(QApplication::translate("DetailsDialog", "-", 0, QApplication::UnicodeUTF8));
+ label_6->setText(QApplication::translate("DetailsDialog", "Mode:", 0, QApplication::UnicodeUTF8));
+ modeLabel->setText(QApplication::translate("DetailsDialog", "-", 0, QApplication::UnicodeUTF8));
+ label_8->setText(QApplication::translate("DetailsDialog", "Copyright:", 0, QApplication::UnicodeUTF8));
+ copyrightLabel->setText(QApplication::translate("DetailsDialog", "-", 0, QApplication::UnicodeUTF8));
+ label_9->setText(QApplication::translate("DetailsDialog", "Original:", 0, QApplication::UnicodeUTF8));
+ originalLabel->setText(QApplication::translate("DetailsDialog", "-", 0, QApplication::UnicodeUTF8));
+ tagGroupBox->setTitle(QApplication::translate("DetailsDialog", "ID3v1 Tag", 0, QApplication::UnicodeUTF8));
+ label_21->setText(QApplication::translate("DetailsDialog", "Title:", 0, QApplication::UnicodeUTF8));
+ label_22->setText(QApplication::translate("DetailsDialog", "Artist:", 0, QApplication::UnicodeUTF8));
+ label_23->setText(QApplication::translate("DetailsDialog", "Album:", 0, QApplication::UnicodeUTF8));
+ label_24->setText(QApplication::translate("DetailsDialog", "Comment:", 0, QApplication::UnicodeUTF8));
+ label_25->setText(QApplication::translate("DetailsDialog", "Year:", 0, QApplication::UnicodeUTF8));
+ label_26->setText(QApplication::translate("DetailsDialog", "Track number:", 0, QApplication::UnicodeUTF8));
+ label_27->setText(QApplication::translate("DetailsDialog", "Genre:", 0, QApplication::UnicodeUTF8));
+ createButton->setText(QApplication::translate("DetailsDialog", "Create", 0, QApplication::UnicodeUTF8));
+ deleteButton->setText(QApplication::translate("DetailsDialog", "Delete", 0, QApplication::UnicodeUTF8));
+ saveButton->setText(QApplication::translate("DetailsDialog", "Save", 0, QApplication::UnicodeUTF8));
+ pushButton_3->setText(QApplication::translate("DetailsDialog", "Close", 0, QApplication::UnicodeUTF8));
+ Q_UNUSED(DetailsDialog);
+ } // retranslateUi
+
+};
+
+namespace Ui {
+ class DetailsDialog: public Ui_DetailsDialog {};
+} // namespace Ui
+
+#endif // UI_DETAILSDIALOG_H
diff --git a/src/plugins/Input/mad/ui_settingsdialog.h b/src/plugins/Input/mad/ui_settingsdialog.h
new file mode 100644
index 000000000..47cdac64f
--- /dev/null
+++ b/src/plugins/Input/mad/ui_settingsdialog.h
@@ -0,0 +1,245 @@
+/********************************************************************************
+** Form generated from reading ui file 'settingsdialog.ui'
+**
+** Created: Thu Feb 7 00:21:43 2008
+** by: Qt User Interface Compiler version 4.3.0
+**
+** WARNING! All changes made in this file will be lost when recompiling ui file!
+********************************************************************************/
+
+#ifndef UI_SETTINGSDIALOG_H
+#define UI_SETTINGSDIALOG_H
+
+#include <QtCore/QVariant>
+#include <QtGui/QAction>
+#include <QtGui/QApplication>
+#include <QtGui/QButtonGroup>
+#include <QtGui/QComboBox>
+#include <QtGui/QDialog>
+#include <QtGui/QGroupBox>
+#include <QtGui/QHBoxLayout>
+#include <QtGui/QLabel>
+#include <QtGui/QPushButton>
+#include <QtGui/QSpacerItem>
+#include <QtGui/QVBoxLayout>
+
+class Ui_SettingsDialog
+{
+public:
+ QVBoxLayout *vboxLayout;
+ QGroupBox *groupBox_2;
+ QVBoxLayout *vboxLayout1;
+ QHBoxLayout *hboxLayout;
+ QLabel *label_15_2;
+ QComboBox *firstTagComboBox;
+ QHBoxLayout *hboxLayout1;
+ QLabel *label_15_3;
+ QComboBox *secondTagComboBox;
+ QHBoxLayout *hboxLayout2;
+ QLabel *label_15_4;
+ QComboBox *thirdTagComboBox;
+ QGroupBox *groupBox;
+ QVBoxLayout *vboxLayout2;
+ QHBoxLayout *hboxLayout3;
+ QLabel *label_17_2_2;
+ QComboBox *id3v1EncComboBox;
+ QHBoxLayout *hboxLayout4;
+ QLabel *label_18_2_2;
+ QComboBox *id3v2EncComboBox;
+ QHBoxLayout *hboxLayout5;
+ QSpacerItem *spacerItem;
+ QPushButton *okButton;
+ QPushButton *cancelButton;
+
+ void setupUi(QDialog *SettingsDialog)
+ {
+ if (SettingsDialog->objectName().isEmpty())
+ SettingsDialog->setObjectName(QString::fromUtf8("SettingsDialog"));
+ QSize size(242, 303);
+ size = size.expandedTo(SettingsDialog->minimumSizeHint());
+ SettingsDialog->resize(size);
+ vboxLayout = new QVBoxLayout(SettingsDialog);
+ vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ groupBox_2 = new QGroupBox(SettingsDialog);
+ groupBox_2->setObjectName(QString::fromUtf8("groupBox_2"));
+ vboxLayout1 = new QVBoxLayout(groupBox_2);
+ vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ hboxLayout = new QHBoxLayout();
+ hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ label_15_2 = new QLabel(groupBox_2);
+ label_15_2->setObjectName(QString::fromUtf8("label_15_2"));
+ QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+ sizePolicy.setHorizontalStretch(0);
+ sizePolicy.setVerticalStretch(0);
+ sizePolicy.setHeightForWidth(label_15_2->sizePolicy().hasHeightForWidth());
+ label_15_2->setSizePolicy(sizePolicy);
+ label_15_2->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+
+ hboxLayout->addWidget(label_15_2);
+
+ firstTagComboBox = new QComboBox(groupBox_2);
+ firstTagComboBox->setObjectName(QString::fromUtf8("firstTagComboBox"));
+
+ hboxLayout->addWidget(firstTagComboBox);
+
+
+ vboxLayout1->addLayout(hboxLayout);
+
+ hboxLayout1 = new QHBoxLayout();
+ hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ label_15_3 = new QLabel(groupBox_2);
+ label_15_3->setObjectName(QString::fromUtf8("label_15_3"));
+ sizePolicy.setHeightForWidth(label_15_3->sizePolicy().hasHeightForWidth());
+ label_15_3->setSizePolicy(sizePolicy);
+ label_15_3->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+
+ hboxLayout1->addWidget(label_15_3);
+
+ secondTagComboBox = new QComboBox(groupBox_2);
+ secondTagComboBox->setObjectName(QString::fromUtf8("secondTagComboBox"));
+
+ hboxLayout1->addWidget(secondTagComboBox);
+
+
+ vboxLayout1->addLayout(hboxLayout1);
+
+ hboxLayout2 = new QHBoxLayout();
+ hboxLayout2->setObjectName(QString::fromUtf8("hboxLayout2"));
+ label_15_4 = new QLabel(groupBox_2);
+ label_15_4->setObjectName(QString::fromUtf8("label_15_4"));
+ sizePolicy.setHeightForWidth(label_15_4->sizePolicy().hasHeightForWidth());
+ label_15_4->setSizePolicy(sizePolicy);
+ label_15_4->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+
+ hboxLayout2->addWidget(label_15_4);
+
+ thirdTagComboBox = new QComboBox(groupBox_2);
+ thirdTagComboBox->setObjectName(QString::fromUtf8("thirdTagComboBox"));
+
+ hboxLayout2->addWidget(thirdTagComboBox);
+
+
+ vboxLayout1->addLayout(hboxLayout2);
+
+
+ vboxLayout->addWidget(groupBox_2);
+
+ groupBox = new QGroupBox(SettingsDialog);
+ groupBox->setObjectName(QString::fromUtf8("groupBox"));
+ vboxLayout2 = new QVBoxLayout(groupBox);
+ vboxLayout2->setObjectName(QString::fromUtf8("vboxLayout2"));
+ hboxLayout3 = new QHBoxLayout();
+ hboxLayout3->setSpacing(6);
+ hboxLayout3->setObjectName(QString::fromUtf8("hboxLayout3"));
+ hboxLayout3->setContentsMargins(0, 0, 0, 0);
+ label_17_2_2 = new QLabel(groupBox);
+ label_17_2_2->setObjectName(QString::fromUtf8("label_17_2_2"));
+ label_17_2_2->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+
+ hboxLayout3->addWidget(label_17_2_2);
+
+ id3v1EncComboBox = new QComboBox(groupBox);
+ id3v1EncComboBox->setObjectName(QString::fromUtf8("id3v1EncComboBox"));
+
+ hboxLayout3->addWidget(id3v1EncComboBox);
+
+
+ vboxLayout2->addLayout(hboxLayout3);
+
+ hboxLayout4 = new QHBoxLayout();
+ hboxLayout4->setSpacing(6);
+ hboxLayout4->setObjectName(QString::fromUtf8("hboxLayout4"));
+ hboxLayout4->setContentsMargins(0, 0, 0, 0);
+ label_18_2_2 = new QLabel(groupBox);
+ label_18_2_2->setObjectName(QString::fromUtf8("label_18_2_2"));
+ label_18_2_2->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+
+ hboxLayout4->addWidget(label_18_2_2);
+
+ id3v2EncComboBox = new QComboBox(groupBox);
+ id3v2EncComboBox->setObjectName(QString::fromUtf8("id3v2EncComboBox"));
+
+ hboxLayout4->addWidget(id3v2EncComboBox);
+
+
+ vboxLayout2->addLayout(hboxLayout4);
+
+
+ vboxLayout->addWidget(groupBox);
+
+ hboxLayout5 = new QHBoxLayout();
+ hboxLayout5->setSpacing(6);
+ hboxLayout5->setObjectName(QString::fromUtf8("hboxLayout5"));
+ hboxLayout5->setContentsMargins(0, 0, 0, 0);
+ spacerItem = new QSpacerItem(131, 31, QSizePolicy::Expanding, QSizePolicy::Minimum);
+
+ hboxLayout5->addItem(spacerItem);
+
+ okButton = new QPushButton(SettingsDialog);
+ okButton->setObjectName(QString::fromUtf8("okButton"));
+
+ hboxLayout5->addWidget(okButton);
+
+ cancelButton = new QPushButton(SettingsDialog);
+ cancelButton->setObjectName(QString::fromUtf8("cancelButton"));
+
+ hboxLayout5->addWidget(cancelButton);
+
+
+ vboxLayout->addLayout(hboxLayout5);
+
+
+ retranslateUi(SettingsDialog);
+ QObject::connect(cancelButton, SIGNAL(clicked()), SettingsDialog, SLOT(reject()));
+
+ firstTagComboBox->setCurrentIndex(0);
+ secondTagComboBox->setCurrentIndex(0);
+ thirdTagComboBox->setCurrentIndex(0);
+
+
+ QMetaObject::connectSlotsByName(SettingsDialog);
+ } // setupUi
+
+ void retranslateUi(QDialog *SettingsDialog)
+ {
+ SettingsDialog->setWindowTitle(QApplication::translate("SettingsDialog", "MPEG Plugin Settings", 0, QApplication::UnicodeUTF8));
+ groupBox_2->setTitle(QApplication::translate("SettingsDialog", "Tag Priority", 0, QApplication::UnicodeUTF8));
+ label_15_2->setText(QApplication::translate("SettingsDialog", "First:", 0, QApplication::UnicodeUTF8));
+ firstTagComboBox->clear();
+ firstTagComboBox->insertItems(0, QStringList()
+ << QApplication::translate("SettingsDialog", "ID3v1", 0, QApplication::UnicodeUTF8)
+ << QApplication::translate("SettingsDialog", "ID3v2", 0, QApplication::UnicodeUTF8)
+ << QApplication::translate("SettingsDialog", "APE", 0, QApplication::UnicodeUTF8)
+ << QApplication::translate("SettingsDialog", "Disabled", 0, QApplication::UnicodeUTF8)
+ );
+ label_15_3->setText(QApplication::translate("SettingsDialog", "Second:", 0, QApplication::UnicodeUTF8));
+ secondTagComboBox->clear();
+ secondTagComboBox->insertItems(0, QStringList()
+ << QApplication::translate("SettingsDialog", "ID3v1", 0, QApplication::UnicodeUTF8)
+ << QApplication::translate("SettingsDialog", "ID3v2", 0, QApplication::UnicodeUTF8)
+ << QApplication::translate("SettingsDialog", "APE", 0, QApplication::UnicodeUTF8)
+ << QApplication::translate("SettingsDialog", "Disabled", 0, QApplication::UnicodeUTF8)
+ );
+ label_15_4->setText(QApplication::translate("SettingsDialog", "Third:", 0, QApplication::UnicodeUTF8));
+ thirdTagComboBox->clear();
+ thirdTagComboBox->insertItems(0, QStringList()
+ << QApplication::translate("SettingsDialog", "ID3v1", 0, QApplication::UnicodeUTF8)
+ << QApplication::translate("SettingsDialog", "ID3v2", 0, QApplication::UnicodeUTF8)
+ << QApplication::translate("SettingsDialog", "APE", 0, QApplication::UnicodeUTF8)
+ << QApplication::translate("SettingsDialog", "Disabled", 0, QApplication::UnicodeUTF8)
+ );
+ groupBox->setTitle(QApplication::translate("SettingsDialog", "Encodings", 0, QApplication::UnicodeUTF8));
+ label_17_2_2->setText(QApplication::translate("SettingsDialog", "ID3v1 encoding:", 0, QApplication::UnicodeUTF8));
+ label_18_2_2->setText(QApplication::translate("SettingsDialog", "ID3v2 encoding:", 0, QApplication::UnicodeUTF8));
+ okButton->setText(QApplication::translate("SettingsDialog", "OK", 0, QApplication::UnicodeUTF8));
+ cancelButton->setText(QApplication::translate("SettingsDialog", "Cancel", 0, QApplication::UnicodeUTF8));
+ Q_UNUSED(SettingsDialog);
+ } // retranslateUi
+
+};
+
+namespace Ui {
+ class SettingsDialog: public Ui_SettingsDialog {};
+} // namespace Ui
+
+#endif // UI_SETTINGSDIALOG_H