aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/General/notifier/popupwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/General/notifier/popupwidget.cpp')
0 files changed, 0 insertions, 0 deletions
57 +0000 fixed FSF headers' href='/qmmp/commit/src/plugins/Input/cdaudio/decoder_cdaudio.cpp?id=a8bf072ec18a3ecfd6110a1dcfdef7f7e0daf4bd'>a8bf072ec
0853e9b69





f24382068

2b0ab39f8
56152bbc2
0853e9b69
56152bbc2


0853e9b69
0853e9b69

f24382068
0853e9b69

f24382068
0853e9b69
a85ab7165

0853e9b69


600735b03

34645c24a
0853e9b69





dfa869cd3
0853e9b69







34645c24a






dfa869cd3
34645c24a







0853e9b69

7f084cab9
0853e9b69
0853e9b69
153b4256c
0853e9b69




a85ab7165

0853e9b69

0853e9b69

153b4256c





a85ab7165
0853e9b69

9793ca4da
0853e9b69



013ee07b5
0853e9b69

0853e9b69
9793ca4da

f50471a51
9793ca4da
0853e9b69
013ee07b5
9793ca4da

0853e9b69
9793ca4da












0853e9b69

9793ca4da


0853e9b69


9793ca4da






0853e9b69
0853e9b69
600735b03






0853e9b69


















013ee07b5
0853e9b69







9793ca4da
0853e9b69








5f0cb5600
0853e9b69





11b7655bb
0853e9b69
5f0cb5600









0853e9b69




f24382068
11b7655bb
f24382068


34645c24a
f24382068









1827a9bae
f24382068

f50471a51
f24382068


f50471a51











f24382068














f24382068
34645c24a

f24382068
f24382068

f24382068

45606399b

f24382068
45606399b
f24382068

45606399b




f24382068















45606399b




f24382068








0853e9b69

600735b03
0853e9b69


f24382068

1b61b0b61
f24382068


1b61b0b61
f24382068















1b61b0b61
f24382068

11b7655bb
f24382068


11b7655bb
f24382068






013ee07b5
f24382068

0853e9b69




600735b03




0853e9b69

0853e9b69
153b4256c
0853e9b69
9793ca4da
f50471a51



9793ca4da
fc495503e
0853e9b69


11b7655bb
0853e9b69











11b7655bb
0853e9b69
9793ca4da
f50471a51
0853e9b69
9793ca4da
f50471a51

9793ca4da

f50471a51
9793ca4da
013ee07b5
9793ca4da

0853e9b69
9793ca4da




11b7655bb
9793ca4da





11b7655bb
0853e9b69
9793ca4da

0853e9b69


f50471a51
9793ca4da


11b7655bb
9793ca4da
f50471a51
0853e9b69
435f1da1d
0853e9b69
34c161d40
0853e9b69


602a9f7bb
0853e9b69
013ee07b5
0853e9b69


0b46e2db0
0853e9b69
0853e9b69


153b4256c
0853e9b69
153b4256c
0853e9b69

7f084cab9
0853e9b69
a85ab7165
0853e9b69
a85ab7165






153b4256c
a85ab7165



0853e9b69

a85ab7165
153b4256c
0853e9b69
0853e9b69
a85ab7165









153b4256c
0853e9b69
7f084cab9
153b4256c

a85ab7165
0853e9b69
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
                                                                            
                                                                            














                                                                            
                                                                            





                                                                             

                    
                      
                             
                      


                               
                       

                          
                      

                        
                              
 

                                                             


                            

                                               
                                                                     





                                                                                  
               







                                                                                    






                                                                                  
               







                                                                                    

                
                                                              
 
                  
                    




                           

                                          

 

                                 





                             
                       

 
                                                                         



                                                                 
                                                                       

                                                               
                     

                                                    
                                                                  
                                                    
     
                                                                                                             

                                            
         












                                                                                      

                          


                                                       


        






                                                                                               
     
 






                                                                 


















                                                                                                       
                         







                                                                         
                                                                        








                                                                                       
                             





                                                                                                      
                             
         









                                                                                                                   




                                                                                               
 
                                                                              


                                                  
                                               









                                                                                                         
                                                                                                                    

                                                                                        
                                                            


                                                                                                











                                                                                             














                                                                                       
                                                       

                                                        
 

                                                                 

                

                                                                
                 
                                                                                           

                                                                      




                                                                  















                                                                                                         




                                                                                 








                                          

                       
                           


                  

                                                                        
                                


                                
                                                                           















                                                                          
                                     

                                                         
                     


                                                   
                     






                                                                                                           
                

 




                                                                         




                                      

                                 
                  
                    
                            
                                                      



                                          
                                         
                                                                                                   


                                                      
                     











                                                                         
                     
     
 
                                                                                   
     
                                                                     

                                                                           

     
                                                    
     
                                                                                                             

                                            
         




                                                               
                             





                                                                                      
                         
         

                                                       


        
                                                                 


                                                           
                         
         
                                                                                               
     
                                         
                     
                                                        


                                                     
                                                                  
                                                
                


 
                                  
 


                       
                             
 
                     

 
                                                        
 
                    
     






                                                                                           
                                                                                            



                            

            
                                                                  
                                                
         
     









                                                       
 
 
                                     

                                                        
                    
 
/***************************************************************************
 *   Copyright (C) 2009-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.         *
 ***************************************************************************/


#include <QObject>
#include <QRegExp>
#include <QSettings>
#include <QFileInfo>
#include <QDir>
#include <cdio/cdio.h>
#if LIBCDIO_VERSION_NUM <= 83
#include <cdio/cdda.h>
#else
#include <cdio/paranoia/cdda.h>
#endif
#include <cdio/audio.h>
#include <cdio/cd_types.h>
#include <cdio/logging.h>
#include <cddb/cddb.h>
#include <qmmp/buffer.h>
#include <qmmp/output.h>
#include <qmmp/qmmpsettings.h>

#define CDDA_SECTORS 4
#define CDDA_BUFFER_SIZE (CDDA_SECTORS*CDIO_CD_FRAMESIZE_RAW)

#include "decoder_cdaudio.h"

QList <CDATrack> DecoderCDAudio::m_track_cache;

static void log_handler (cdio_log_level_t level, const char *message)
{
    QString str = QString::fromLocal8Bit(message).trimmed();
    switch (level)
    {
    case CDIO_LOG_DEBUG:
        qDebug("DecoderCDAudio: cdio message: %s (level=debug)", qPrintable(str));
        return;
    case CDIO_LOG_INFO:
        qDebug("DecoderCDAudio: cdio message: %s (level=info)", qPrintable(str));
        return;
    default:
        qWarning("DecoderCDAudio: cdio message: %s (level=error)", qPrintable(str));
    }
}

static void cddb_log_handler(cddb_log_level_t level, const char *message)
{
    QString str = QString::fromLocal8Bit(message).trimmed();
    switch (level)
    {
    case CDDB_LOG_DEBUG:
        qDebug("DecoderCDAudio: cddb message: %s (level=debug)", qPrintable(str));
        return;
    case CDDB_LOG_INFO:
        qDebug("DecoderCDAudio: cddb message: %s (level=info)", qPrintable(str));
        return;
    default:
        qWarning("DecoderCDAudio: cddb message: %s (level=error)", qPrintable(str));
    }
}

// Decoder class

DecoderCDAudio::DecoderCDAudio(const QString &url) : Decoder()
{
    m_bitrate = 0;
    m_totalTime = 0;
    m_first_sector = -1;
    m_last_sector  = -1;
    m_current_sector  = -1;
    m_url = url;
    m_cdio = 0;
    m_buffer_at = 0;
    m_buffer = new char[CDDA_BUFFER_SIZE];
}

DecoderCDAudio::~DecoderCDAudio()
{
    m_bitrate = 0;
    if (m_cdio)
    {
        cdio_destroy(m_cdio);
        m_cdio = 0;
    }
    delete [] m_buffer;
}

QList <CDATrack> DecoderCDAudio::generateTrackList(const QString &device)
{
    //read settings
    QSettings settings(Qmmp::configFile(), QSettings::IniFormat);
    int cd_speed = settings.value("cdaudio/speed", 0).toInt();
    bool use_cd_text = settings.value("cdaudio/cdtext", true).toBool();
    QList <CDATrack> tracks;
    cdio_log_set_handler(log_handler); //setup cdio log handler
    CdIo_t *cdio = 0;
    QString device_path = device;
    if (device_path.isEmpty() || device_path == "/")
        device_path = settings.value("cdaudio/device").toString();
    if (device_path.isEmpty() || device_path == "/")
    {
        char **cd_drives = cdio_get_devices_with_cap(0, CDIO_FS_AUDIO, true); //get drive list with CDA disks
        // open first audio capable cd drive
        if (cd_drives && *cd_drives)
        {
            cdio = cdio_open_cd(*cd_drives);
            if (!cdio)
            {
                qWarning("DecoderCDAudio: failed to open CD.");
                cdio_free_device_list(cd_drives);
                return tracks;
            }
            qDebug("DecoderCDAudio: found cd audio capable drive \"%s\"", *cd_drives);
        }
        else
        {
            qWarning("DecoderCDAudio: unable to find cd audio drive.");
            cdio_free_device_list(cd_drives);
            return tracks;
        }
        device_path = QString(*cd_drives);
        if (cd_drives && *cd_drives) //free device list
            cdio_free_device_list(cd_drives);
    }
    else
    {
        cdio = cdio_open_cd(device_path.toAscii().constData());
        if (!cdio)
        {
            qWarning("DecoderCDAudio: failed to open CD.");
            return tracks;
        }
        qDebug("DecoderCDAudio: using cd audio capable drive \"%s\"", qPrintable(device_path));
    }

    if(!m_track_cache.isEmpty() && !cdio_get_media_changed(cdio))
    {
        qDebug("DecoderCDAudio: using track cache...");
        cdio_destroy(cdio);
        return m_track_cache;
    }

    if (cd_speed)
    {
        qDebug("DecoderCDAudio: setting drive speed to %dX.", cd_speed);
        if (cdio_set_speed(cdio, 1) != DRIVER_OP_SUCCESS)
            qWarning("DecoderCDAudio: unable to set drive speed to %dX.", cd_speed);
    }

    cdrom_drive_t *pcdrom_drive = cdio_cddap_identify_cdio(cdio, 1, 0); //create paranoya CD-ROM object
    //get first and last track numbers
    int first_track_number = cdio_get_first_track_num(pcdrom_drive->p_cdio);
    int last_track_number = cdio_get_last_track_num(pcdrom_drive->p_cdio);

    if ((first_track_number == CDIO_INVALID_TRACK) || (last_track_number == CDIO_INVALID_TRACK))
    {
        qWarning("DecoderCDAudio: invalid first (last) track number.");
        cdio_destroy(cdio);
        cdio = 0;
        return tracks;
    }
    bool use_cddb = true;
    //fill track list
    for (int i = first_track_number; i <= last_track_number; ++i)
    {
        CDATrack t;
        t.first_sector = cdio_get_track_lsn(pcdrom_drive->p_cdio, i);
        t.last_sector = cdio_get_track_last_lsn(pcdrom_drive->p_cdio, i);
        t.info.setLength((t.last_sector - t.first_sector +1) / 75);
        t.info.setMetaData(Qmmp::TRACK, i);
        t.info.setPath(QString("cdda://%1#%2").arg(device_path).arg(i));
        if ((t.first_sector == CDIO_INVALID_LSN) || (t.last_sector== CDIO_INVALID_LSN))
        {
            qWarning("DecoderCDAudio: invalid stard(end) lsn for the track %d.", i);
            tracks.clear();
            cdio_destroy(cdio);
            cdio = 0;
            return tracks;
        }
        //cd text
#if LIBCDIO_VERSION_NUM <= 83
        cdtext_t *cdtext = use_cd_text ? cdio_get_cdtext(pcdrom_drive->p_cdio, i) : 0;
        if (cdtext && cdtext->field[CDTEXT_TITLE])
        {
            t.info.setMetaData(Qmmp::TITLE, QString::fromLocal8Bit(cdtext->field[CDTEXT_TITLE]));
            t.info.setMetaData(Qmmp::ARTIST, QString::fromLocal8Bit(cdtext->field[CDTEXT_PERFORMER]));
            t.info.setMetaData(Qmmp::GENRE, QString::fromLocal8Bit(cdtext->field[CDTEXT_GENRE]));
            use_cddb = false;
        }
#else