comparison data/fileio/WavFileReader.cpp @ 175:b0f4555b625e

* Introduce WritableWaveFileModel, and use it as an output model for audio real-time plugin transforms. Updates aren't working correctly yet.
author Chris Cannam
date Tue, 03 Oct 2006 14:17:37 +0000
parents c03ec31005e1
children 570794f6f6a7
comparison
equal deleted inserted replaced
174:f8cf055dbf34 175:b0f4555b625e
15 15
16 #include "WavFileReader.h" 16 #include "WavFileReader.h"
17 17
18 #include <iostream> 18 #include <iostream>
19 19
20 #include <QMutexLocker>
21
20 WavFileReader::WavFileReader(QString path) : 22 WavFileReader::WavFileReader(QString path) :
21 m_file(0), 23 m_file(0),
22 m_path(path), 24 m_path(path),
23 m_buffer(0), 25 m_buffer(0),
24 m_bufsiz(0), 26 m_bufsiz(0),
31 33
32 m_fileInfo.format = 0; 34 m_fileInfo.format = 0;
33 m_fileInfo.frames = 0; 35 m_fileInfo.frames = 0;
34 m_file = sf_open(m_path.toLocal8Bit(), SFM_READ, &m_fileInfo); 36 m_file = sf_open(m_path.toLocal8Bit(), SFM_READ, &m_fileInfo);
35 37
36 if (!m_file || m_fileInfo.frames <= 0 || m_fileInfo.channels <= 0) { 38 if (!m_file || m_fileInfo.channels <= 0) {
37 std::cerr << "WavFileReader::initialize: Failed to open file (" 39 std::cerr << "WavFileReader::initialize: Failed to open file ("
38 << sf_strerror(m_file) << ")" << std::endl; 40 << sf_strerror(m_file) << ")" << std::endl;
39 41
40 if (m_file) { 42 if (m_file) {
41 m_error = QString("Couldn't load audio file '%1':\n%2") 43 m_error = QString("Couldn't load audio file '%1':\n%2")
48 } 50 }
49 51
50 m_frameCount = m_fileInfo.frames; 52 m_frameCount = m_fileInfo.frames;
51 m_channelCount = m_fileInfo.channels; 53 m_channelCount = m_fileInfo.channels;
52 m_sampleRate = m_fileInfo.samplerate; 54 m_sampleRate = m_fileInfo.samplerate;
55
56 std::cerr << "WavFileReader: Frame count " << m_frameCount << ", channel count " << m_channelCount << ", sample rate " << m_sampleRate << std::endl;
57
53 } 58 }
54 59
55 WavFileReader::~WavFileReader() 60 WavFileReader::~WavFileReader()
56 { 61 {
57 if (m_file) sf_close(m_file); 62 if (m_file) sf_close(m_file);
58 } 63 }
59 64
60 void 65 void
66 WavFileReader::updateFrameCount()
67 {
68 QMutexLocker locker(&m_mutex);
69
70 size_t prevCount = m_fileInfo.frames;
71
72 if (m_file) {
73 sf_close(m_file);
74 m_file = sf_open(m_path.toLocal8Bit(), SFM_READ, &m_fileInfo);
75 if (!m_file || m_fileInfo.channels <= 0) {
76 std::cerr << "WavFileReader::updateFrameCount: Failed to open file ("
77 << sf_strerror(m_file) << ")" << std::endl;
78 }
79 }
80
81 std::cerr << "WavFileReader::updateFrameCount: now " << m_fileInfo.frames << std::endl;
82
83 if (m_fileInfo.frames != prevCount) emit frameCountChanged();
84 }
85
86 void
61 WavFileReader::getInterleavedFrames(size_t start, size_t count, 87 WavFileReader::getInterleavedFrames(size_t start, size_t count,
62 SampleBlock &results) const 88 SampleBlock &results) const
63 { 89 {
90 if (count == 0) return;
64 results.clear(); 91 results.clear();
65 if (!m_file || !m_channelCount) return; 92
66 if (count == 0) return; 93 QMutexLocker locker(&m_mutex);
94
95 if (!m_file || !m_channelCount) {
96 return;
97 }
67 98
68 if ((long)start >= m_fileInfo.frames) { 99 if ((long)start >= m_fileInfo.frames) {
100 // std::cerr << "WavFileReader::getInterleavedFrames: " << start
101 // << " > " << m_fileInfo.frames << std::endl;
69 return; 102 return;
70 } 103 }
71 104
72 if (long(start + count) > m_fileInfo.frames) { 105 if (long(start + count) > m_fileInfo.frames) {
73 count = m_fileInfo.frames - start; 106 count = m_fileInfo.frames - start;
74 } 107 }
75 108
76 sf_count_t readCount = 0; 109 sf_count_t readCount = 0;
77 110
78 m_mutex.lock();
79
80 if (start != m_lastStart || count != m_lastCount) { 111 if (start != m_lastStart || count != m_lastCount) {
81 112
82 if (sf_seek(m_file, start, SEEK_SET) < 0) { 113 if (sf_seek(m_file, start, SEEK_SET) < 0) {
83 m_mutex.unlock(); 114 // std::cerr << "sf_seek failed" << std::endl;
84 return; 115 return;
85 } 116 }
86 117
87 if (count * m_fileInfo.channels > m_bufsiz) { 118 if (count * m_fileInfo.channels > m_bufsiz) {
88 // std::cerr << "WavFileReader: Reallocating buffer for " << count 119 // std::cerr << "WavFileReader: Reallocating buffer for " << count
92 delete[] m_buffer; 123 delete[] m_buffer;
93 m_buffer = new float[m_bufsiz]; 124 m_buffer = new float[m_bufsiz];
94 } 125 }
95 126
96 if ((readCount = sf_readf_float(m_file, m_buffer, count)) < 0) { 127 if ((readCount = sf_readf_float(m_file, m_buffer, count)) < 0) {
97 m_mutex.unlock(); 128 // std::cerr << "sf_readf_float failed" << std::endl;
98 return; 129 return;
99 } 130 }
100 131
101 m_lastStart = start; 132 m_lastStart = start;
102 m_lastCount = readCount; 133 m_lastCount = readCount;
104 135
105 for (size_t i = 0; i < count * m_fileInfo.channels; ++i) { 136 for (size_t i = 0; i < count * m_fileInfo.channels; ++i) {
106 results.push_back(m_buffer[i]); 137 results.push_back(m_buffer[i]);
107 } 138 }
108 139
109 m_mutex.unlock();
110 return; 140 return;
111 } 141 }
112 142
113 void 143 void
114 WavFileReader::getSupportedExtensions(std::set<QString> &extensions) 144 WavFileReader::getSupportedExtensions(std::set<QString> &extensions)