summaryrefslogtreecommitdiff
path: root/gtk2_ardour/sfdb_ui.h
blob: 6c32474a911972a98b2a3c27974eccfeeee83818 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
/*
    Copyright (C) 2005-2006 Paul Davis

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

*/

#ifndef __ardour_sfdb_ui_h__
#define __ardour_sfdb_ui_h__

#include <string>
#include <vector>
#include <map>

#include <sigc++/signal.h>

#include <gtkmm/stock.h>
#include <gtkmm/box.h>
#include <gtkmm/button.h>
#include <gtkmm/checkbutton.h>
#include <gtkmm/comboboxtext.h>
#include <gtkmm/dialog.h>
#include <gtkmm/entry.h>
#include <gtkmm/filechooserwidget.h>
#include <gtkmm/frame.h>
#include <gtkmm/label.h>
#include <gtkmm/scale.h>
#include <gtkmm/textview.h>
#include <gtkmm/table.h>
#include <gtkmm/liststore.h>
#include <gtkmm/spinbutton.h>
#include <gtkmm/notebook.h>


#include "ardour/audiofilesource.h"
#include "ardour/session_handle.h"

#include "ardour_window.h"
#include "editing.h"
#include "audio_clock.h"
#include "instrument_selector.h"

namespace ARDOUR {
	class Session;
};

class GainMeter;
class Mootcher;

class SoundFileBox : public Gtk::VBox, public ARDOUR::SessionHandlePtr, public PBD::ScopedConnectionList
{
  public:
	SoundFileBox (bool persistent);
	virtual ~SoundFileBox () {};

	void set_session (ARDOUR::Session* s);
	bool setup_labels (const std::string& filename);

	void audition();
	bool audition_oneshot();
	bool autoplay () const;
	void set_src_quality(ARDOUR::SrcQuality q) { _src_quality = q; }
	void set_import_position(Editing::ImportPosition p) { _import_position = p; }

  protected:
	std::string path;

	ARDOUR::SoundFileInfo sf_info;

	Gtk::Table table;

	Gtk::Label length;
	Gtk::Label format;
	Gtk::Label channels;
	Gtk::Label samplerate;
	Gtk::Label timecode;
	Gtk::Label tempomap;

	Gtk::Label channels_value;
	Gtk::Label samplerate_value;
	Gtk::Label tempomap_value;

	Gtk::Label format_text;
	AudioClock length_clock;
	AudioClock timecode_clock;

	Gtk::Frame border_frame;
	Gtk::Label preview_label;

	Gtk::TextView tags_entry;

	Gtk::VBox main_box;
	Gtk::VBox path_box;
	Gtk::HBox bottom_box;

	Gtk::Button play_btn;
	Gtk::Button stop_btn;
	Gtk::CheckButton autoplay_btn;
	Gtk::Button apply_btn;
	Gtk::HScale seek_slider;

	PBD::ScopedConnectionList auditioner_connections;
	void audition_active(bool);
	void audition_progress(ARDOUR::framecnt_t, ARDOUR::framecnt_t);

	bool tags_entry_left (GdkEventFocus* event);
	void tags_changed ();
	void save_tags (const std::vector<std::string>&);
	void stop_audition ();
	bool seek_button_press(GdkEventButton*);
	bool seek_button_release(GdkEventButton*);
	bool _seeking;
	ARDOUR::SrcQuality _src_quality;
	Editing::ImportPosition _import_position;
};

class SoundFileBrowser : public ArdourWindow
{
  private:
	class FoundTagColumns : public Gtk::TreeModel::ColumnRecord
	{
	  public:
		Gtk::TreeModelColumn<std::string> pathname;

		FoundTagColumns() { add(pathname); }
	};

	class FreesoundColumns : public Gtk::TreeModel::ColumnRecord
	{
	  public:
		Gtk::TreeModelColumn<std::string> id;
		Gtk::TreeModelColumn<std::string> uri;
		Gtk::TreeModelColumn<std::string> filename;
		Gtk::TreeModelColumn<std::string> duration;
		Gtk::TreeModelColumn<std::string> filesize;
		Gtk::TreeModelColumn<std::string> smplrate;
		Gtk::TreeModelColumn<std::string> license;
		Gtk::TreeModelColumn<bool>        started;

		FreesoundColumns() {
			add(id);
			add(filename);
			add(uri);
			add(duration);
			add(filesize);
			add(smplrate);
			add(license);
			add(started);
		}
	};

	FoundTagColumns found_list_columns;
	Glib::RefPtr<Gtk::ListStore> found_list;

	FreesoundColumns freesound_list_columns;
	Glib::RefPtr<Gtk::ListStore> freesound_list;

	Gtk::Button freesound_more_btn;
	Gtk::Button freesound_similar_btn;

	void handle_freesound_results(std::string theString);
  public:
	SoundFileBrowser (std::string title, ARDOUR::Session* _s, bool persistent);
	virtual ~SoundFileBrowser ();

	int run ();
	int status () const { return _status; }

	virtual void set_session (ARDOUR::Session*);
	std::vector<std::string> get_paths ();

	void clear_selection ();

	Gtk::FileChooserWidget chooser;

	SoundFileBox preview;

	Gtk::Entry found_entry;
	Gtk::Button found_search_btn;
	Gtk::TreeView found_list_view;

	Gtk::Entry freesound_entry;
	Gtk::ComboBoxText freesound_sort;

	Gtk::Button freesound_search_btn;
	Gtk::TreeView freesound_list_view;
	Gtk::Notebook notebook;

	void freesound_search();
	void refresh_display(std::string ID, std::string file);

  protected:
	bool resetting_ourselves;
	int matches;
	int _status;
	bool _done;

	Gtk::FileFilter audio_and_midi_filter;
	Gtk::FileFilter audio_filter;
	Gtk::FileFilter midi_filter;
	Gtk::FileFilter custom_filter;
	Gtk::FileFilter matchall_filter;
	Gtk::HBox hpacker;
	Gtk::VBox vpacker;

	Gtk::Button import_button;
	Gtk::Button close_button;

	static std::string persistent_folder;

	GainMeter* gm;
	Gtk::VBox meter_packer;
	void add_gain_meter ();
	void remove_gain_meter ();
	void meter ();
	void start_metering ();
	void stop_metering ();
	sigc::connection metering_connection;

	void update_preview ();

	void found_list_view_selected ();
	void found_list_view_activated (const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn*);
	void found_search_clicked ();

	void freesound_list_view_selected ();
	void freesound_list_view_activated (const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn*);
	void freesound_search_clicked ();
	void freesound_more_clicked ();
	void freesound_similar_clicked ();
	int freesound_page;

	void chooser_file_activated ();
	std::string freesound_get_audio_file(Gtk::TreeIter iter);

	bool on_audio_filter (const Gtk::FileFilter::Info& filter_info);
	bool on_midi_filter (const Gtk::FileFilter::Info& filter_info);
	bool on_audio_and_midi_filter (const Gtk::FileFilter::Info& filter_info);

	void set_action_sensitive (bool);

	virtual bool reset_options () { return true; }

  protected:
	void on_show();
	virtual void do_something(int action);
};

class SoundFileChooser : public SoundFileBrowser
{
  public:
	SoundFileChooser (std::string title, ARDOUR::Session* _s = 0);
	virtual ~SoundFileChooser () {};

	std::string get_filename ();

  protected:
	void on_hide();
};

class SoundFileOmega : public SoundFileBrowser
{

  public:
	SoundFileOmega (std::string title, ARDOUR::Session* _s,
			uint32_t selected_audio_tracks, uint32_t selected_midi_tracks,
			bool persistent,
			Editing::ImportMode mode_hint = Editing::ImportAsTrack);

	void reset (uint32_t selected_audio_tracks, uint32_t selected_midi_tracks);

	Gtk::ComboBoxText action_combo;
	Gtk::ComboBoxText where_combo;
	Gtk::ComboBoxText channel_combo;
	Gtk::ComboBoxText src_combo;
	Gtk::ComboBoxText midi_track_name_combo;
	InstrumentSelector instrument_combo;

	Gtk::CheckButton copy_files_btn;
	Gtk::CheckButton smf_tempo_btn;

	void set_mode (Editing::ImportMode);
	Editing::ImportMode get_mode() const;
	ARDOUR::MidiTrackNameSource get_midi_track_name_source () const;
	bool get_use_smf_tempo_map () const;
	Editing::ImportPosition get_position() const;
	Editing::ImportDisposition get_channel_disposition() const;
	ARDOUR::SrcQuality get_src_quality() const;

  protected:
	void on_hide();

  private:
	uint32_t selected_audio_track_cnt;
	uint32_t selected_midi_track_cnt;

	typedef std::map<std::string,Editing::ImportDisposition> DispositionMap;
	DispositionMap disposition_map;

	Gtk::Table options;
	Gtk::VBox block_two;
	Gtk::VBox block_three;
	Gtk::VBox block_four;

	bool check_info (const std::vector<std::string>& paths,
			 bool& same_size, bool& src_needed, bool& multichannel);

	static bool check_link_status (const ARDOUR::Session*, const std::vector<std::string>& paths);

	void file_selection_changed ();
	bool reset_options ();
	void reset_options_noret ();
	bool bad_file_message ();
	void src_combo_changed ();
	void where_combo_changed ();

	void do_something (int action);

	bool _import_active;
	bool _reset_post_import;
};

#endif // __ardour_sfdb_ui_h__