kwave  18.07.70
SignalManager.h
Go to the documentation of this file.
1 /***************************************************************************
2  SignalManager.h - manager class for multi channel signals
3  -------------------
4  begin : Sun Oct 15 2000
5  copyright : (C) 2000 by Thomas Eschenbacher
6  email : Thomas.Eschenbacher@gmx.de
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #ifndef SIGNAL_MANAGER_H
19 #define SIGNAL_MANAGER_H
20 
21 #include "config.h"
22 #include <limits.h>
23 #include <stdio.h>
24 
25 #include <QtGlobal>
26 #include <QList>
27 #include <QMap>
28 #include <QMutex>
29 #include <QObject>
30 #include <QString>
31 
32 #include "libkwave/FileInfo.h"
33 #include "libkwave/Label.h"
34 #include "libkwave/MetaData.h"
35 #include "libkwave/MetaDataList.h"
37 #include "libkwave/ReaderMode.h"
38 #include "libkwave/Selection.h"
39 #include "libkwave/Signal.h"
41 
42 class QBitmap;
43 class QFile;
44 class QUrl;
45 
46 #define NEW_FILENAME i18n("New File")
47 
48 namespace Kwave
49 {
50 
51  class UndoAction;
52  class UndoInsertAction;
53  class UndoTransaction;
54  class UndoTransactionGuard;
55  class MultiTrackWriter;
56  class SampleReader;
57  class SignalWidget;
58  class Track;
59  class Writer;
60 
64  class Q_DECL_EXPORT SignalManager: public QObject
65  {
66  Q_OBJECT
67 
68  public:
70  explicit SignalManager(QWidget *parent);
71 
73  virtual ~SignalManager();
74 
80  int loadFile(const QUrl &url);
81 
89  void newSignal(sample_index_t samples, double rate,
90  unsigned int bits, unsigned int tracks);
91 
95  void close();
96 
98  inline bool isClosed() { return m_closed; }
99 
101  inline bool isEmpty() { return m_empty; }
102 
104  inline bool isModified() { return m_modified; }
105 
107  Kwave::PlaybackController &playbackController();
108 
115  int executeCommand(const QString &command);
116 
121  QString signalName();
122 
126  inline unsigned int bits() const {
127  return Kwave::FileInfo(m_meta_data).bits();
128  }
129 
131  inline double rate() const {
132  return Kwave::FileInfo(m_meta_data).rate();
133  }
134 
136  inline unsigned int tracks() { return m_signal.tracks(); }
137 
142  inline sample_index_t length() { return m_signal.length(); }
143 
145  inline Kwave::Selection &selection() { return m_selection; }
146 
151  inline bool trackSelected(unsigned int track) {
152  return (m_signal.trackSelected(track));
153  }
154 
158  const QList<unsigned int> selectedTracks();
159 
163  const QList<unsigned int> allTracks();
164 
172  int save(const QUrl &url, bool selection);
173 
182  bool deleteRange(sample_index_t offset, sample_index_t length,
183  const QList<unsigned int> &track_list);
184 
193  bool deleteRange(sample_index_t offset, sample_index_t length);
194 
203  bool insertSpace(sample_index_t offset, sample_index_t length,
204  const QList<unsigned int> &track_list);
205 
211  void selectRange(sample_index_t offset, sample_index_t length);
212 
217  void appendTrack();
218 
224  void insertTrack(unsigned int index);
225 
231  void deleteTrack(unsigned int index);
232 
237  void selectTracks(QList<unsigned int> &track_list);
238 
245  void selectTrack(unsigned int track, bool select);
246 
259  unsigned int track,
260  sample_index_t left = 0, sample_index_t right = 0)
261  {
262  return m_signal.openWriter(mode, track, left, right);
263  }
264 
275  unsigned int track,
277  {
278  return m_signal.openReader(mode, track, left, right);
279  }
280 
281 
290  QList<Kwave::Stripe::List> stripes(
291  const QList<unsigned int> &track_list,
292  sample_index_t left = 0,
294 
302  bool mergeStripes(const QList<Kwave::Stripe::List> &stripes,
303  const QList<unsigned int> &track_list);
304 
306  inline Kwave::UndoManager &undoManager() { return m_undo_manager; }
307 
309  inline bool undoEnabled() const { return m_undo_enabled; }
310 
312  inline bool canUndo() const {
313  return !m_undo_buffer.isEmpty() && undoEnabled();
314  }
315 
317  inline bool canRedo() const {
318  return !m_redo_buffer.isEmpty() && undoEnabled();
319  }
320 
325  void enableUndo();
326 
333  void disableUndo();
334 
340  void setFileInfo(const Kwave::FileInfo &new_info, bool with_undo);
341 
348  Kwave::Label addLabel(sample_index_t pos, const QString &name);
349 
355  void deleteLabel(int index, bool with_undo);
356 
367  bool modifyLabel(int index, sample_index_t pos, const QString &name,
368  bool with_undo);
369 
375  int labelIndex(const Kwave::Label &label) const;
376 
382  Kwave::Label findLabel(sample_index_t pos);
383 
388  Kwave::MetaDataList &metaData() { return m_meta_data; }
389 
394  const Kwave::MetaDataList &metaData() const { return m_meta_data; }
395 
400  void mergeMetaData(const Kwave::MetaDataList &meta_data);
401 
408  QUuid uuidOfTrack(unsigned int track) {
409  return m_signal.uuidOfTrack(track);
410  }
411 
416  inline void setParentWidget(QWidget *new_parent) {
417  m_parent_widget = new_parent;
418  }
419 
420  signals:
421 
427  void sigSelectionChanged(sample_index_t offset, sample_index_t length);
428 
434  void sigTrackInserted(unsigned int index, Kwave::Track *track);
435 
441  void sigTrackDeleted(unsigned int index, Kwave::Track *track);
442 
447  void sigTrackSelectionChanged(bool enabled);
448 
458  void sigSamplesInserted(unsigned int track, sample_index_t offset,
459  sample_index_t length);
460 
467  void sigSamplesDeleted(unsigned int track, sample_index_t offset,
468  sample_index_t length);
469 
476  void sigSamplesModified(unsigned int track, sample_index_t offset,
477  sample_index_t length);
478 
483  void sigMetaDataChanged(Kwave::MetaDataList meta);
484 
490  void sigUndoRedoInfo(const QString &undo, const QString &redo);
491 
496  void sigModified();
497 
498  public slots:
499 
503  void undo();
504 
508  void redo();
509 
510  private slots:
511 
519  void slotTrackInserted(unsigned int index, Kwave::Track *track);
520 
528  void slotTrackDeleted(unsigned int index, Kwave::Track *track);
529 
538  void slotSamplesInserted(unsigned int track, sample_index_t offset,
539  sample_index_t length);
540 
549  void slotSamplesDeleted(unsigned int track, sample_index_t offset,
550  sample_index_t length);
551 
560  void slotSamplesModified(unsigned int track, sample_index_t offset,
561  sample_index_t length);
562 
567  void closeUndoTransaction();
568 
577  void emitUndoRedoInfo();
578 
579  protected:
580 
582 
591  inline void deleteRange(unsigned int track, sample_index_t offset,
592  sample_index_t length)
593  {
594  m_signal.deleteRange(track, offset, length);
595  }
596 
597  protected:
598 
599  friend class MultiTrackWriter;
600  friend class PlaybackController;
601  friend class PluginManager;
602  friend class MainWidget;
603  friend class UndoTransactionGuard;
604 
618  bool registerUndoAction(Kwave::UndoAction *action);
619 
628  bool saveUndoDelete(QList<unsigned int> &track_list,
629  sample_index_t offset, sample_index_t length);
630 
634  void abortUndoTransaction();
635 
642  void startUndoTransaction(const QString &name = QString());
643 
648  void flushUndoBuffers();
649 
653  void flushRedoBuffer();
654 
659  void setModified(bool mod);
660 
662  QWidget *parentWidget() const { return m_parent_widget; }
663 
664  private:
665 
671  bool continueWithoutUndo();
672 
676  qint64 usedUndoRedoMemory();
677 
684  void freeUndoMemory(qint64 needed);
685 
690  void enableModifiedChange(bool en);
691 
693  void rememberCurrentSelection();
694 
700  void checkSelectionChange();
701 
702  private:
703 
705  QWidget *m_parent_widget;
706 
708  bool m_closed;
709 
711  bool m_empty;
712 
715 
723 
726 
729 
732 
734  QList <unsigned int> m_last_track_selection;
735 
742 
745 
748 
750  QList<Kwave::UndoTransaction *> m_undo_buffer;
751 
753  QList<Kwave::UndoTransaction *> m_redo_buffer;
754 
757 
760 
763 
766 
772 
773  };
774 }
775 
776 #endif /* SIGNAL_MANAGER_H */
777 
778 //***************************************************************************
779 //***************************************************************************
QWidget * parentWidget() const
QList< Kwave::UndoTransaction * > m_redo_buffer
Definition: App.h:33
bool canRedo() const
ReaderMode
Definition: ReaderMode.h:27
double rate() const
Definition: FileInfo.cpp:415
Kwave::UndoManager & undoManager()
Kwave::MetaDataList & metaData()
QUuid uuidOfTrack(unsigned int track)
Kwave::Selection & selection()
Kwave::Writer * openWriter(Kwave::InsertMode mode, unsigned int track, sample_index_t left=0, sample_index_t right=0)
unsigned int tracks()
quint64 sample_index_t
Definition: Sample.h:28
unsigned int m_undo_transaction_level
Kwave::SampleReader * openReader(Kwave::ReaderMode mode, unsigned int track, sample_index_t left=0, sample_index_t right=SAMPLE_INDEX_MAX)
void deleteRange(unsigned int track, sample_index_t offset, sample_index_t length)
sample_index_t m_last_length
const char name[16]
Definition: memcpy.c:510
bool trackSelected(unsigned int track)
Kwave::PlaybackController m_playback_controller
void setParentWidget(QWidget *new_parent)
sample_index_t length()
double rate() const
Kwave::MetaDataList m_meta_data
Kwave::Selection m_last_selection
bool canUndo() const
Kwave::Signal m_signal
bool undoEnabled() const
Kwave::UndoTransaction * m_undo_transaction
unsigned int bits() const
InsertMode
Definition: InsertMode.h:26
unsigned int bits() const
Definition: FileInfo.cpp:430
QList< Kwave::UndoTransaction * > m_undo_buffer
Kwave::Selection m_selection
#define SAMPLE_INDEX_MAX
Definition: Sample.h:31
const Kwave::MetaDataList & metaData() const
Kwave::UndoManager m_undo_manager
QList< unsigned int > m_last_track_selection