aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/flac/decoder_flac.h
blob: 215d2d7e378461cb9919058dbe107663b216c77f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/***************************************************************************
 *   Copyright (C) 2006-2014 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.,                                       *
 *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
 ***************************************************************************/

#ifndef DECODER_FLAC_H
#define DECODER_FLAC_H

#include <qmmp/decoder.h>

#include <FLAC/all.h>

#define MAX_SUPPORTED_CHANNELS 2
#define SAMPLES_PER_WRITE 512
#define SAMPLE_BUFFER_SIZE ((FLAC__MAX_BLOCK_SIZE + SAMPLES_PER_WRITE) * MAX_SUPPORTED_CHANNELS * (32/8))

class CUEParser;

struct flac_data
{
    //FLAC__SeekableStreamDecoder *decoder;
    FLAC__StreamDecoder *decoder;
    struct io_stream *stream;
    int bitrate;
    int abort; /* abort playing (due to an error) */

    qint64 length;
    qint64 total_samples;

    FLAC__byte sample_buffer[SAMPLE_BUFFER_SIZE];
    unsigned sample_buffer_fill;

    /* sound parameters */
    unsigned bits_per_sample;
    unsigned sample_rate;
    unsigned channels;

    FLAC__uint64 last_bytes;

    int ok; /* was this stream successfully opened? */
    //struct decoder_error error;
    QIODevice *input;
};

class DecoderFLAC : public Decoder
{
public:
    DecoderFLAC(const QString &path, QIODevice *i);
    virtual ~DecoderFLAC();

    // Standard Decoder API
    bool initialize();
    qint64 totalTime();
    int bitrate();
    qint64 read(char *data, qint64 maxSize);
    void seek(qint64 time);
    const QString nextURL() const;
    void next();

    struct flac_data *data()
    {
        return m_data;
    }

private:

    // helper functions
    void deinit();
    uint findID3v2(char *data, ulong size); //retuns ID3v2 tag size
    ChannelMap findChannelMap(int channels);

    struct flac_data *m_data;
    qint64 length_in_bytes;
    qint64 m_totalBytes;
    qint64 m_offset;
    qint64 m_length;
    QString m_path;
    CUEParser *m_parser;
    int m_track;
    char *m_buf; //buffer for remainig data
    qint64 m_buf_size;
    qint64 m_sz; //sample size
};


#endif // __decoder_flac_h
02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> 2008-09-13 16:13:18 +0000 improved visalization' href='/qmmp/commit/src/ui/pluginitem.cpp?h=main&id=3ffc8b54aff2cf907d4c35dc9a9972005db51f36'>3ffc8b54a
86aac72c6








3ffc8b54a
86aac72c6
2a9a78ddd

a9fe5096a
2a9a78ddd
2a9a78ddd


















3ffc8b54a
2a9a78ddd
06d187781

a9fe5096a
06d187781
06d187781


06d187781




24b5ddfcb
06d187781








3ffc8b54a
06d187781
1d58bc219
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
                                                                            
                                                                            




















                                                                             





                                

                                  
                                  



                       
                                                                       

                         







                                   
                                         








                                              
                                           


          
                                                                                         
 








                                     
                                         



                                   
                                                 



                                          
                     
 

          
                                                                                         
 








                                      
                                      








                                          
                     
 

          
                                                                                         
 


















                                          
                     
 

           
                                                                                            
 


                     




                                       
                                                          








                                            
                     
 
 
/***************************************************************************
 *   Copyright (C) 2007-2008 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 <QSettings>
#include <QDir>

#include <qmmp/decoderfactory.h>
#include <qmmp/outputfactory.h>
#include <qmmp/visualfactory.h>
#include <qmmp/effectfactory.h>
#include <qmmp/effect.h>
#include <qmmp/soundcore.h>
#include <qmmpui/generalfactory.h>
#include <qmmpui/general.h>
#include <qmmpui/generalhandler.h>

#include "pluginitem.h"

/*Input*/
InputPluginItem::InputPluginItem(QObject *parent, DecoderFactory *fact)
        : QObject(parent)
{
    m_factory = fact;
}

InputPluginItem::~InputPluginItem()
{}

bool InputPluginItem::isSelected()
{
    return Decoder::isEnabled(m_factory);
}

DecoderFactory* InputPluginItem::factory()
{
    return m_factory;
}

void InputPluginItem::setSelected(bool select)
{
    Decoder::setEnabled(m_factory, select);
}

/*Output*/
OutputPluginItem::OutputPluginItem(QObject *parent, OutputFactory *fact): QObject(parent)
{
    m_factory = fact;
}


OutputPluginItem::~OutputPluginItem()
{}

void OutputPluginItem::select()
{
    Output::setCurrentFactory(m_factory);
}

bool OutputPluginItem::isSelected()
{
    return Output::currentFactory() == m_factory;
}

OutputFactory *OutputPluginItem::factory()
{
    return m_factory;
}

/*Visual*/
VisualPluginItem::VisualPluginItem(QObject *parent, VisualFactory *fact): QObject(parent)
{
    m_factory = fact;
}


VisualPluginItem::~VisualPluginItem()
{}

void VisualPluginItem::select(bool on)
{
    Visual::setEnabled(m_factory, on);
}

bool VisualPluginItem::isSelected()
{
    return Visual::isEnabled(m_factory);
}

VisualFactory *VisualPluginItem::factory()
{
    return m_factory;
}

/*Effect*/
EffectPluginItem::EffectPluginItem(QObject *parent, EffectFactory *fact): QObject(parent)
{
    m_factory = fact;
}


EffectPluginItem::~EffectPluginItem()
{}

void EffectPluginItem::select(bool on)
{
    Effect::setEnabled(m_factory, on);
}

bool EffectPluginItem::isSelected()
{
    return Effect::isEnabled(m_factory);
}

EffectFactory *EffectPluginItem::factory()
{
    return m_factory;
}

/*General*/
GeneralPluginItem::GeneralPluginItem(QObject *parent, GeneralFactory *fact): QObject(parent)
{
    m_factory = fact;
}

GeneralPluginItem::~GeneralPluginItem()
{}

void GeneralPluginItem::select(bool on)
{
    GeneralHandler::instance()->setEnabled(m_factory, on);
}

bool GeneralPluginItem::isSelected()
{
    return General::isEnabled(m_factory);
}

GeneralFactory *GeneralPluginItem::factory()
{
    return m_factory;
}