00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef SONG_H
00023 #define SONG_H
00024
00025 #include "ContextItem.h"
00026 #include "AudioProcessingItem.h"
00027 #include <QDomNode>
00028 #include <QTimer>
00029 #include "defines.h"
00030 #include "APILinkedList.h"
00031 #include "GainEnvelope.h"
00032
00033 class Project;
00034 class Track;
00035 class AudioSource;
00036 class WriteSource;
00037 class Track;
00038 class AudioClip;
00039 class DiskIO;
00040 class AudioClipManager;
00041 class Client;
00042 class AudioBus;
00043 class PluginChain;
00044 class SnapList;
00045 class Plugin;
00046 class TimeLine;
00047 class Snappable;
00048 class DecodeBuffer;
00049
00050 struct ExportSpecification;
00051
00052 class Sheet : public ContextItem, public AudioProcessingItem
00053 {
00054 Q_OBJECT
00055 Q_CLASSINFO("start_transport", tr("Play"))
00056 Q_CLASSINFO("set_recordable_and_start_transport", tr("Record"));
00057 Q_CLASSINFO("work_next_edge", tr("Workcursor: To next edge"))
00058 Q_CLASSINFO("work_previous_edge", tr("Workcursor: To previous edge"))
00059 Q_CLASSINFO("undo", tr("Undo"))
00060 Q_CLASSINFO("redo", tr("Redo"))
00061 Q_CLASSINFO("toggle_snap", tr("Snap: On/Off"))
00062 Q_CLASSINFO("toggle_solo", tr("Solo: On/Off"))
00063 Q_CLASSINFO("toggle_mute", tr("Mute: On/Off"))
00064 Q_CLASSINFO("toggle_arm", tr("Arm: On/Off"))
00065 Q_CLASSINFO("set_editing_mode", tr("Mode: Edit"))
00066 Q_CLASSINFO("set_effects_mode", tr("Mode: Curve"))
00067 Q_CLASSINFO("prev_skip_pos", tr("To previous snap position"))
00068 Q_CLASSINFO("next_skip_pos", tr("To next snap position"))
00069
00070 public:
00071
00072 Sheet(Project* project);
00073 Sheet(Project* project, int numtracks);
00074 Sheet(Project* project, const QDomNode node);
00075 ~Sheet();
00076
00077 enum Mode {
00078 EDIT = 1,
00079 EFFECTS = 2
00080 };
00081
00082
00083 qreal get_hzoom() const {return m_hzoom;}
00084 int get_rate();
00085 int get_bitdepth();
00086 int get_numtracks() const {return m_tracks.size();}
00087 int get_track_index(qint64 id);
00088 int get_mode() const {return m_mode;}
00089 int is_transport_rolling() const {return m_transport;}
00090 void get_scrollbar_xy(int& x, int& y) {x = m_sbx; y = m_sby;}
00091
00092 const TimeRef& get_work_location() const {return m_workLocation;}
00093 nframes_t get_first_visible_frame() const;
00094 TimeRef get_last_location() const;
00095 const TimeRef& get_transport_location() const {return m_transportLocation;}
00096
00097 const TimeRef& get_new_transport_location() const {return m_newTransportLocation;}
00098
00099 QString get_title() const {return title;}
00100 QString get_artists() const {return artists;}
00101 QDomNode get_state(QDomDocument doc, bool istemplate=false);
00102 QList<Track*> get_tracks() const;
00103
00104 DiskIO* get_diskio() const;
00105 AudioClipManager* get_audioclip_manager() const;
00106 AudioBus* get_master_out() const {return m_masterOut;}
00107 AudioBus* get_render_bus() const {return m_renderBus;}
00108 AudioBus* get_clip_render_bus() const {return m_clipRenderBus;}
00109 SnapList* get_snap_list() const;
00110 PluginChain* get_plugin_chain() const;
00111 TimeLine* get_timeline() const {return m_timeline;}
00112 Snappable* get_work_snap() {return workSnap;}
00113 Track* get_track(qint64 id);
00114 Track* get_track_for_index(int index);
00115
00116
00117 void set_artists(const QString& pArtistis);
00118 void set_first_visible_frame(nframes_t pos);
00119 void set_title(const QString& sTitle);
00120 void set_work_at(const TimeRef& location);
00121 void set_hzoom(qreal hzoom);
00122 void set_snapping(bool snap);
00123 void set_scrollbar_xy(int x, int y) {m_sbx = x; m_sby = y;}
00124 int set_state( const QDomNode & node );
00125 void set_recording(bool recording, bool realtime);
00126
00127 void skip_to_start();
00128 void skip_to_end();
00129
00130
00131 int process(nframes_t nframes);
00132
00133 int transport_control(transport_state_t state);
00134 int process_export(nframes_t nframes);
00135 int prepare_export(ExportSpecification* spec);
00136 int render(ExportSpecification* spec);
00137
00138 void solo_track(Track* track);
00139 void create(int tracksToCreate);
00140 void move_clip(Track* from, Track* too, AudioClip* clip, TimeRef location);
00141 Command* add_track(Track* track, bool historable=true);
00142 Command* remove_track(Track* track, bool historable=true);
00143
00144 bool any_track_armed();
00145 bool realtime_path() const {return m_realtimepath;}
00146 bool is_changed() const {return changed;}
00147 bool is_snap_on() const {return m_isSnapOn;}
00148 bool is_recording() const {return m_recording;}
00149 bool is_smaller_then(APILinkedListNode* node) {Q_UNUSED(node); return false;}
00150
00151 void disconnect_from_audiodevice();
00152 void connect_to_audiodevice();
00153 void schedule_for_deletion();
00154 QString get_cdrdao_tracklist(ExportSpecification* spec, bool pregap = false);
00155
00156 audio_sample_t* mixdown;
00157 audio_sample_t* readbuffer;
00158 audio_sample_t* gainbuffer;
00159 DecodeBuffer* renderDecodeBuffer;
00160
00161 #if defined (THREAD_CHECK)
00162 unsigned long threadId;
00163 #endif
00164
00165 private:
00166 APILinkedList m_tracks;
00167 QList<AudioClip*> m_recordingClips;
00168 QTimer m_skipTimer;
00169 Project* m_project;
00170 WriteSource* m_exportSource;
00171 AudioBus* m_playBackBus;
00172 Client* m_audiodeviceClient;
00173 AudioBus* m_masterOut;
00174 AudioBus* m_renderBus;
00175 AudioBus* m_clipRenderBus;
00176 DiskIO* m_diskio;
00177 AudioClipManager* m_acmanager;
00178 TimeLine* m_timeline;
00179 QList<TimeRef> m_xposList;
00180
00181
00182
00183
00184
00185
00186 volatile size_t m_transportFrame;
00187 volatile size_t m_newTransportFramePos;
00188 volatile size_t m_transport;
00189 volatile size_t m_seeking;
00190 volatile size_t m_startSeek;
00191
00192 TimeRef m_transportLocation;
00193 TimeRef m_workLocation;
00194 TimeRef m_newTransportLocation;
00195
00196
00197 nframes_t firstVisibleFrame;
00198 QString artists;
00199 QString title;
00200 int m_mode;
00201 qreal m_hzoom;
00202 int m_sbx;
00203 int m_sby;
00204 uint m_currentSampleRate;
00205 bool m_rendering;
00206 bool changed;
00207 bool m_isSnapOn;
00208 bool m_resumeTransport;
00209 bool m_stopTransport;
00210 bool m_realtimepath;
00211 bool m_scheduledForDeletion;
00212 bool m_recording;
00213 bool m_prepareRecording;
00214 bool m_readyToRecord;
00215 SnapList* snaplist;
00216 Snappable* workSnap;
00217
00218 void init();
00219
00220 int finish_audio_export();
00221 void start_seek();
00222 void start_transport_rolling(bool realtime);
00223 void stop_transport_rolling();
00224 void update_skip_positions();
00225
00226 void resize_buffer(bool updateArmStatus, nframes_t size);
00227
00228 Track* create_track();
00229
00230 friend class AudioClipManager;
00231 friend class TimeLine;
00232
00233 public slots :
00234 void seek_finished();
00235 void audiodevice_client_removed(Client* );
00236 void audiodevice_started();
00237 void audiodevice_params_changed();
00238 void set_gain(float gain);
00239 void set_transport_pos(TimeRef location);
00240
00241 float get_gain() const;
00242
00243 void set_temp_follow_state(bool state);
00244
00245 Command* next_skip_pos();
00246 Command* prev_skip_pos();
00247 Command* start_transport();
00248 Command* set_recordable();
00249 Command* set_recordable_and_start_transport();
00250 Command* work_next_edge();
00251 Command* work_previous_edge();
00252 Command* toggle_snap();
00253 Command* toggle_solo();
00254 Command* toggle_mute();
00255 Command* toggle_arm();
00256 Command* set_editing_mode();
00257 Command* set_effects_mode();
00258
00259 signals:
00260 void trackRemoved(Track* );
00261 void trackAdded(Track* );
00262 void hzoomChanged();
00263 void transportStarted();
00264 void transportStopped();
00265 void workingPosChanged();
00266 void transportPosSet();
00267 void firstVisibleFrameChanged();
00268 void lastFramePositionChanged();
00269 void seekStart();
00270 void snapChanged();
00271 void tempFollowChanged(bool state);
00272 void propertyChanged();
00273 void setCursorAtEdge();
00274 void masterGainChanged();
00275 void modeChanged();
00276 void recordingStateChanged();
00277 void prepareRecording();
00278
00279 private slots:
00280 void private_add_track(Track* track);
00281 void private_remove_track(Track* track);
00282 void handle_diskio_writebuffer_overrun();
00283 void handle_diskio_readbuffer_underrun();
00284 void prepare_recording();
00285 void clip_finished_recording(AudioClip* clip);
00286 void config_changed();
00287 };
00288
00289 inline float Sheet::get_gain() const
00290 {
00291 return m_fader->get_gain();
00292 }
00293
00294
00295 #endif
00296
00297
00298
00299
00300