annotate audioio/ClipMixer.cpp @ 308:289d65722123 tonioni

More work on mixing and file i/o for sample stuff
author Chris Cannam
date Tue, 07 Jan 2014 15:50:04 +0000
parents 6eb15c3aee0a
children 8c59cc68eabd
rev   line source
Chris@305 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@305 2
Chris@305 3 /*
Chris@305 4 Sonic Visualiser
Chris@305 5 An audio file viewer and annotation editor.
Chris@305 6 Centre for Digital Music, Queen Mary, University of London.
Chris@305 7 This file copyright 2006 Chris Cannam, 2006-2014 QMUL.
Chris@305 8
Chris@305 9 This program is free software; you can redistribute it and/or
Chris@305 10 modify it under the terms of the GNU General Public License as
Chris@305 11 published by the Free Software Foundation; either version 2 of the
Chris@305 12 License, or (at your option) any later version. See the file
Chris@305 13 COPYING included with this distribution for more information.
Chris@305 14 */
Chris@305 15
Chris@305 16 #include "ClipMixer.h"
Chris@305 17
Chris@305 18 #include <sndfile.h>
Chris@305 19
Chris@305 20 #include "base/Debug.h"
Chris@305 21
Chris@305 22 ClipMixer::ClipMixer(int channels, int sampleRate, int blockSize) :
Chris@305 23 m_channels(channels),
Chris@305 24 m_sampleRate(sampleRate),
Chris@305 25 m_blockSize(blockSize),
Chris@305 26 m_clipData(0)
Chris@305 27 {
Chris@305 28 }
Chris@305 29
Chris@305 30 ClipMixer::~ClipMixer()
Chris@305 31 {
Chris@305 32 delete[] m_clipData;
Chris@305 33 }
Chris@305 34
Chris@308 35 void
Chris@308 36 ClipMixer::setChannelCount(int channels)
Chris@308 37 {
Chris@308 38 m_channels = channels;
Chris@308 39 }
Chris@308 40
Chris@305 41 bool
Chris@305 42 ClipMixer::loadClipData(QString path, float f0)
Chris@305 43 {
Chris@305 44 if (m_clipData) {
Chris@307 45 cerr << "ClipMixer::loadClipData: Already have clip loaded" << endl;
Chris@305 46 return false;
Chris@305 47 }
Chris@305 48
Chris@305 49 SF_INFO info;
Chris@305 50 SNDFILE *file;
Chris@305 51 int sampleCount = 0;
Chris@305 52 float *tmpFrames;
Chris@305 53 size_t i;
Chris@305 54
Chris@305 55 info.format = 0;
Chris@305 56 file = sf_open(path.toLocal8Bit().data(), SFM_READ, &info);
Chris@305 57 if (!file) {
Chris@308 58 cerr << "ClipMixer::loadClipData: Failed to open file path \""
Chris@308 59 << path << "\": " << sf_strerror(file) << endl;
Chris@305 60 return false;
Chris@305 61 }
Chris@305 62
Chris@305 63 tmpFrames = (float *)malloc(info.frames * info.channels * sizeof(float));
Chris@305 64 if (!tmpFrames) {
Chris@307 65 cerr << "ClipMixer::loadClipData: malloc(" << info.frames * info.channels * sizeof(float) << ") failed" << endl;
Chris@305 66 return false;
Chris@305 67 }
Chris@305 68
Chris@305 69 sf_readf_float(file, tmpFrames, info.frames);
Chris@305 70 sf_close(file);
Chris@305 71
Chris@305 72 m_clipData = (float *)malloc(info.frames * sizeof(float));
Chris@305 73 if (!m_clipData) {
Chris@307 74 cerr << "ClipMixer::loadClipData: malloc(" << info.frames * sizeof(float) << ") failed" << endl;
Chris@305 75 free(tmpFrames);
Chris@305 76 return false;
Chris@305 77 }
Chris@305 78
Chris@305 79 for (i = 0; i < info.frames; ++i) {
Chris@305 80 int j;
Chris@305 81 m_clipData[i] = 0.0f;
Chris@305 82 for (j = 0; j < info.channels; ++j) {
Chris@305 83 m_clipData[i] += tmpFrames[i * info.channels + j];
Chris@305 84 }
Chris@305 85 }
Chris@305 86
Chris@305 87 free(tmpFrames);
Chris@305 88
Chris@305 89 m_clipLength = info.frames;
Chris@305 90 m_clipF0 = f0;
Chris@305 91 m_clipRate = info.samplerate;
Chris@305 92 }
Chris@307 93
Chris@307 94 void
Chris@308 95 ClipMixer::reset()
Chris@308 96 {
Chris@308 97 //!!!
Chris@308 98 }
Chris@308 99
Chris@308 100 void
Chris@307 101 ClipMixer::mix(float **toBuffers,
Chris@308 102 float gain,
Chris@307 103 std::vector<NoteStart> newNotes,
Chris@307 104 std::vector<NoteEnd> endingNotes)
Chris@307 105 {
Chris@307 106 //!!! do this!
Chris@307 107 }
Chris@307 108