diff options
Diffstat (limited to 'src/plugins/Input/mad')
| -rw-r--r-- | src/plugins/Input/mad/CMakeLists.txt | 90 | ||||
| -rw-r--r-- | src/plugins/Input/mad/decoder_mad.cpp | 572 | ||||
| -rw-r--r-- | src/plugins/Input/mad/decoder_mad.h | 95 | ||||
| -rw-r--r-- | src/plugins/Input/mad/decodermadfactory.cpp | 188 | ||||
| -rw-r--r-- | src/plugins/Input/mad/decodermadfactory.h | 53 | ||||
| -rw-r--r-- | src/plugins/Input/mad/detailsdialog.cpp | 294 | ||||
| -rw-r--r-- | src/plugins/Input/mad/detailsdialog.h | 63 | ||||
| -rw-r--r-- | src/plugins/Input/mad/detailsdialog.ui | 392 | ||||
| -rw-r--r-- | src/plugins/Input/mad/mad.pro | 39 | ||||
| -rw-r--r-- | src/plugins/Input/mad/settingsdialog.cpp | 107 | ||||
| -rw-r--r-- | src/plugins/Input/mad/settingsdialog.h | 52 | ||||
| -rw-r--r-- | src/plugins/Input/mad/settingsdialog.ui | 306 | ||||
| -rw-r--r-- | src/plugins/Input/mad/translations/mad_plugin_ru.qm | bin | 0 -> 3625 bytes | |||
| -rw-r--r-- | src/plugins/Input/mad/translations/mad_plugin_ru.ts | 242 | ||||
| -rw-r--r-- | src/plugins/Input/mad/translations/translations.qrc | 6 | ||||
| -rw-r--r-- | src/plugins/Input/mad/ui_detailsdialog.h | 400 | ||||
| -rw-r--r-- | src/plugins/Input/mad/ui_settingsdialog.h | 245 |
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 Binary files differnew file mode 100644 index 000000000..16bea746b --- /dev/null +++ b/src/plugins/Input/mad/translations/mad_plugin_ru.qm 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 <forkotov02@hotmail.ru></source> + <translation>Разработчик: Илья Котов <forkotov02@hotmail.ru></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 |
