23 #include <vorbis/codec.h>    29 #include <KLocalizedString>    42 #define DEFAULT_BITRATE 128000    50     :m_source(source), m_stream_start_pos(0), m_samples_written(0),
    51      m_oy(oy), m_os(os), m_og(og), m_op(op)
    60     int count = vorbis_comment_query_count(&
m_vc, const_cast<char *>(tag));
    61     if (count < 1) 
return;
    63     for (
int i = 0; i < count; ++i) {
    64         char *text = vorbis_comment_query(&
m_vc, const_cast<char *>(tag), i);
    65         if (i) value += 
_(
"; ");
    66         value += QString::fromUtf8(text);
    69     info.
set(property, value);
    82     vorbis_info_init(&
m_vi);
    83     vorbis_comment_init(&
m_vc);
    85     if (vorbis_synthesis_headerin(&
m_vi, &
m_vc, &
m_op) < 0) {
    88             "This Ogg bitstream does not contain any Vorbis audio data."));
   101     unsigned int counter = 0;
   102     while (counter < 2) {
   104             int result = ogg_sync_pageout(&
m_oy, &
m_og);
   105             if (result == 0) 
break; 
   113                 while (counter < 2) {
   114                     result = ogg_stream_packetout(&
m_os, &
m_op);
   115                     if (result == 0) 
break;
   121                             "Corrupt secondary header. Exiting."));
   131         char *buffer = ogg_sync_buffer(&
m_oy, 4096);
   132         qint64 bytes = 
m_source->read(buffer, 4096);
   133         if (!bytes && counter < 2) {
   135                 "End of file before finding all Vorbis headers."));
   138         ogg_sync_wrote(&
m_oy, static_cast<long int>(bytes));
   143     vorbis_synthesis_init(&
m_vd, &
m_vi); 
   155     if ((
m_vi.bitrate_nominal > 0) &&
   156         (
m_vi.bitrate_nominal < std::numeric_limits<int>::max()))
   159     if ((
m_vi.bitrate_lower > 0) &&
   160         (
m_vi.bitrate_lower < std::numeric_limits<int>::max()))
   163     if ((
m_vi.bitrate_upper > 0) &&
   164         (
m_vi.bitrate_upper < std::numeric_limits<int>::max()))
   170         char **ptr = 
m_vc.user_comments;
   172         if (s.length() && !s.contains(QLatin1Char(
'='))) {
   174             qDebug(
"Bitstream is %d channel, %ldHz", 
m_vi.channels, 
m_vi.rate);
   175             qDebug(
"Encoded by: %s\n\n", 
m_vc.vendor);
   182         QString str_date  = QVariant(info.
get(
   185         date = QDate::fromString(str_date, Qt::ISODate);
   186         if (!date.isValid()) {
   187             int year = str_date.toInt();
   188             date.setDate(year, 1, 1);
   215         if (            (
m_vi.bitrate_nominal > 0)) br = 
m_vi.bitrate_nominal;
   216         if ((br < 0) && (
m_vi.bitrate_upper   > 0)) br = 
m_vi.bitrate_upper;
   217         if ((br < 0) && (
m_vi.bitrate_lower   > 0)) br = 
m_vi.bitrate_lower;
   218         qint64 file_size       = 
m_source->size();
   219         qreal rate             = 
m_vi.rate;
   220         qreal seconds          = (br > 0) ? (file_size / (br / 8)) :
   224         qDebug(
"    estimated length: %llu samples", samples);
   237     const unsigned int tracks = dest.
tracks();
   241     for (
unsigned int track = 0; track < tracks; track++) {
   242         float       *mono = pcm[track];
   244         unsigned int ofs  = 0;
   249             double   noise = (drand48() - double(0.5)) / 
double(
SAMPLE_MAX);
   250             double   d     = 
static_cast<double>(*(mono++));
   260         *(dest[track]) << buffer;
   274     if (vorbis_synthesis(&
m_vb, &
m_op) == 0)
   275         vorbis_synthesis_blockin(&
m_vd, &
m_vb);
   281     while ((samples = vorbis_synthesis_pcmout(&
m_vd, &pcm)) > 0)
   287         vorbis_synthesis_read(&
m_vd, bout);
   300     vorbis_block_clear(&
m_vb);
   301     vorbis_dsp_clear(&
m_vd);
   302     vorbis_comment_clear(&
m_vc);
   303     vorbis_info_clear(&
m_vi);  
   312         qWarning(
"file contains neither nominal bitrate (ABR mode) "   313                  "nor quality (VBR mode)");
   319             const qint64 stream_end_pos = 
m_source->pos();
   320             const qint64 stream_read = stream_end_pos -
   322             double bits = 
static_cast<double>(stream_read) * 8.0;
   324                 static_cast<double>(info.
rate());
   329             qDebug(
"-> using guessed bitrate %d bits/sec", bitrate);
   332             qDebug(
"-> using default %d kBits/sec", bitrate);
 bool contains(const FileProperty property) const
virtual unsigned int tracks() const Q_DECL_OVERRIDE
virtual int decode(Kwave::MultiWriter &dst) Q_DECL_OVERRIDE
QVariant get(FileProperty key) const
VorbisDecoder(QIODevice *source, ogg_sync_state &oy, ogg_stream_state &os, ogg_page &og, ogg_packet &op)
virtual void close(Kwave::FileInfo &info) Q_DECL_OVERRIDE
void set(FileProperty key, const QVariant &value)
virtual sample_index_t last() const
void setRate(double rate)
static int error(QWidget *widget, QString message, QString caption=QString())
void parseTag(Kwave::FileInfo &info, const char *tag, Kwave::FileProperty property)
void setTracks(unsigned int tracks)
virtual int nearest(int rate) const
static sample_t double2sample(const double f)
qint64 m_stream_start_pos
sample_index_t m_samples_written
virtual void reset() Q_DECL_OVERRIDE
virtual int open(QWidget *widget, Kwave::FileInfo &info) Q_DECL_OVERRIDE
static const StandardBitrates & instance()
static int decodeFrame(float **pcm, unsigned int size, Kwave::MultiWriter &dest)