File: WavFileReader.h

package info (click to toggle)
sonic-visualiser 5.2.1-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 24,640 kB
  • sloc: cpp: 158,888; ansic: 11,920; sh: 1,785; makefile: 517; xml: 64; perl: 31
file content (124 lines) | stat: -rw-r--r-- 3,733 bytes parent folder | download | duplicates (2)
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
/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */

/*
    Sonic Visualiser
    An audio file viewer and annotation editor.
    Centre for Digital Music, Queen Mary, University of London.
    This file copyright 2006 Chris Cannam.
    
    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.  See the file
    COPYING included with this distribution for more information.
*/

#ifndef SV_WAV_FILE_READER_H
#define SV_WAV_FILE_READER_H

// Most library support is included only with a HAVE_ flag, but this
// reader which uses libsndfile directly is different: we won't skip
// it without a more explicit direction. That's because in some places
// we rely on capabilities it has (e.g. peak chunks, w64 float
// support) that another wav file reader might not, and it's the only
// reader we support for direct seeking, so we don't want to lose it
// by accident. But we do want to allow builds without libsndfile,
// e.g. for embedded scenarios where we usually aren't reading the
// audio ourselves.
//
#ifndef WITHOUT_LIBSNDFILE

#include "AudioFileReader.h"

#ifdef Q_OS_WIN
#include <windows.h>
#define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1
#endif

#include <sndfile.h>
#include <QMutex>

#include <set>

namespace sv {

/**
 * Reader for audio files using libsndfile.
 *
 * This is typically intended for seekable file types that can be read
 * directly (e.g. WAV, AIFF etc).
 *
 * Compressed files supported by libsndfile (e.g. Ogg, FLAC) should
 * normally be read using DecodingWavFileReader instead (which decodes
 * to an intermediate cached file).
 */
class WavFileReader : public AudioFileReader
{
public:
    enum class Normalisation { None, Peak };

    WavFileReader(FileSource source,
                  bool fileUpdating = false,
                  Normalisation normalise = Normalisation::None);
    virtual ~WavFileReader();

    QString getLocation() const override { return m_source.getLocation(); }
    QString getError() const override { return m_error; }

    QString getTitle() const override { return m_title; }
    QString getMaker() const override { return m_maker; }
    
    QString getLocalFilename() const override { return m_path; }
    
    bool isQuicklySeekable() const override { return m_seekable; }
    
    /** 
     * Must be safe to call from multiple threads with different
     * arguments on the same object at the same time.
     */
    floatvec_t getInterleavedFrames(sv_frame_t start, sv_frame_t count) const override;
    
    static void getSupportedExtensions(std::set<QString> &extensions);
    static bool supportsExtension(QString ext);
    static bool supportsContentType(QString type);
    static bool supports(FileSource &source);

    int getDecodeCompletion() const override { return 100; }

    bool isUpdating() const override { return m_updating; }

    void updateFrameCount() override;
    void updateDone() override;

protected:
    SF_INFO m_fileInfo;
    SNDFILE *m_file;

    FileSource m_source;
    QString m_path;
    QString m_error;
    QString m_title;
    QString m_maker;

    bool m_seekable;

    mutable QMutex m_mutex;
    mutable floatvec_t m_buffer;
    mutable sv_frame_t m_lastStart;
    mutable sv_frame_t m_lastCount;

    Normalisation m_normalisation;
    float m_max;

    bool m_updating;

    floatvec_t getInterleavedFramesUnnormalised(sv_frame_t start,
                                                sv_frame_t count) const;
    float getMax() const;
};

} // end namespace sv

#endif // !WITHOUT_LIBSNDFILE

#endif