From: Mathias L. <lun...@us...> - 2005-07-07 19:42:18
|
Update of /cvsroot/lmuse/muse/muse/waveedit In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9300/muse/waveedit Modified Files: Tag: REL07 waveview.cpp waveview.h Log Message: Implemented muteSelection, mutes current selection. Bugfixes as well. Index: waveview.cpp =================================================================== RCS file: /cvsroot/lmuse/muse/muse/waveedit/waveview.cpp,v retrieving revision 1.10.2.2 retrieving revision 1.10.2.3 diff -C2 -d -r1.10.2.2 -r1.10.2.3 *** waveview.cpp 6 Jul 2005 06:41:52 -0000 1.10.2.2 --- waveview.cpp 7 Jul 2005 19:42:08 -0000 1.10.2.3 *************** *** 10,13 **** --- 10,15 ---- #include <qpainter.h> + #include <qdir.h> + #include <qfileinfo.h> #include "globals.h" #include "wave.h" *************** *** 15,20 **** #include "song.h" #include "event.h" ! #include "midieditor.h" ! //--------------------------------------------------------- // WaveView --- 17,22 ---- #include "song.h" #include "event.h" ! #include "waveedit.h" ! #include "audio.h" //--------------------------------------------------------- // WaveView *************** *** 46,49 **** --- 48,52 ---- } connect(song, SIGNAL(posChanged(int,unsigned,bool)), SLOT(setPos(int,unsigned,bool))); + connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int))); songChanged(SC_SELECTION); } *************** *** 114,118 **** f.read(sa, xScale, pos); pos += xScale; ! unsigned peoffset = px + event.frame(); int selectionStartPos = selectionStart - peoffset; // Offset transformed to event coords int selectionStopPos = selectionStop - peoffset; --- 117,121 ---- f.read(sa, xScale, pos); pos += xScale; ! unsigned peoffset = px + event.frame() - event.spos(); int selectionStartPos = selectionStart - peoffset; // Offset transformed to event coords int selectionStopPos = selectionStop - peoffset; *************** *** 226,229 **** --- 229,235 ---- } } + if (flags & SC_CLIP_MODIFIED) { + redraw(); // Boring, but the only thing possible to do + } if (flags & SC_TEMPO) { setPos(0, song->cpos(), false); *************** *** 337,340 **** --- 343,349 ---- } + //--------------------------------------------------------- + // viewMouseReleaseEvent + //--------------------------------------------------------- void WaveView::viewMouseReleaseEvent(QMouseEvent* event) { *************** *** 344,347 **** --- 353,357 ---- if (mode == DRAG) { mode = NORMAL; + //printf("selectionStart=%d selectionStop=%d\n", selectionStart, selectionStop); } } *************** *** 396,397 **** --- 406,574 ---- } + + //--------------------------------------------------------- + // cmd + //--------------------------------------------------------- + void WaveView::cmd(int n) + { + if (selectionStart == selectionStop) { + printf("No selection. Ignoring\n"); //@!TODO: Disable menu options when no selection + return; + } + + switch(n) { + case WaveEdit::CMD_MUTE: + muteSelection(selectionStart, selectionStop); + break; + + case WaveEdit::CMD_NORMALIZE: + printf("normalize: not implemented\n"); + break; + + default: + break; + } + } + + + //--------------------------------------------------------- + // muteSelection + //--------------------------------------------------------- + void WaveView::muteSelection(unsigned startpos, unsigned stoppos) + { + for (iPart ip = editor->parts()->begin(); ip != editor->parts()->end(); ++ip) { + WavePart* wp = (WavePart*)(ip->second); + unsigned part_offset = wp->frame(); + + EventList* el = wp->events(); + + audio->msgIdle(true); // Not good with playback during operations + song->startUndo(); + for (iEvent e = el->begin(); e != el->end(); ++e) { + Event event = e->second; + if (event.empty()) + continue; + SndFileR file = event.sndFile(); + if (file.isNull()) + continue; + + unsigned event_offset = event.frame() + part_offset; + unsigned event_startpos = event.spos(); + unsigned event_length = event.lenFrame(); + unsigned event_end = event_offset + event_length; + unsigned file_channels = file.channels(); + //printf("startpos=%d stoppos=%d part_offset=%d event_offset=%d event_startpos=%d event_length=%d event_end=%d\n", startpos, stoppos, part_offset, event_offset, event_startpos, event_length, event_end); + + if (!(event_end <= startpos || event_offset >= stoppos)) { + int tmp_sx = startpos - event_offset + event_startpos; + int tmp_ex = stoppos - event_offset + event_startpos; + unsigned sx; + unsigned ex; + + tmp_sx < (int)event_startpos ? sx = event_startpos : sx = tmp_sx; + tmp_ex > (int)event_length ? ex = event_length : ex = tmp_ex; + + //printf("Event data affected: %d->%d\n", sx, ex); + + QString tmpWavFile = QString::null; + if (!getUniqueTmpfileName(tmpWavFile)) { + return; + } + + SndFile tmpFile(tmpWavFile); + tmpFile.setFormat(file.format(), file_channels, file.samplerate()); + if (tmpFile.openWrite()) { + printf("Could not open temporary file, aborting...\n"); + return; + } + + // + // Write out data that will be changed to temp file + // + unsigned tmpdatalen = ex - sx; + off_t tmpdataoffset = sx; + float* tmpdata[file_channels]; + + for (unsigned i=0; i<file_channels; i++) { + tmpdata[i] = new float[tmpdatalen]; + } + + file.seek(tmpdataoffset, 0); + file.read(file_channels, tmpdata, tmpdatalen); + file.close(); + tmpFile.write(file_channels, tmpdata, tmpdatalen); + tmpFile.update(); + tmpFile.close(); + + // Set everything to 0! + for (unsigned i=0; i<file_channels; i++) { + for (unsigned j=0; j<tmpdatalen; j++) { + tmpdata[i][j] = 0; + } + } + + file.openWrite(); + file.seek(tmpdataoffset, 0); + file.write(file_channels, tmpdata, tmpdatalen); + file.update(); + file.close(); + file.openRead(); + + for (unsigned i=0; i<file_channels; i++) { + delete[] tmpdata[i]; + } + + // Test undo handling + song->cmdChangeWave(file.dirPath() + "/" + file.name(), tmpWavFile, sx, ex); + } + } + } + audio->msgIdle(false); // Not good with playback during operations + song->endUndo(SC_CLIP_MODIFIED); + redraw(); + } + + //--------------------------------------------------------- + // getUniqueTmpfileName + //--------------------------------------------------------- + bool WaveView::getUniqueTmpfileName(QString& newFilename) + { + // Check if tmp-directory exists under project path + QString tmpWavDir = museProject + "/tmp_musewav"; //!@TODO: Don't hardcode like this + QFileInfo tmpdirfi(tmpWavDir); + if (!tmpdirfi.isDir()) { + // Try to create a tmpdir + QDir projdir(museProject); + if (!projdir.mkdir("tmp_musewav")) { + printf("Could not create undo dir!\n"); + return false; + } + } + + + tmpdirfi.setFile(tmpWavDir); + + if (!tmpdirfi.isWritable()) { + printf("Temp directory is not writable - aborting\n"); + return false; + } + + QDir tmpdir = tmpdirfi.dir(); + + // Find a new filename + for (int i=0; i<10000; i++) { + QString filename = "muse_tmp"; + filename.append(QString::number(i)); + filename.append(".wav"); + + if (!tmpdir.exists(tmpWavDir +"/" + filename, true)) { + newFilename = tmpWavDir + "/" + filename; + return true; + } + + } + + printf("Could not find a suitable tmpfilename (more than 10000 tmpfiles in tmpdir - clean up!\n"); + return false; + } + Index: waveview.h =================================================================== RCS file: /cvsroot/lmuse/muse/muse/waveedit/waveview.h,v retrieving revision 1.3.2.1 retrieving revision 1.3.2.2 diff -C2 -d -r1.3.2.1 -r1.3.2.2 *** waveview.h 6 Jul 2005 06:41:52 -0000 1.3.2.1 --- waveview.h 7 Jul 2005 19:42:08 -0000 1.3.2.2 *************** *** 44,47 **** --- 44,51 ---- virtual void viewMouseReleaseEvent(QMouseEvent*); + bool getUniqueTmpfileName(QString& newFilename); //!< Tries to create a temporary SndFile + + void muteSelection(unsigned startpos, unsigned stoppos); //!< Mutes selection + private slots: void setPos(int idx, unsigned val, bool adjustScrollbar); *************** *** 49,52 **** --- 53,57 ---- public slots: void setYScale(int); + void songChanged(int type); signals: *************** *** 58,62 **** QString getCaption() const; void range(int*, int*); ! void songChanged(int type); }; --- 63,67 ---- QString getCaption() const; void range(int*, int*); ! void cmd(int n); }; |