summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/MSVClibardour/ardour.vcproj2228
-rw-r--r--libs/ardour/amp.cc5
-rw-r--r--libs/ardour/ardour/amp.h3
-rw-r--r--libs/ardour/ardour/analyser.h4
-rw-r--r--libs/ardour/ardour/ardour.h40
-rw-r--r--libs/ardour/ardour/async_midi_port.h37
-rw-r--r--libs/ardour/ardour/audio_backend.h116
-rw-r--r--libs/ardour/ardour/audio_buffer.h2
-rw-r--r--libs/ardour/ardour/audio_diskstream.h3
-rw-r--r--libs/ardour/ardour/audio_library.h6
-rw-r--r--libs/ardour/ardour/audio_playlist_importer.h6
-rw-r--r--libs/ardour/ardour/audio_playlist_source.h2
-rw-r--r--libs/ardour/ardour/audio_port.h2
-rw-r--r--libs/ardour/ardour/audio_region_importer.h4
-rw-r--r--libs/ardour/ardour/audio_track.h4
-rw-r--r--libs/ardour/ardour/audio_track_importer.h4
-rw-r--r--libs/ardour/ardour/audio_unit.h8
-rw-r--r--libs/ardour/ardour/audioanalyser.h5
-rw-r--r--libs/ardour/ardour/audioengine.h22
-rw-r--r--libs/ardour/ardour/audiofile_tagger.h4
-rw-r--r--libs/ardour/ardour/audiofilesource.h5
-rw-r--r--libs/ardour/ardour/audioplaylist.h4
-rw-r--r--libs/ardour/ardour/audioregion.h33
-rw-r--r--libs/ardour/ardour/audiosource.h2
-rw-r--r--libs/ardour/ardour/auditioner.h5
-rw-r--r--libs/ardour/ardour/auto_bundle.h2
-rw-r--r--libs/ardour/ardour/automatable.h3
-rw-r--r--libs/ardour/ardour/automatable_sequence.h2
-rw-r--r--libs/ardour/ardour/automation_control.h4
-rw-r--r--libs/ardour/ardour/automation_list.h4
-rw-r--r--libs/ardour/ardour/automation_watch.h2
-rw-r--r--libs/ardour/ardour/backend_search_path.h39
-rw-r--r--libs/ardour/ardour/beats_frames_converter.h3
-rw-r--r--libs/ardour/ardour/broadcast_info.h3
-rw-r--r--libs/ardour/ardour/buffer.h3
-rw-r--r--libs/ardour/ardour/buffer_manager.h4
-rw-r--r--libs/ardour/ardour/buffer_set.h9
-rw-r--r--libs/ardour/ardour/bundle.h4
-rw-r--r--libs/ardour/ardour/butler.h42
-rw-r--r--libs/ardour/ardour/caimportable.h3
-rw-r--r--libs/ardour/ardour/capturing_processor.h2
-rw-r--r--libs/ardour/ardour/chan_count.h6
-rw-r--r--libs/ardour/ardour/chan_mapping.h2
-rw-r--r--libs/ardour/ardour/click.h5
-rw-r--r--libs/ardour/ardour/comparable_shared_ptr.h4
-rw-r--r--libs/ardour/ardour/configuration.h2
-rw-r--r--libs/ardour/ardour/configuration_variable.h13
-rw-r--r--libs/ardour/ardour/control_protocol_manager.h4
-rw-r--r--libs/ardour/ardour/control_protocol_search_path.h40
-rw-r--r--libs/ardour/ardour/coreaudiosource.h4
-rw-r--r--libs/ardour/ardour/cycle_timer.h7
-rw-r--r--libs/ardour/ardour/cycles.h3
-rw-r--r--libs/ardour/ardour/data_type.h4
-rw-r--r--libs/ardour/ardour/debug.h77
-rw-r--r--libs/ardour/ardour/delayline.h69
-rw-r--r--libs/ardour/ardour/delivery.h3
-rw-r--r--libs/ardour/ardour/directory_names.h36
-rw-r--r--libs/ardour/ardour/diskstream.h14
-rw-r--r--libs/ardour/ardour/element_import_handler.h5
-rw-r--r--libs/ardour/ardour/element_importer.h3
-rw-r--r--libs/ardour/ardour/event_type_map.h4
-rw-r--r--libs/ardour/ardour/export_channel.h10
-rw-r--r--libs/ardour/ardour/export_channel_configuration.h2
-rw-r--r--libs/ardour/ardour/export_failed.h4
-rw-r--r--libs/ardour/ardour/export_filename.h2
-rw-r--r--libs/ardour/ardour/export_format_base.h5
-rw-r--r--libs/ardour/ardour/export_format_compatibility.h2
-rw-r--r--libs/ardour/ardour/export_format_manager.h4
-rw-r--r--libs/ardour/ardour/export_format_specification.h9
-rw-r--r--libs/ardour/ardour/export_formats.h14
-rw-r--r--libs/ardour/ardour/export_graph_builder.h2
-rw-r--r--libs/ardour/ardour/export_handler.h20
-rw-r--r--libs/ardour/ardour/export_pointers.h1
-rw-r--r--libs/ardour/ardour/export_preset.h4
-rw-r--r--libs/ardour/ardour/export_profile_manager.h5
-rw-r--r--libs/ardour/ardour/export_status.h3
-rw-r--r--libs/ardour/ardour/export_timespan.h3
-rw-r--r--libs/ardour/ardour/file_source.h6
-rw-r--r--libs/ardour/ardour/filename_extensions.h20
-rw-r--r--libs/ardour/ardour/filesystem_paths.h24
-rw-r--r--libs/ardour/ardour/filter.h3
-rw-r--r--libs/ardour/ardour/graph.h3
-rw-r--r--libs/ardour/ardour/graphnode.h2
-rw-r--r--libs/ardour/ardour/iec1ppmdsp.h3
-rw-r--r--libs/ardour/ardour/iec2ppmdsp.h3
-rw-r--r--libs/ardour/ardour/import_status.h3
-rw-r--r--libs/ardour/ardour/importable_source.h3
-rw-r--r--libs/ardour/ardour/instrument_info.h15
-rw-r--r--libs/ardour/ardour/internal_return.h2
-rw-r--r--libs/ardour/ardour/internal_send.h6
-rw-r--r--libs/ardour/ardour/interpolation.h7
-rw-r--r--libs/ardour/ardour/interthread_info.h3
-rw-r--r--libs/ardour/ardour/io.h4
-rw-r--r--libs/ardour/ardour/io_processor.h2
-rw-r--r--libs/ardour/ardour/jack_utils.h253
-rw-r--r--libs/ardour/ardour/kmeterdsp.h4
-rw-r--r--libs/ardour/ardour/ladspa_plugin.h14
-rw-r--r--libs/ardour/ardour/latent.h3
-rw-r--r--libs/ardour/ardour/libardour_visibility.h45
-rw-r--r--libs/ardour/ardour/linux_vst_support.h39
-rw-r--r--libs/ardour/ardour/location.h15
-rw-r--r--libs/ardour/ardour/location_importer.h4
-rw-r--r--libs/ardour/ardour/logcurve.h6
-rw-r--r--libs/ardour/ardour/lv2_plugin.h6
-rw-r--r--libs/ardour/ardour/lxvst_plugin.h6
-rw-r--r--libs/ardour/ardour/meter.h5
-rw-r--r--libs/ardour/ardour/midi_automation_list_binder.h2
-rw-r--r--libs/ardour/ardour/midi_buffer.h35
-rw-r--r--libs/ardour/ardour/midi_diskstream.h4
-rw-r--r--libs/ardour/ardour/midi_model.h14
-rw-r--r--libs/ardour/ardour/midi_operator.h2
-rw-r--r--libs/ardour/ardour/midi_patch_manager.h2
-rw-r--r--libs/ardour/ardour/midi_patch_search_path.h39
-rw-r--r--libs/ardour/ardour/midi_playlist.h3
-rw-r--r--libs/ardour/ardour/midi_playlist_source.h2
-rw-r--r--libs/ardour/ardour/midi_port.h2
-rw-r--r--libs/ardour/ardour/midi_region.h9
-rw-r--r--libs/ardour/ardour/midi_ring_buffer.h3
-rw-r--r--libs/ardour/ardour/midi_scene_change.h63
-rw-r--r--libs/ardour/ardour/midi_scene_changer.h75
-rw-r--r--libs/ardour/ardour/midi_source.h3
-rw-r--r--libs/ardour/ardour/midi_state_tracker.h3
-rw-r--r--libs/ardour/ardour/midi_stretch.h2
-rw-r--r--libs/ardour/ardour/midi_track.h9
-rw-r--r--libs/ardour/ardour/midi_ui.h5
-rw-r--r--libs/ardour/ardour/mididm.h64
-rw-r--r--libs/ardour/ardour/midiport_manager.h15
-rw-r--r--libs/ardour/ardour/mix.h39
-rw-r--r--libs/ardour/ardour/monitor_processor.h5
-rw-r--r--libs/ardour/ardour/movable.h2
-rw-r--r--libs/ardour/ardour/msvc_libardour.h73
-rw-r--r--libs/ardour/ardour/mtdm.h4
-rw-r--r--libs/ardour/ardour/mute_master.h2
-rw-r--r--libs/ardour/ardour/onset_detector.h2
-rw-r--r--libs/ardour/ardour/operations.h28
-rw-r--r--libs/ardour/ardour/pan_controllable.h2
-rw-r--r--libs/ardour/ardour/pannable.h2
-rw-r--r--libs/ardour/ardour/panner.h17
-rw-r--r--libs/ardour/ardour/panner_manager.h18
-rw-r--r--libs/ardour/ardour/panner_search_path.h39
-rw-r--r--libs/ardour/ardour/panner_shell.h3
-rw-r--r--libs/ardour/ardour/peak.h1
-rw-r--r--libs/ardour/ardour/pi_controller.h82
-rw-r--r--libs/ardour/ardour/pitch.h4
-rw-r--r--libs/ardour/ardour/playlist.h8
-rw-r--r--libs/ardour/ardour/playlist_factory.h2
-rw-r--r--libs/ardour/ardour/playlist_source.h2
-rw-r--r--libs/ardour/ardour/plugin.h5
-rw-r--r--libs/ardour/ardour/plugin_insert.h5
-rw-r--r--libs/ardour/ardour/plugin_manager.h35
-rw-r--r--libs/ardour/ardour/plugin_types.h (renamed from libs/ardour/ardour/lv2_bundled_search_path.h)23
-rw-r--r--libs/ardour/ardour/port.h4
-rw-r--r--libs/ardour/ardour/port_engine.h3
-rw-r--r--libs/ardour/ardour/port_insert.h3
-rw-r--r--libs/ardour/ardour/port_manager.h2
-rw-r--r--libs/ardour/ardour/port_set.h2
-rw-r--r--libs/ardour/ardour/process_thread.h3
-rw-r--r--libs/ardour/ardour/processor.h3
-rw-r--r--libs/ardour/ardour/profile.h12
-rw-r--r--libs/ardour/ardour/progress.h4
-rw-r--r--libs/ardour/ardour/proxy_controllable.h2
-rw-r--r--libs/ardour/ardour/public_diskstream.h2
-rw-r--r--libs/ardour/ardour/quantize.h3
-rw-r--r--libs/ardour/ardour/rb_effect.h2
-rw-r--r--libs/ardour/ardour/rc_configuration.h7
-rw-r--r--libs/ardour/ardour/rc_configuration_vars.h26
-rw-r--r--libs/ardour/ardour/readable.h3
-rw-r--r--libs/ardour/ardour/recent_sessions.h10
-rw-r--r--libs/ardour/ardour/region.h57
-rw-r--r--libs/ardour/ardour/region_factory.h3
-rw-r--r--libs/ardour/ardour/region_sorters.h17
-rw-r--r--libs/ardour/ardour/resampled_source.h3
-rw-r--r--libs/ardour/ardour/return.h2
-rw-r--r--libs/ardour/ardour/reverse.h2
-rw-r--r--libs/ardour/ardour/revision.h9
-rw-r--r--libs/ardour/ardour/route.h32
-rw-r--r--libs/ardour/ardour/route_graph.h2
-rw-r--r--libs/ardour/ardour/route_group.h25
-rw-r--r--libs/ardour/ardour/route_group_member.h2
-rw-r--r--libs/ardour/ardour/route_sorters.h (renamed from libs/ardour/backend_search_path.cc)45
-rw-r--r--libs/ardour/ardour/runtime_functions.h11
-rw-r--r--libs/ardour/ardour/scene_change.h (renamed from libs/ardour/ardour/export_formats_search_path.h)33
-rw-r--r--libs/ardour/ardour/scene_changer.h (renamed from libs/ardour/control_protocol_search_path.cc)50
-rw-r--r--libs/ardour/ardour/search_paths.h112
-rw-r--r--libs/ardour/ardour/send.h13
-rw-r--r--libs/ardour/ardour/session.h110
-rw-r--r--libs/ardour/ardour/session_configuration.h5
-rw-r--r--libs/ardour/ardour/session_configuration_vars.h4
-rw-r--r--libs/ardour/ardour/session_directory.h4
-rw-r--r--libs/ardour/ardour/session_event.h5
-rw-r--r--libs/ardour/ardour/session_handle.h6
-rw-r--r--libs/ardour/ardour/session_metadata.h4
-rw-r--r--libs/ardour/ardour/session_object.h4
-rw-r--r--libs/ardour/ardour/session_playlists.h2
-rw-r--r--libs/ardour/ardour/session_state_utils.h10
-rw-r--r--libs/ardour/ardour/session_utils.h4
-rw-r--r--libs/ardour/ardour/silentfilesource.h5
-rw-r--r--libs/ardour/ardour/slave.h20
-rw-r--r--libs/ardour/ardour/smf_source.h2
-rw-r--r--libs/ardour/ardour/sndfileimportable.h3
-rw-r--r--libs/ardour/ardour/sndfilesource.h3
-rw-r--r--libs/ardour/ardour/soundcloud_upload.h55
-rw-r--r--libs/ardour/ardour/soundseq.h6
-rw-r--r--libs/ardour/ardour/source.h2
-rw-r--r--libs/ardour/ardour/source_factory.h2
-rw-r--r--libs/ardour/ardour/speaker.h4
-rw-r--r--libs/ardour/ardour/speakers.h2
-rw-r--r--libs/ardour/ardour/spline.h4
-rw-r--r--libs/ardour/ardour/srcfilesource.h9
-rw-r--r--libs/ardour/ardour/stretch.h4
-rw-r--r--libs/ardour/ardour/strip_silence.h2
-rw-r--r--libs/ardour/ardour/system_exec.h (renamed from libs/ardour/midi_patch_search_path.cc)47
-rw-r--r--libs/ardour/ardour/tape_file_matcher.h4
-rw-r--r--libs/ardour/ardour/template_utils.h18
-rw-r--r--libs/ardour/ardour/tempo.h14
-rw-r--r--libs/ardour/ardour/tempo_map_importer.h4
-rw-r--r--libs/ardour/ardour/thread_buffers.h5
-rw-r--r--libs/ardour/ardour/ticker.h3
-rw-r--r--libs/ardour/ardour/track.h8
-rw-r--r--libs/ardour/ardour/transient_detector.h2
-rw-r--r--libs/ardour/ardour/trimmable.h2
-rw-r--r--libs/ardour/ardour/types.h26
-rw-r--r--libs/ardour/ardour/unknown_processor.h2
-rw-r--r--libs/ardour/ardour/uri_map.h4
-rw-r--r--libs/ardour/ardour/user_bundle.h2
-rw-r--r--libs/ardour/ardour/utils.h58
-rw-r--r--libs/ardour/ardour/vestige/aeffectx.h78
-rw-r--r--libs/ardour/ardour/visibility.h44
-rw-r--r--libs/ardour/ardour/vst_info_file.h55
-rw-r--r--libs/ardour/ardour/vst_plugin.h5
-rw-r--r--libs/ardour/ardour/vst_types.h30
-rw-r--r--libs/ardour/ardour/vumeterdsp.h3
-rw-r--r--libs/ardour/ardour/windows_vst_plugin.h8
-rw-r--r--libs/ardour/ardour/worker.h6
-rw-r--r--libs/ardour/async_midi_port.cc49
-rw-r--r--libs/ardour/audio_diskstream.cc32
-rw-r--r--libs/ardour/audio_library.cc23
-rw-r--r--libs/ardour/audio_track.cc62
-rw-r--r--libs/ardour/audio_unit.cc20
-rw-r--r--libs/ardour/audioengine.cc185
-rw-r--r--libs/ardour/audiofilesource.cc7
-rw-r--r--libs/ardour/audioregion.cc131
-rw-r--r--libs/ardour/audiosource.cc253
-rw-r--r--libs/ardour/auditioner.cc11
-rw-r--r--libs/ardour/automation_list.cc6
-rw-r--r--libs/ardour/automation_watch.cc4
-rw-r--r--libs/ardour/broadcast_info.cc9
-rw-r--r--libs/ardour/buffer_manager.cc4
-rw-r--r--libs/ardour/butler.cc165
-rw-r--r--libs/ardour/control_protocol_manager.cc67
-rw-r--r--libs/ardour/cycle_timer.cc2
-rw-r--r--libs/ardour/debug.cc4
-rw-r--r--libs/ardour/default_click.cc4
-rw-r--r--libs/ardour/delayline.cc351
-rw-r--r--libs/ardour/delivery.cc3
-rw-r--r--libs/ardour/directory_names.cc10
-rw-r--r--libs/ardour/diskstream.cc87
-rw-r--r--libs/ardour/element_import_handler.cc1
-rw-r--r--libs/ardour/enums.cc52
-rw-r--r--libs/ardour/export_channel.cc7
-rw-r--r--libs/ardour/export_filename.cc5
-rw-r--r--libs/ardour/export_format_base.cc2
-rw-r--r--libs/ardour/export_format_manager.cc8
-rw-r--r--libs/ardour/export_format_specification.cc14
-rw-r--r--libs/ardour/export_formats_search_path.cc51
-rw-r--r--libs/ardour/export_graph_builder.cc8
-rw-r--r--libs/ardour/export_handler.cc75
-rw-r--r--libs/ardour/export_profile_manager.cc24
-rw-r--r--libs/ardour/file_source.cc33
-rw-r--r--libs/ardour/filesystem_paths.cc112
-rw-r--r--libs/ardour/find_session.cc10
-rw-r--r--libs/ardour/globals.cc46
-rw-r--r--libs/ardour/graph.cc15
-rw-r--r--libs/ardour/import.cc36
-rw-r--r--libs/ardour/internal_return.cc3
-rw-r--r--libs/ardour/internal_send.cc21
-rw-r--r--libs/ardour/io.cc26
-rw-r--r--libs/ardour/ladspa_plugin.cc72
-rw-r--r--libs/ardour/linux_vst_info_file.cc427
-rw-r--r--libs/ardour/linux_vst_support.cc25
-rw-r--r--libs/ardour/location.cc79
-rw-r--r--libs/ardour/ltc_slave.cc12
-rw-r--r--libs/ardour/lv2_evbuf.c2
-rw-r--r--libs/ardour/lv2_plugin.cc57
-rw-r--r--libs/ardour/lxvst_plugin.cc9
-rw-r--r--libs/ardour/meter.cc9
-rw-r--r--libs/ardour/midi_buffer.cc51
-rw-r--r--libs/ardour/midi_clock_slave.cc7
-rw-r--r--libs/ardour/midi_diskstream.cc64
-rw-r--r--libs/ardour/midi_model.cc5
-rw-r--r--libs/ardour/midi_patch_manager.cc11
-rw-r--r--libs/ardour/midi_scene_change.cc142
-rw-r--r--libs/ardour/midi_scene_changer.cc329
-rw-r--r--libs/ardour/midi_source.cc1
-rw-r--r--libs/ardour/midi_track.cc13
-rw-r--r--libs/ardour/midi_ui.cc10
-rw-r--r--libs/ardour/mididm.cc140
-rw-r--r--libs/ardour/midiport_manager.cc22
-rw-r--r--libs/ardour/mix.cc16
-rw-r--r--libs/ardour/msvc/msvc_libardour.cc276
-rw-r--r--libs/ardour/mtc_slave.cc13
-rw-r--r--libs/ardour/panner_manager.cc63
-rw-r--r--libs/ardour/panner_search_path.cc44
-rw-r--r--libs/ardour/panner_shell.cc14
-rw-r--r--libs/ardour/pcm_utils.cc4
-rw-r--r--libs/ardour/pi_controller.cc231
-rw-r--r--libs/ardour/playlist.cc18
-rw-r--r--libs/ardour/plugin.cc4
-rw-r--r--libs/ardour/plugin_insert.cc29
-rw-r--r--libs/ardour/plugin_manager.cc587
-rw-r--r--libs/ardour/po/cs.po855
-rw-r--r--libs/ardour/po/de.po872
-rw-r--r--libs/ardour/po/el.po829
-rw-r--r--libs/ardour/po/es.po827
-rw-r--r--libs/ardour/po/it.po820
-rw-r--r--libs/ardour/po/nn.po846
-rw-r--r--libs/ardour/po/pl.po808
-rw-r--r--libs/ardour/po/ru.po784
-rw-r--r--libs/ardour/po/sv.po808
-rw-r--r--libs/ardour/po/zh.po817
-rw-r--r--libs/ardour/port.cc4
-rw-r--r--libs/ardour/port_insert.cc2
-rw-r--r--libs/ardour/port_set.cc8
-rw-r--r--libs/ardour/rc_configuration.cc6
-rw-r--r--libs/ardour/region.cc18
-rw-r--r--libs/ardour/region_factory.cc8
-rw-r--r--libs/ardour/resampled_source.cc4
-rw-r--r--libs/ardour/route.cc185
-rw-r--r--libs/ardour/route_group_member.cc1
-rw-r--r--libs/ardour/scene_change.cc (renamed from libs/ardour/lv2_bundled_search_path.cc)28
-rw-r--r--libs/ardour/search_paths.cc276
-rw-r--r--libs/ardour/send.cc47
-rw-r--r--libs/ardour/session.cc222
-rw-r--r--libs/ardour/session_butler.cc10
-rw-r--r--libs/ardour/session_configuration.cc70
-rw-r--r--libs/ardour/session_events.cc7
-rw-r--r--libs/ardour/session_ltc.cc1
-rw-r--r--libs/ardour/session_midi.cc35
-rw-r--r--libs/ardour/session_playlists.cc8
-rw-r--r--libs/ardour/session_process.cc6
-rw-r--r--libs/ardour/session_state.cc312
-rw-r--r--libs/ardour/session_state_utils.cc6
-rw-r--r--libs/ardour/session_transport.cc108
-rw-r--r--libs/ardour/session_vst.cc114
-rw-r--r--libs/ardour/smf_source.cc6
-rw-r--r--libs/ardour/sndfile_helpers.cc2
-rw-r--r--libs/ardour/sndfileimportable.cc2
-rw-r--r--libs/ardour/sndfilesource.cc58
-rw-r--r--libs/ardour/soundcloud_upload.cc355
-rw-r--r--libs/ardour/source.cc2
-rw-r--r--libs/ardour/sse_functions_xmm.cc5
-rw-r--r--libs/ardour/system_exec.cc77
-rw-r--r--libs/ardour/template_utils.cc60
-rw-r--r--libs/ardour/test/audio_engine_test.cc53
-rw-r--r--libs/ardour/test/audio_engine_test.h14
-rw-r--r--libs/ardour/test/jack_utils_test.cc290
-rw-r--r--libs/ardour/test/jack_utils_test.h31
-rw-r--r--libs/ardour/test/midi_clock_slave_test.cc2
-rw-r--r--libs/ardour/test/plugins_test.cc54
-rw-r--r--libs/ardour/test/plugins_test.h12
-rw-r--r--libs/ardour/test/resampled_source_test.cc4
-rw-r--r--libs/ardour/test/test_common.cc4
-rw-r--r--libs/ardour/test/test_common.h2
-rw-r--r--libs/ardour/thread_buffers.cc13
-rw-r--r--libs/ardour/track.cc49
-rw-r--r--libs/ardour/utils.cc79
-rw-r--r--libs/ardour/vst_info_file.cc1058
-rw-r--r--libs/ardour/vst_plugin.cc100
-rw-r--r--libs/ardour/windows_vst_plugin.cc8
-rw-r--r--libs/ardour/worker.cc17
-rw-r--r--libs/ardour/wscript118
371 files changed, 15218 insertions, 7397 deletions
diff --git a/libs/ardour/MSVClibardour/ardour.vcproj b/libs/ardour/MSVClibardour/ardour.vcproj
new file mode 100644
index 0000000000..9bc6600a7a
--- /dev/null
+++ b/libs/ardour/MSVClibardour/ardour.vcproj
@@ -0,0 +1,2228 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="ardour"
+ ProjectGUID="{0EFCF4A5-C3F8-46DA-B826-2D80E5A9A210}"
+ RootNamespace="ardour"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug 32|Win32"
+ OutputDirectory="$(ProjectDir)\$(ConfigurationName)\bin"
+ IntermediateDirectory="$(ProjectDir)\$(ConfigurationName)\obj\$(ProjectName)"
+ ConfigurationType="2"
+ InheritedPropertySheets="..\..\..\MSVCMixbus3\MSVCMixbus3.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
+ Optimization="0"
+ AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;&quot;$(GenericIncludeFolder)\ardourext&quot;;..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;&quot;..\..\midi++2&quot;;..\..\audiographer;&quot;$(GenericIncludeFolder)\taglib&quot;;&quot;$(GenericIncludeFolder)\taglib\toolkit&quot;;&quot;$(GenericLibraryFolder)\glib-2.0\include&quot;;&quot;$(GenericIncludeFolder)\glibmm&quot;;&quot;$(GenericIncludeFolder)\libsndfile&quot;;&quot;$(GenericIncludeFolder)\gtk-2.0&quot;;&quot;$(GenericIncludeFolder)\cairo&quot;;&quot;$(GenericIncludeFolder)\pango-1.0&quot;;&quot;$(GenericIncludeFolder)\gtk-2.0\gdk&quot;;&quot;$(GenericIncludeFolder)\atk-2.0&quot;;&quot;$(GenericIncludeFolder)\lrdf&quot;;&quot;$(GenericIncludeFolder)\raptor&quot;;&quot;$(GenericIncludeFolder)\lilv-0&quot;;&quot;$(GenericIncludeFolder)\suil-0&quot;;&quot;$(GenericIncludeFolder)\serd-0&quot;;&quot;$(GenericIncludeFolder)\sord-0&quot;;&quot;$(GenericIncludeFolder)\lv2&quot;;&quot;$(GenericIncludeFolder)\sratom-0&quot;"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;DEBUGGABLE_BACKENDS;BUILDING_LIBARDOUR;LIBARDOUR_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG=&quot;Debug&quot;;ARCH_X86;USE_XMMINTRIN;ENABLE_NLS;PACKAGE=&quot;\&quot;ardour3\&quot;&quot;;PROGRAM_NAME=&quot;\&quot;Mixbus\&quot;&quot;;_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\&quot;Mod4&gt;&lt;Super\&quot;;IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_NEW_LILV=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\&quot;1.2\&quot;;CURRENT_SESSION_FILE_VERSION=3001"
+ MinimalRebuild="true"
+ RuntimeLibrary="3"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ CompileAs="2"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib libeay32.lib iconvD.lib zlib1D.lib boost-regex32D.lib $(DllPrefix)atkmm32-2.0-0D.lib $(DllPrefix)gtkmm32-2.0-0D.lib $(DllPrefix)gdkmm32-2.0-0D.lib $(DllPrefix)glibmm32-2.4-0D.lib $(DllPrefix)giomm32-2.4-0D.lib $(DllPrefix)cairomm32-2.0-0D.lib $(DllPrefix)pangomm32-2.0-0D.lib pthreadVCE2.lib $(DllPrefix)pango32-1.0-0D.lib $(DllPrefix)pangoft232-1.0-0D.lib $(DllPrefix)pangowin32-1.0-0D.lib $(DllPrefix)pangocairo32-1.0-0D.lib $(DllPrefix)cairo32-2D.lib $(DllPrefix)atk32-2.0-0D.lib $(DllPrefix)gthread32-2.0-0D.lib $(DllPrefix)gobject32-2.0-0D.lib $(DllPrefix)gmodule32-2.0-0D.lib $(DllPrefix)glib32-2.0-0D.lib $(DllPrefix)gio32-2.0-0D.lib $(DllPrefix)gtk32-2.0-0D.lib $(DllPrefix)gdk32-2.0-0D.lib $(DllPrefix)gdk-pixbuf32-2.0-0D.lib $(DllPrefix)sigc++32-2.0D.lib $(DllPrefix)curlD.lib $(DllPrefix)fontconfigD.lib $(DllPrefix)timecode32D.lib $(DllPrefix)taglib32D.lib freetype32-2D.lib raptor2D.lib lrdfD.lib libloD.lib rubberbandD.lib $(DllPrefix)ltcD.lib $(DllPrefix)audiographer32D.lib $(DllPrefix)pbd32D.lib $(DllPrefix)midi++32D.lib $(DllPrefix)evoral32D.lib $(DllPrefix)sndfile-1D.lib $(DllPrefix)samplerate-0D.lib vampsdkD.lib vamphostsdkD.lib lilv-0D.lib suil-0D.lib serd-0D.lib sord-0D.lib sratom-0D.lib libart_lgpl_2D.lib libjackD.lib libxml2D.lib intlD.lib shell32.lib psapi.lib ws2_32.lib winmm.lib"
+ OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32D.dll"
+ AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
+ IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;msvcrt.lib;dsound.lib"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ UseFAT32Workaround="true"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /Y &quot;$(OutDir)\$(TargetName).dll&quot; &quot;$(Debug32TargetFolder)\$(TargetName).dll&quot;&#x0D;&#x0A;copy /Y &quot;$(OutDir)\$(TargetName).dll&quot; &quot;$(Debug32TestSuiteFolder)\$(TargetName).dll&quot;&#x0D;&#x0A;copy /Y &quot;$(OutDir)\$(TargetName).lib&quot; &quot;$(GenericWin32LibraryFolder)\$(TargetName).lib&quot;&#x0D;&#x0A;"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release 32|Win32"
+ OutputDirectory="$(ProjectDir)\$(ConfigurationName)\bin"
+ IntermediateDirectory="$(ProjectDir)\$(ConfigurationName)\obj\$(ProjectName)"
+ ConfigurationType="2"
+ InheritedPropertySheets="..\..\..\MSVCMixbus3\MSVCMixbus3.vsprops"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;&quot;$(GenericIncludeFolder)\ardourext&quot;;..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;&quot;..\..\midi++2&quot;;..\..\audiographer;&quot;$(GenericIncludeFolder)\taglib&quot;;&quot;$(GenericIncludeFolder)\taglib\toolkit&quot;;&quot;$(GenericLibraryFolder)\glib-2.0\include&quot;;&quot;$(GenericIncludeFolder)\glibmm&quot;;&quot;$(GenericIncludeFolder)\libsndfile&quot;;&quot;$(GenericIncludeFolder)\gtk-2.0&quot;;&quot;$(GenericIncludeFolder)\cairo&quot;;&quot;$(GenericIncludeFolder)\pango-1.0&quot;;&quot;$(GenericIncludeFolder)\gtk-2.0\gdk&quot;;&quot;$(GenericIncludeFolder)\atk-2.0&quot;;&quot;$(GenericIncludeFolder)\lrdf&quot;;&quot;$(GenericIncludeFolder)\raptor&quot;;&quot;$(GenericIncludeFolder)\lilv-0&quot;;&quot;$(GenericIncludeFolder)\suil-0&quot;;&quot;$(GenericIncludeFolder)\serd-0&quot;;&quot;$(GenericIncludeFolder)\sord-0&quot;;&quot;$(GenericIncludeFolder)\lv2&quot;;&quot;$(GenericIncludeFolder)\sratom-0&quot;"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;_SECURE_SCL=0;BUILDING_LIBARDOUR;LIBARDOUR_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;ENABLE_NLS;PACKAGE=&quot;\&quot;ardour3\&quot;&quot;;PROGRAM_NAME=&quot;\&quot;Mixbus\&quot;&quot;;_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\&quot;Mod4&gt;&lt;Super\&quot;;IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_NEW_LILV=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\&quot;1.2\&quot;;CURRENT_SESSION_FILE_VERSION=3001"
+ StringPooling="false"
+ RuntimeLibrary="2"
+ EnableEnhancedInstructionSet="1"
+ WarningLevel="3"
+ CompileAs="2"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib libeay32.lib iconv.lib zlib1.lib boost-regex32.lib $(DllPrefix)atkmm32-2.0-0.lib $(DllPrefix)gtkmm32-2.0-0.lib $(DllPrefix)gdkmm32-2.0-0.lib $(DllPrefix)glibmm32-2.4-0.lib $(DllPrefix)giomm32-2.4-0.lib $(DllPrefix)cairomm32-2.0-0.lib $(DllPrefix)pangomm32-2.0-0.lib pthreadVCE2.lib $(DllPrefix)pango32-1.0-0.lib $(DllPrefix)pangoft232-1.0-0.lib $(DllPrefix)pangowin32-1.0-0.lib $(DllPrefix)pangocairo32-1.0-0.lib $(DllPrefix)cairo32-2.lib $(DllPrefix)atk32-2.0-0.lib $(DllPrefix)gthread32-2.0-0.lib $(DllPrefix)gobject32-2.0-0.lib $(DllPrefix)gmodule32-2.0-0.lib $(DllPrefix)glib32-2.0-0.lib $(DllPrefix)gio32-2.0-0.lib $(DllPrefix)gtk32-2.0-0.lib $(DllPrefix)gdk32-2.0-0.lib $(DllPrefix)gdk-pixbuf32-2.0-0.lib $(DllPrefix)sigc++32-2.0.lib $(DllPrefix)curl.lib $(DllPrefix)fontconfig.lib $(DllPrefix)timecode32.lib $(DllPrefix)taglib32.lib freetype32-2.lib raptor2.lib lrdf.lib liblo.lib rubberband.lib $(DllPrefix)ltc.lib $(DllPrefix)audiographer32.lib $(DllPrefix)pbd32.lib $(DllPrefix)midi++32.lib $(DllPrefix)evoral32.lib $(DllPrefix)sndfile-1.lib $(DllPrefix)samplerate-0.lib vampsdk.lib vamphostsdk.lib lilv-0.lib suil-0.lib serd-0.lib sord-0.lib sratom-0.lib libart_lgpl_2.lib libjack.lib libxml2.lib intl.lib shell32.lib psapi.lib ws2_32.lib winmm.lib"
+ OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32.dll"
+ AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
+ IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;dsound.lib"
+ SubSystem="2"
+ OptimizeReferences="2"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ UseFAT32Workaround="true"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /Y &quot;$(OutDir)\$(TargetName).dll&quot; &quot;$(Release32TargetFolder)\$(TargetName).dll&quot;&#x0D;&#x0A;copy /Y &quot;$(OutDir)\$(TargetName).dll&quot; &quot;$(Release32TestSuiteFolder)\$(TargetName).dll&quot;&#x0D;&#x0A;copy /Y &quot;$(OutDir)\$(TargetName).lib&quot; &quot;$(GenericWin32LibraryFolder)\$(TargetName).lib&quot;&#x0D;&#x0A;"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release 32 with Debugging Capability|Win32"
+ OutputDirectory="$(ProjectDir)\$(ConfigurationName)\bin"
+ IntermediateDirectory="$(ProjectDir)\$(ConfigurationName)\obj\$(ProjectName)"
+ ConfigurationType="2"
+ InheritedPropertySheets="..\..\..\MSVCMixbus3\MSVCMixbus3.vsprops"
+ CharacterSet="2"
+ WholeProgramOptimization="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
+ Optimization="0"
+ AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;&quot;$(GenericIncludeFolder)\ardourext&quot;;..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;&quot;..\..\midi++2&quot;;..\..\audiographer;&quot;$(GenericIncludeFolder)\taglib&quot;;&quot;$(GenericIncludeFolder)\taglib\toolkit&quot;;&quot;$(GenericLibraryFolder)\glib-2.0\include&quot;;&quot;$(GenericIncludeFolder)\glibmm&quot;;&quot;$(GenericIncludeFolder)\libsndfile&quot;;&quot;$(GenericIncludeFolder)\gtk-2.0&quot;;&quot;$(GenericIncludeFolder)\cairo&quot;;&quot;$(GenericIncludeFolder)\pango-1.0&quot;;&quot;$(GenericIncludeFolder)\gtk-2.0\gdk&quot;;&quot;$(GenericIncludeFolder)\atk-2.0&quot;;&quot;$(GenericIncludeFolder)\lrdf&quot;;&quot;$(GenericIncludeFolder)\raptor&quot;;&quot;$(GenericIncludeFolder)\lilv-0&quot;;&quot;$(GenericIncludeFolder)\suil-0&quot;;&quot;$(GenericIncludeFolder)\serd-0&quot;;&quot;$(GenericIncludeFolder)\sord-0&quot;;&quot;$(GenericIncludeFolder)\lv2&quot;;&quot;$(GenericIncludeFolder)\sratom-0&quot;"
+ PreprocessorDefinitions="PLATFORM_WINDOWS;DEBUGGABLE_BACKENDS;COMPILER_MSVC;_SECURE_SCL=0;BUILDING_LIBARDOUR;LIBARDOUR_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;ENABLE_NLS;PACKAGE=&quot;\&quot;ardour3\&quot;&quot;;PROGRAM_NAME=&quot;\&quot;Mixbus\&quot;&quot;;_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\&quot;Mod4&gt;&lt;Super\&quot;;IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_NEW_LILV=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\&quot;1.2\&quot;;CURRENT_SESSION_FILE_VERSION=3001"
+ StringPooling="false"
+ RuntimeLibrary="2"
+ EnableEnhancedInstructionSet="1"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ CompileAs="2"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib libeay32.lib iconvRDC.lib zlib1RDC.lib boost-regex32RDC.lib $(DllPrefix)atkmm32-2.0-0RDC.lib $(DllPrefix)gtkmm32-2.0-0RDC.lib $(DllPrefix)gdkmm32-2.0-0RDC.lib $(DllPrefix)glibmm32-2.4-0RDC.lib $(DllPrefix)giomm32-2.4-0RDC.lib $(DllPrefix)cairomm32-2.0-0RDC.lib $(DllPrefix)pangomm32-2.0-0RDC.lib pthreadVCE2.lib $(DllPrefix)pango32-1.0-0RDC.lib $(DllPrefix)pangoft232-1.0-0RDC.lib $(DllPrefix)pangowin32-1.0-0RDC.lib $(DllPrefix)pangocairo32-1.0-0RDC.lib $(DllPrefix)cairo32-2RDC.lib $(DllPrefix)atk32-2.0-0RDC.lib $(DllPrefix)gthread32-2.0-0RDC.lib $(DllPrefix)gobject32-2.0-0RDC.lib $(DllPrefix)gmodule32-2.0-0RDC.lib $(DllPrefix)glib32-2.0-0RDC.lib $(DllPrefix)gio32-2.0-0RDC.lib $(DllPrefix)gtk32-2.0-0RDC.lib $(DllPrefix)gdk32-2.0-0RDC.lib $(DllPrefix)gdk-pixbuf32-2.0-0RDC.lib $(DllPrefix)sigc++32-2.0RDC.lib $(DllPrefix)curlRDC.lib $(DllPrefix)fontconfigRDC.lib $(DllPrefix)timecode32RDC.lib $(DllPrefix)taglib32RDC.lib freetype32-2RDC.lib raptor2.lib lrdf.lib libloRDC.lib rubberbandRDC.lib $(DllPrefix)ltcRDC.lib $(DllPrefix)audiographer32RDC.lib $(DllPrefix)pbd32RDC.lib $(DllPrefix)midi++32RDC.lib $(DllPrefix)evoral32RDC.lib $(DllPrefix)sndfile-1.lib $(DllPrefix)samplerate-0.lib vampsdkRDC.lib vamphostsdkRDC.lib lilv-0RDC.lib suil-0RDC.lib serd-0RDC.lib sord-0RDC.lib sratom-0RDC.lib libart_lgpl_2.lib libjack.lib libxml2.lib intlRDC.lib shell32.lib psapi.lib ws2_32.lib winmm.lib"
+ OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32RDC.dll"
+ AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
+ IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;dsound.lib"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ UseFAT32Workaround="true"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /Y &quot;$(OutDir)\$(TargetName).dll&quot; &quot;$(Release32TestSuiteFolder)\$(TargetName).dll&quot;&#x0D;&#x0A;copy /Y &quot;$(OutDir)\$(TargetName).lib&quot; &quot;$(GenericWin32LibraryFolder)\$(TargetName).lib&quot;&#x0D;&#x0A;"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\amp.cc"
+ >
+ <FileConfiguration
+ Name="Release 32 with Debugging Capability|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\analyser.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\async_midi_port.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\audio_buffer.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\audio_diskstream.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\audio_library.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\audio_playlist.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\audio_playlist_importer.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\audio_playlist_source.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\audio_port.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\audio_region_importer.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\audio_track.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\audio_track_importer.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\audioanalyser.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\audioengine.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\audiofile_tagger.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\audiofilesource.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\audioregion.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\audiosource.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\auditioner.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\automatable.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\automation.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\automation_control.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\automation_list.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\automation_watch.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\beats_frames_converter.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\broadcast_info.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\buffer.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\buffer_manager.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\buffer_set.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\bundle.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\butler.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\capturing_processor.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\chan_count.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\chan_mapping.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\config_text.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\configuration.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\control_protocol_manager.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\cycle_timer.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\data_type.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\debug.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\default_click.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\delayline.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\delivery.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\directory_names.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\diskstream.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\element_import_handler.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\element_importer.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\engine_slave.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\enums.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\event_type_map.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\export_channel.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\export_channel_configuration.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\export_failed.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\export_filename.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\export_format_base.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\export_format_manager.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\export_format_specification.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\export_formats.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\export_graph_builder.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\export_handler.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\export_preset.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\export_profile_manager.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\export_status.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\export_timespan.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\file_source.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\filename_extensions.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\filesystem_paths.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\filter.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\find_session.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\globals.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\graph.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\graphnode.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\iec1ppmdsp.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\iec2ppmdsp.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\import.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\instrument_info.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\internal_return.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\internal_send.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\interpolation.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\io.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\io_processor.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\kmeterdsp.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\ladspa_plugin.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\location.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\location_importer.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\ltc_slave.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\lv2_evbuf.c"
+ >
+ </File>
+ <File
+ RelativePath="..\lv2_plugin.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\meter.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\midi_automation_list_binder.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\midi_buffer.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\midi_clock_slave.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\midi_diskstream.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\midi_model.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\midi_patch_manager.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\midi_playlist.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\midi_playlist_source.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\midi_port.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\midi_region.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\midi_ring_buffer.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\midi_scene_change.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\midi_scene_changer.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\midi_source.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\midi_state_tracker.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\midi_stretch.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\midi_track.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\midi_ui.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\mididm.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\midiport_manager.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\mix.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\monitor_processor.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\mtc_slave.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\mtdm.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\mute_master.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\onset_detector.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\operations.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\pan_controllable.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\pannable.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\panner.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\panner_manager.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\panner_shell.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\pcm_utils.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\playlist.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\playlist_factory.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\playlist_source.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\plugin.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\plugin_insert.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\plugin_manager.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\port.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\port_insert.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\port_manager.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\port_set.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\process_thread.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\processor.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\progress.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\quantize.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\rb_effect.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\rc_configuration.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\recent_sessions.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\region.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\region_factory.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\resampled_source.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\return.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\reverse.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\revision.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\route.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\route_graph.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\route_group.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\route_group_member.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\scene_change.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\search_paths.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\send.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\session.cc"
+ >
+ <FileConfiguration
+ Name="Release 32|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ WholeProgramOptimization="false"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\session_butler.cc"
+ >
+ <FileConfiguration
+ Name="Release 32|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ WholeProgramOptimization="false"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\session_click.cc"
+ >
+ <FileConfiguration
+ Name="Release 32|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ WholeProgramOptimization="false"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\session_command.cc"
+ >
+ <FileConfiguration
+ Name="Release 32|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ WholeProgramOptimization="false"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\session_configuration.cc"
+ >
+ <FileConfiguration
+ Name="Release 32|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ WholeProgramOptimization="false"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\session_directory.cc"
+ >
+ <FileConfiguration
+ Name="Release 32|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ WholeProgramOptimization="false"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\session_events.cc"
+ >
+ <FileConfiguration
+ Name="Release 32|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ WholeProgramOptimization="false"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\session_export.cc"
+ >
+ <FileConfiguration
+ Name="Release 32|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ WholeProgramOptimization="false"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\session_handle.cc"
+ >
+ <FileConfiguration
+ Name="Release 32|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ WholeProgramOptimization="false"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\session_ltc.cc"
+ >
+ <FileConfiguration
+ Name="Release 32|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ WholeProgramOptimization="false"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\session_metadata.cc"
+ >
+ <FileConfiguration
+ Name="Release 32|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ WholeProgramOptimization="false"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\session_midi.cc"
+ >
+ <FileConfiguration
+ Name="Release 32|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ WholeProgramOptimization="false"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\session_object.cc"
+ >
+ <FileConfiguration
+ Name="Release 32|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ WholeProgramOptimization="false"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\session_playlists.cc"
+ >
+ <FileConfiguration
+ Name="Release 32|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ WholeProgramOptimization="false"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\session_process.cc"
+ >
+ <FileConfiguration
+ Name="Release 32|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ WholeProgramOptimization="false"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\session_rtevents.cc"
+ >
+ <FileConfiguration
+ Name="Release 32|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ WholeProgramOptimization="false"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\session_state.cc"
+ >
+ <FileConfiguration
+ Name="Release 32|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ WholeProgramOptimization="false"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\session_state_utils.cc"
+ >
+ <FileConfiguration
+ Name="Release 32|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ WholeProgramOptimization="false"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\session_time.cc"
+ >
+ <FileConfiguration
+ Name="Release 32|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ WholeProgramOptimization="false"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\session_transport.cc"
+ >
+ <FileConfiguration
+ Name="Release 32|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ WholeProgramOptimization="false"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\session_vst.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\slave.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\smf_source.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\sndfile_helpers.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\sndfileimportable.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\sndfilesource.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\soundcloud_upload.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\source.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\source_factory.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\speakers.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\srcfilesource.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\sse_functions_xmm.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\strip_silence.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\system_exec.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\tape_file_matcher.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\template_utils.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\tempo.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\tempo_map_importer.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\thread_buffers.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\ticker.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\track.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\transient_detector.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\unknown_processor.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\uri_map.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\user_bundle.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\utils.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\version.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\vst_info_file.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\vst_plugin.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\..\fst\vstwin.c"
+ >
+ </File>
+ <File
+ RelativePath="..\vumeterdsp.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\windows_vst_plugin.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\worker.cc"
+ >
+ </File>
+ <Filter
+ Name="msvc"
+ >
+ <File
+ RelativePath="..\msvc\msvc_libardour.cc"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\ardour\amp.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\analyser.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\ardour.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\async_midi_port.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\audio_backend.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\audio_buffer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\audio_diskstream.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\audio_library.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\audio_playlist_importer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\audio_playlist_source.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\audio_port.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\audio_region_importer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\audio_track.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\audio_track_importer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\audio_unit.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\audioanalyser.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\audioengine.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\audiofile_tagger.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\audiofilesource.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\audioplaylist.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\audioregion.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\audiosource.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\auditioner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\auto_bundle.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\automatable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\automatable_sequence.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\automation_control.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\automation_list.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\automation_watch.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\beats_frames_converter.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\broadcast_info.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\buffer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\buffer_manager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\buffer_set.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\bundle.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\butler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\caimportable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\capturing_processor.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\chan_count.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\chan_mapping.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\click.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\comparable_shared_ptr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\configuration.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\configuration_variable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\control_protocol_manager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\coreaudiosource.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\cycle_timer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\cycles.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\data_type.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\dB.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\debug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\delayline.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\delivery.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\directory_names.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\diskstream.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\element_import_handler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\element_importer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\event_type_map.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\export_channel.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\export_channel_configuration.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\export_failed.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\export_filename.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\export_format_base.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\export_format_compatibility.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\export_format_manager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\export_format_specification.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\export_formats.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\export_graph_builder.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\export_handler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\export_multiplication.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\export_pointers.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\export_preset.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\export_profile_manager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\export_status.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\export_timespan.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\file_source.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\filename_extensions.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\filesystem_paths.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\filter.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\graph.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\graphnode.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\iec1ppmdsp.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\iec2ppmdsp.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\import_status.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\importable_source.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\instrument_info.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\internal_return.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\internal_send.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\interpolation.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\interthread_info.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\io.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\io_processor.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\kmeterdsp.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\ladspa.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\ladspa_plugin.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\latent.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\location.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\location_importer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\logcurve.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\lv2_plugin.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\lxvst_plugin.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\meter.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\midi_automation_list_binder.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\midi_buffer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\midi_diskstream.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\midi_model.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\midi_operator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\midi_patch_manager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\midi_playlist.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\midi_playlist_source.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\midi_port.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\midi_region.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\midi_ring_buffer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\midi_scene_change.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\midi_scene_changer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\midi_source.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\midi_state_tracker.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\midi_stretch.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\midi_track.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\midi_ui.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\mididm.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\midiport_manager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\mix.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\monitor_processor.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\movable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\msvc_libardour.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\mtdm.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\mute_master.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\noise.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\onset_detector.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\operations.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\pan_controllable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\pannable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\panner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\panner_manager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\panner_shell.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\pcm_utils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\peak.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\pi_controller.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\pitch.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\playlist.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\playlist_factory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\playlist_source.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\plugin.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\plugin_insert.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\plugin_manager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\plugin_types.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\port.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\port_insert.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\port_set.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\process_thread.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\processor.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\profile.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\progress.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\proxy_controllable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\public_diskstream.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\quantize.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\rb_effect.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\rc_configuration.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\rc_configuration_vars.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\readable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\recent_sessions.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\region.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\region_factory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\region_sorters.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\resampled_source.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\return.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\reverse.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\revision.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\route.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\route_graph.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\route_group.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\route_group_member.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\route_group_specialized.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\route_sorters.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\runtime_functions.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\scene_change.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\scene_changer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\search_paths.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\send.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\session.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\session_configuration.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\session_configuration_vars.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\session_directory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\session_event.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\session_handle.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\session_metadata.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\session_object.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\session_playlist.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\session_playlists.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\session_route.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\session_state_utils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\session_utils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\silentfilesource.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\slave.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\smf_source.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\sndfile_helpers.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\sndfileimportable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\sndfilesource.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\soundcloud_upload.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\soundseq.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\source.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\source_factory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\speaker.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\speakers.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\spline.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\srcfilesource.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\stretch.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\strip_silence.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\system_exec.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\tape_file_matcher.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\template_utils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\tempo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\tempo_map_importer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\thread_buffers.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\ticker.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\timecode.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\timefx_request.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\timestamps.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\track.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\transient_detector.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\trimmable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\types.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\unknown_processor.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\uri_map.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\user_bundle.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\utils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\vst_plugin.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\vst_types.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\vumeterdsp.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\windows_vst_plugin.h"
+ >
+ </File>
+ <File
+ RelativePath="..\ardour\worker.h"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc
index 132be2e1c6..29032525f2 100644
--- a/libs/ardour/amp.cc
+++ b/libs/ardour/amp.cc
@@ -435,7 +435,10 @@ Amp::setup_gain_automation (framepos_t start_frame, framepos_t end_frame, framec
{
Glib::Threads::Mutex::Lock am (control_lock(), Glib::Threads::TRY_LOCK);
- if (am.locked() && _session.transport_rolling() && _gain_control->automation_playback()) {
+ if (am.locked()
+ && (_session.transport_rolling() || _session.bounce_processing())
+ && _gain_control->automation_playback())
+ {
assert (_gain_automation_buffer);
_apply_gain_automation = _gain_control->list()->curve().rt_safe_get_vector (
start_frame, end_frame, _gain_automation_buffer, nframes);
diff --git a/libs/ardour/ardour/amp.h b/libs/ardour/ardour/amp.h
index e21cf62d62..f6a15666e9 100644
--- a/libs/ardour/ardour/amp.h
+++ b/libs/ardour/ardour/amp.h
@@ -19,6 +19,7 @@
#ifndef __ardour_amp_h__
#define __ardour_amp_h__
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/chan_count.h"
#include "ardour/processor.h"
@@ -32,7 +33,7 @@ class IO;
/** Applies a declick operation to all audio inputs, passing the same number of
* audio outputs, and passing through any other types unchanged.
*/
-class Amp : public Processor {
+class LIBARDOUR_API Amp : public Processor {
public:
Amp(Session& s);
diff --git a/libs/ardour/ardour/analyser.h b/libs/ardour/ardour/analyser.h
index 51adea67b9..cef71186cc 100644
--- a/libs/ardour/ardour/analyser.h
+++ b/libs/ardour/ardour/analyser.h
@@ -23,13 +23,15 @@
#include <glibmm/threads.h>
#include <boost/shared_ptr.hpp>
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
class AudioFileSource;
class Source;
class TransientDetector;
-class Analyser {
+class LIBARDOUR_API Analyser {
public:
Analyser();
diff --git a/libs/ardour/ardour/ardour.h b/libs/ardour/ardour/ardour.h
index 80bdf9d80e..29cfa4b354 100644
--- a/libs/ardour/ardour/ardour.h
+++ b/libs/ardour/ardour/ardour.h
@@ -34,9 +34,9 @@
#include "pbd/locale_guard.h"
#include "pbd/stateful.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
-
-#include <jack/jack.h>
+#include "ardour/libardour_visibility.h"
namespace MIDI {
class MachineControl;
@@ -47,8 +47,10 @@ namespace ARDOUR {
class AudioEngine;
- extern PBD::Signal1<void,std::string> BootMessage;
- extern PBD::Signal0<void> GUIIdle;
+ extern LIBARDOUR_API PBD::Signal1<void,std::string> BootMessage;
+ extern LIBARDOUR_API PBD::Signal3<void,std::string,std::string,bool> PluginScanMessage;
+ extern LIBARDOUR_API PBD::Signal1<void,int> PluginScanTimeout;
+ extern LIBARDOUR_API PBD::Signal0<void> GUIIdle;
/**
* @param with_vst true to enable VST Support
@@ -58,27 +60,27 @@ namespace ARDOUR {
*
* @return true if Ardour library was successfully initialized
*/
- bool init (bool with_vst, bool try_optimization, const char* localedir);
- void init_post_engine ();
- void cleanup ();
- bool no_auto_connect ();
- void make_property_quarks ();
-
- extern PBD::PropertyChange bounds_change;
+ LIBARDOUR_API bool init (bool with_vst, bool try_optimization, const char* localedir);
+ LIBARDOUR_API void init_post_engine ();
+ LIBARDOUR_API void cleanup ();
+ LIBARDOUR_API bool no_auto_connect ();
+ LIBARDOUR_API void make_property_quarks ();
- extern const char* const ardour_config_info;
+ extern LIBARDOUR_API PBD::PropertyChange bounds_change;
+
+ extern LIBARDOUR_API const char* const ardour_config_info;
- void find_bindings_files (std::map<std::string,std::string>&);
+ LIBARDOUR_API void find_bindings_files (std::map<std::string,std::string>&);
/* these only impact bundled installations */
- std::string translation_enable_path ();
- bool translations_are_enabled ();
- bool set_translations_enabled (bool);
+ LIBARDOUR_API std::string translation_enable_path ();
+ LIBARDOUR_API bool translations_are_enabled ();
+ LIBARDOUR_API bool set_translations_enabled (bool);
- microseconds_t get_microseconds ();
+ LIBARDOUR_API microseconds_t get_microseconds ();
- void setup_fpu ();
- std::vector<SyncSource> get_available_sync_options();
+ LIBARDOUR_API void setup_fpu ();
+ LIBARDOUR_API std::vector<SyncSource> get_available_sync_options();
}
#endif /* __ardour_ardour_h__ */
diff --git a/libs/ardour/ardour/async_midi_port.h b/libs/ardour/ardour/async_midi_port.h
index 76bdac0409..26946e3016 100644
--- a/libs/ardour/ardour/async_midi_port.h
+++ b/libs/ardour/ardour/async_midi_port.h
@@ -22,6 +22,8 @@
#include <string>
#include <iostream>
+#include <boost/function.hpp>
+
#include "pbd/xml++.h"
#include "pbd/crossthread.h"
#include "pbd/signals.h"
@@ -34,11 +36,12 @@
#include "midi++/parser.h"
#include "midi++/port.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/midi_port.h"
namespace ARDOUR {
- class AsyncMIDIPort : public ARDOUR::MidiPort, public MIDI::Port {
+class LIBARDOUR_API AsyncMIDIPort : public ARDOUR::MidiPort, public MIDI::Port {
public:
AsyncMIDIPort (std::string const &, PortFlags);
@@ -52,10 +55,18 @@ namespace ARDOUR {
/* called from non-RT context */
void parse (framecnt_t timestamp);
- int write (const MIDI::byte *msg, size_t msglen, MIDI::timestamp_t timestamp);
+ int write (const MIDI::byte *msg, size_t msglen, MIDI::timestamp_t timestamp);
int read (MIDI::byte *buf, size_t bufsize);
void drain (int check_interval_usecs);
- int selectable () const { return xthread.selectable(); }
+ int selectable () const {
+#ifdef PLATFORM_WINDOWS
+ return false;
+#else
+ return xthread.selectable();
+#endif
+ }
+
+ void set_timer (boost::function<framecnt_t (void)>&);
static void set_process_thread (pthread_t);
static pthread_t get_process_thread () { return _process_thread; }
@@ -64,10 +75,26 @@ namespace ARDOUR {
private:
bool _currently_in_cycle;
MIDI::timestamp_t _last_write_timestamp;
+ bool have_timer;
+ boost::function<framecnt_t (void)> timer;
RingBuffer< Evoral::Event<double> > output_fifo;
Evoral::EventRingBuffer<MIDI::timestamp_t> input_fifo;
- Glib::Threads::Mutex output_fifo_lock;
- CrossThreadChannel xthread;
+ Glib::Threads::Mutex output_fifo_lock;
+#ifndef PLATFORM_WINDOWS
+ CrossThreadChannel xthread;
+#endif
+
+ int create_port ();
+
+ /** Channel used to signal to the MidiControlUI that input has arrived */
+
+ std::string _connections;
+ PBD::ScopedConnection connect_connection;
+ PBD::ScopedConnection halt_connection;
+ void flush (void* jack_port_buffer);
+ void jack_halted ();
+ void make_connections ();
+ void init (std::string const &, Flags);
void flush_output_fifo (pframes_t);
diff --git a/libs/ardour/ardour/audio_backend.h b/libs/ardour/ardour/audio_backend.h
index 387410685b..bf860e9aeb 100644
--- a/libs/ardour/ardour/audio_backend.h
+++ b/libs/ardour/ardour/audio_backend.h
@@ -28,25 +28,60 @@
#include <boost/function.hpp>
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/audioengine.h"
#include "ardour/port_engine.h"
-#include "ardour/visibility.h"
#ifdef ARDOURBACKEND_DLL_EXPORTS // defined if we are building the ARDOUR Panners DLLs (instead of using them)
- #define ARDOURBACKEND_API LIBARDOUR_HELPER_DLL_EXPORT
+ #define ARDOURBACKEND_API LIBARDOUR_DLL_EXPORT
#else
- #define ARDOURBACKEND_API LIBARDOUR_HELPER_DLL_IMPORT
+ #define ARDOURBACKEND_API LIBARDOUR_DLL_IMPORT
#endif
-#define ARDOURBACKEND_LOCAL LIBARDOUR_HELPER_DLL_LOCAL
+#define ARDOURBACKEND_LOCAL LIBARDOUR_DLL_LOCAL
namespace ARDOUR {
-class AudioBackend : public PortEngine {
+struct LIBARDOUR_API AudioBackendInfo {
+ const char* name;
+
+ /** Using arg1 and arg2, initialize this audiobackend.
+ *
+ * Returns zero on success, non-zero otherwise.
+ */
+ int (*instantiate) (const std::string& arg1, const std::string& arg2);
+
+ /** Release all resources associated with this audiobackend
+ */
+ int (*deinstantiate) (void);
+
+ /** Factory method to create an AudioBackend-derived class.
+ *
+ * Returns a valid shared_ptr to the object if successfull,
+ * or a "null" shared_ptr otherwise.
+ */
+ boost::shared_ptr<AudioBackend> (*factory) (AudioEngine&);
+
+ /** Return true if the underlying mechanism/API has been
+ * configured and does not need (re)configuration in order
+ * to be usable. Return false otherwise.
+ *
+ * Note that this may return true if (re)configuration, even though
+ * not currently required, is still possible.
+ */
+ bool (*already_configured)();
+};
+
+class LIBARDOUR_API AudioBackend : public PortEngine {
public:
- AudioBackend (AudioEngine& e) : PortEngine (e), engine (e) {}
+ AudioBackend (AudioEngine& e, AudioBackendInfo& i) : PortEngine (e), _info (i), engine (e) {}
virtual ~AudioBackend () {}
+
+ /** Return the AudioBackendInfo object from which this backend
+ was constructed.
+ */
+ AudioBackendInfo& info() const { return _info; }
/** Return the name of this backend.
*
@@ -188,6 +223,9 @@ class AudioBackend : public PortEngine {
/** Set the name of the device to be used
*/
virtual int set_device_name (const std::string&) = 0;
+ /** Deinitialize and destroy current device
+ */
+ virtual int drop_device() { return 0; };
/** Set the sample rate to be used
*/
virtual int set_sample_rate (float) = 0;
@@ -200,12 +238,6 @@ class AudioBackend : public PortEngine {
* doesn't directly expose the concept).
*/
virtual int set_buffer_size (uint32_t) = 0;
- /** Set the preferred underlying hardware sample format
- *
- * This does not change the sample format (32 bit float) read and
- * written to the device via the Port API.
- */
- virtual int set_sample_format (SampleFormat) = 0;
/** Set the preferred underlying hardware data layout.
* If @param yn is true, then the hardware will interleave
* samples for successive channels; otherwise, the hardware will store
@@ -231,18 +263,27 @@ class AudioBackend : public PortEngine {
* external D-A/D-A converters. Units are samples.
*/
virtual int set_systemic_output_latency (uint32_t) = 0;
+ /** Set the (additional) input latency for a specific midi device,
+ * or if the identifier is empty, apply to all midi devices.
+ */
+ virtual int set_systemic_midi_input_latency (std::string const, uint32_t) = 0;
+ /** Set the (additional) output latency for a specific midi device,
+ * or if the identifier is empty, apply to all midi devices.
+ */
+ virtual int set_systemic_midi_output_latency (std::string const, uint32_t) = 0;
/* Retrieving parameters */
virtual std::string device_name () const = 0;
virtual float sample_rate () const = 0;
virtual uint32_t buffer_size () const = 0;
- virtual SampleFormat sample_format () const = 0;
virtual bool interleaved () const = 0;
virtual uint32_t input_channels () const = 0;
virtual uint32_t output_channels () const = 0;
virtual uint32_t systemic_input_latency () const = 0;
virtual uint32_t systemic_output_latency () const = 0;
+ virtual uint32_t systemic_midi_input_latency (std::string const) const = 0;
+ virtual uint32_t systemic_midi_output_latency (std::string const) const = 0;
/** override this if this implementation returns true from
* requires_driver_selection()
@@ -280,7 +321,19 @@ class AudioBackend : public PortEngine {
virtual int set_midi_option (const std::string& option) = 0;
virtual std::string midi_option () const = 0;
-
+
+ /** Detailed MIDI device list - if available */
+ virtual std::vector<DeviceStatus> enumerate_midi_devices () const = 0;
+
+ /** mark a midi-devices as enabled */
+ virtual int set_midi_device_enabled (std::string const, bool) = 0;
+
+ /** query if a midi-device is enabled */
+ virtual bool midi_device_enabled (std::string const) const = 0;
+
+ /** if backend supports systemic_midi_[in|ou]tput_latency() */
+ virtual bool can_set_systemic_midi_latencies () const = 0;
+
/* State Control */
/** Start using the device named in the most recent call
@@ -486,39 +539,10 @@ class AudioBackend : public PortEngine {
}
protected:
- AudioEngine& engine;
-
- virtual int _start (bool for_latency_measurement) = 0;
-};
-
-struct AudioBackendInfo {
- const char* name;
+ AudioBackendInfo& _info;
+ AudioEngine& engine;
- /** Using arg1 and arg2, initialize this audiobackend.
- *
- * Returns zero on success, non-zero otherwise.
- */
- int (*instantiate) (const std::string& arg1, const std::string& arg2);
-
- /** Release all resources associated with this audiobackend
- */
- int (*deinstantiate) (void);
-
- /** Factory method to create an AudioBackend-derived class.
- *
- * Returns a valid shared_ptr to the object if successfull,
- * or a "null" shared_ptr otherwise.
- */
- boost::shared_ptr<AudioBackend> (*factory) (AudioEngine&);
-
- /** Return true if the underlying mechanism/API has been
- * configured and does not need (re)configuration in order
- * to be usable. Return false otherwise.
- *
- * Note that this may return true if (re)configuration, even though
- * not currently required, is still possible.
- */
- bool (*already_configured)();
+ virtual int _start (bool for_latency_measurement) = 0;
};
} // namespace
diff --git a/libs/ardour/ardour/audio_buffer.h b/libs/ardour/ardour/audio_buffer.h
index aaad961abb..91f463cc7f 100644
--- a/libs/ardour/ardour/audio_buffer.h
+++ b/libs/ardour/ardour/audio_buffer.h
@@ -27,7 +27,7 @@
namespace ARDOUR {
/** Buffer containing audio data. */
-class AudioBuffer : public Buffer
+class LIBARDOUR_API AudioBuffer : public Buffer
{
public:
AudioBuffer(size_t capacity);
diff --git a/libs/ardour/ardour/audio_diskstream.h b/libs/ardour/ardour/audio_diskstream.h
index 65d7db67ba..2614b8061c 100644
--- a/libs/ardour/ardour/audio_diskstream.h
+++ b/libs/ardour/ardour/audio_diskstream.h
@@ -53,7 +53,7 @@ class AudioPlaylist;
class AudioFileSource;
class IO;
-class AudioDiskstream : public Diskstream
+class LIBARDOUR_API AudioDiskstream : public Diskstream
{
public:
AudioDiskstream (Session &, const std::string& name, Diskstream::Flag f = Recordable);
@@ -108,6 +108,7 @@ class AudioDiskstream : public Diskstream
int remove_channel (uint32_t how_many);
bool set_name (std::string const &);
+ bool set_write_source_name (const std::string& str);
/* stateful */
diff --git a/libs/ardour/ardour/audio_library.h b/libs/ardour/ardour/audio_library.h
index 2009ec39a7..6397821720 100644
--- a/libs/ardour/ardour/audio_library.h
+++ b/libs/ardour/ardour/audio_library.h
@@ -24,9 +24,11 @@
#include <map>
#include <vector>
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
-class AudioLibrary
+class LIBARDOUR_API AudioLibrary
{
public:
AudioLibrary ();
@@ -43,7 +45,7 @@ class AudioLibrary
std::string src;
};
-extern AudioLibrary* Library;
+LIBARDOUR_API extern AudioLibrary* Library;
} // ARDOUR namespace
diff --git a/libs/ardour/ardour/audio_playlist_importer.h b/libs/ardour/ardour/audio_playlist_importer.h
index 011bfe39b8..a6d68b9c73 100644
--- a/libs/ardour/ardour/audio_playlist_importer.h
+++ b/libs/ardour/ardour/audio_playlist_importer.h
@@ -38,7 +38,7 @@ class AudioRegionImporter;
class AudioPlaylistImporter;
class Session;
-class AudioPlaylistImportHandler : public ElementImportHandler
+class LIBARDOUR_API AudioPlaylistImportHandler : public ElementImportHandler
{
public:
typedef boost::shared_ptr<AudioPlaylistImporter> PlaylistPtr;
@@ -57,7 +57,7 @@ class AudioPlaylistImportHandler : public ElementImportHandler
AudioRegionImportHandler & region_handler;
};
-class UnusedAudioPlaylistImportHandler : public AudioPlaylistImportHandler
+class LIBARDOUR_API UnusedAudioPlaylistImportHandler : public AudioPlaylistImportHandler
{
public:
UnusedAudioPlaylistImportHandler (XMLTree const & source, Session & session, AudioRegionImportHandler & region_handler) :
@@ -65,7 +65,7 @@ class UnusedAudioPlaylistImportHandler : public AudioPlaylistImportHandler
std::string get_info () const;
};
-class AudioPlaylistImporter : public ElementImporter
+class LIBARDOUR_API AudioPlaylistImporter : public ElementImporter
{
public:
AudioPlaylistImporter (XMLTree const & source, Session & session, AudioPlaylistImportHandler & handler, XMLNode const & node);
diff --git a/libs/ardour/ardour/audio_playlist_source.h b/libs/ardour/ardour/audio_playlist_source.h
index c2e1e87f75..6a586fc30d 100644
--- a/libs/ardour/ardour/audio_playlist_source.h
+++ b/libs/ardour/ardour/audio_playlist_source.h
@@ -32,7 +32,7 @@ namespace ARDOUR {
class AudioPlaylist;
-class AudioPlaylistSource : public PlaylistSource, public AudioSource {
+class LIBARDOUR_API AudioPlaylistSource : public PlaylistSource, public AudioSource {
public:
virtual ~AudioPlaylistSource ();
diff --git a/libs/ardour/ardour/audio_port.h b/libs/ardour/ardour/audio_port.h
index f87b134e9e..ca5f183a13 100644
--- a/libs/ardour/ardour/audio_port.h
+++ b/libs/ardour/ardour/audio_port.h
@@ -26,7 +26,7 @@
namespace ARDOUR {
-class AudioPort : public Port
+class LIBARDOUR_API AudioPort : public Port
{
public:
~AudioPort ();
diff --git a/libs/ardour/ardour/audio_region_importer.h b/libs/ardour/ardour/audio_region_importer.h
index b3bcb05668..d1a965a5ee 100644
--- a/libs/ardour/ardour/audio_region_importer.h
+++ b/libs/ardour/ardour/audio_region_importer.h
@@ -39,7 +39,7 @@ class Region;
class Session;
class Source;
-class AudioRegionImportHandler : public ElementImportHandler
+class LIBARDOUR_API AudioRegionImportHandler : public ElementImportHandler
{
public:
// Inerface implementation
@@ -69,7 +69,7 @@ class AudioRegionImportHandler : public ElementImportHandler
IdMap id_map;
};
-class AudioRegionImporter : public ElementImporter
+class LIBARDOUR_API AudioRegionImporter : public ElementImporter
{
public:
AudioRegionImporter (XMLTree const & source, Session & session, AudioRegionImportHandler & handler, XMLNode const & node);
diff --git a/libs/ardour/ardour/audio_track.h b/libs/ardour/ardour/audio_track.h
index ada58e8ebe..0bc8be81f4 100644
--- a/libs/ardour/ardour/audio_track.h
+++ b/libs/ardour/ardour/audio_track.h
@@ -31,7 +31,7 @@ class AudioPlaylist;
class RouteGroup;
class AudioFileSource;
-class AudioTrack : public Track
+class LIBARDOUR_API AudioTrack : public Track
{
public:
AudioTrack (Session&, std::string name, Route::Flag f = Route::Flag (0), TrackMode m = Normal);
@@ -58,7 +58,7 @@ class AudioTrack : public Track
boost::shared_ptr<Region> bounce_range (framepos_t start, framepos_t end, InterThreadInfo&,
boost::shared_ptr<Processor> endpoint, bool include_endpoint);
int export_stuff (BufferSet& bufs, framepos_t start_frame, framecnt_t nframes,
- boost::shared_ptr<Processor> endpoint, bool include_endpoint, bool for_export);
+ boost::shared_ptr<Processor> endpoint, bool include_endpoint, bool for_export, bool for_freeze);
int set_state (const XMLNode&, int version);
diff --git a/libs/ardour/ardour/audio_track_importer.h b/libs/ardour/ardour/audio_track_importer.h
index 683417de24..58789177e3 100644
--- a/libs/ardour/ardour/audio_track_importer.h
+++ b/libs/ardour/ardour/audio_track_importer.h
@@ -34,7 +34,7 @@ namespace ARDOUR {
class AudioPlaylistImportHandler;
class AudioPlaylistImporter;
-class AudioTrackImportHandler : public ElementImportHandler
+class LIBARDOUR_API AudioTrackImportHandler : public ElementImportHandler
{
public:
AudioTrackImportHandler (XMLTree const & source, Session & session, AudioPlaylistImportHandler & pl_handler);
@@ -46,7 +46,7 @@ class AudioTrackImportHandler : public ElementImportHandler
};
-class AudioTrackImporter : public ElementImporter
+class LIBARDOUR_API AudioTrackImporter : public ElementImporter
{
public:
AudioTrackImporter (XMLTree const & source,
diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h
index 007390b34a..8233e208d3 100644
--- a/libs/ardour/ardour/audio_unit.h
+++ b/libs/ardour/ardour/audio_unit.h
@@ -48,7 +48,7 @@ namespace ARDOUR {
class AudioEngine;
class Session;
-struct AUParameterDescriptor : public Plugin::ParameterDescriptor {
+struct LIBARDOUR_API AUParameterDescriptor : public Plugin::ParameterDescriptor {
// additional fields to make operations more efficient
AudioUnitParameterID id;
AudioUnitScope scope;
@@ -58,7 +58,7 @@ struct AUParameterDescriptor : public Plugin::ParameterDescriptor {
AudioUnitParameterUnit unit;
};
-class AUPlugin : public ARDOUR::Plugin
+class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin
{
public:
AUPlugin (AudioEngine& engine, Session& session, boost::shared_ptr<CAComponent> comp);
@@ -221,11 +221,11 @@ class AUPlugin : public ARDOUR::Plugin
typedef boost::shared_ptr<AUPlugin> AUPluginPtr;
-struct AUPluginCachedInfo {
+struct LIBARDOUR_API AUPluginCachedInfo {
std::vector<std::pair<int,int> > io_configs;
};
-class AUPluginInfo : public PluginInfo {
+class LIBARDOUR_API AUPluginInfo : public PluginInfo {
public:
AUPluginInfo (boost::shared_ptr<CAComponentDescription>);
~AUPluginInfo ();
diff --git a/libs/ardour/ardour/audioanalyser.h b/libs/ardour/ardour/audioanalyser.h
index f525cbd99f..6a9738eb5a 100644
--- a/libs/ardour/ardour/audioanalyser.h
+++ b/libs/ardour/ardour/audioanalyser.h
@@ -25,7 +25,8 @@
#include <ostream>
#include <fstream>
#include <boost/utility.hpp>
-#include <vamp-sdk/Plugin.h>
+#include "vamp-sdk/Plugin.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
namespace ARDOUR {
@@ -33,7 +34,7 @@ namespace ARDOUR {
class Readable;
class Session;
-class AudioAnalyser : public boost::noncopyable {
+class LIBARDOUR_API AudioAnalyser : public boost::noncopyable {
public:
typedef Vamp::Plugin AnalysisPlugin;
diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h
index 09f2ac04f8..7eeae8f205 100644
--- a/libs/ardour/ardour/audioengine.h
+++ b/libs/ardour/ardour/audioengine.h
@@ -39,6 +39,7 @@
#include "ardour/ardour.h"
#include "ardour/data_type.h"
#include "ardour/session_handle.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/chan_count.h"
#include "ardour/port_manager.h"
@@ -53,13 +54,14 @@ namespace ARDOUR {
class InternalPort;
class MidiPort;
+class MIDIDM;
class Port;
class Session;
class ProcessThread;
class AudioBackend;
class AudioBackendInfo;
-class AudioEngine : public SessionHandlePtr, public PortManager
+class LIBARDOUR_API AudioEngine : public SessionHandlePtr, public PortManager
{
public:
@@ -112,7 +114,6 @@ public:
int set_device_name (const std::string&);
int set_sample_rate (float);
int set_buffer_size (uint32_t);
- int set_sample_format (SampleFormat);
int set_interleaved (bool yn);
int set_input_channels (uint32_t);
int set_output_channels (uint32_t);
@@ -191,14 +192,24 @@ public:
/* latency measurement */
- MTDM* mtdm();
+ MTDM* mtdm() { return _mtdm; }
+ MIDIDM* mididm() { return _mididm; }
+
int prepare_for_latency_measurement ();
- int start_latency_detection ();
+ int start_latency_detection (bool);
void stop_latency_detection ();
void set_latency_input_port (const std::string&);
void set_latency_output_port (const std::string&);
uint32_t latency_signal_delay () const { return _latency_signal_latency; }
+ enum LatencyMeasurement {
+ MeasureNone,
+ MeasureAudio,
+ MeasureMIDI
+ };
+
+ LatencyMeasurement measuring_latency () const { return _measuring_latency; }
+
private:
AudioEngine ();
@@ -221,7 +232,8 @@ public:
Glib::Threads::Thread* m_meter_thread;
ProcessThread* _main_thread;
MTDM* _mtdm;
- bool _measuring_latency;
+ MIDIDM* _mididm;
+ LatencyMeasurement _measuring_latency;
PortEngine::PortHandle _latency_input_port;
PortEngine::PortHandle _latency_output_port;
framecnt_t _latency_flush_frames;
diff --git a/libs/ardour/ardour/audiofile_tagger.h b/libs/ardour/ardour/audiofile_tagger.h
index 656626a5f3..88789f9036 100644
--- a/libs/ardour/ardour/audiofile_tagger.h
+++ b/libs/ardour/ardour/audiofile_tagger.h
@@ -27,13 +27,15 @@
#include <taglib/taglib.h>
#include <taglib/xiphcomment.h>
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR
{
class SessionMetadata;
/// Class with static functions for tagging audiofiles
-class AudiofileTagger
+class LIBARDOUR_API AudiofileTagger
{
public:
diff --git a/libs/ardour/ardour/audiofilesource.h b/libs/ardour/ardour/audiofilesource.h
index 7f4b18e404..4831eb2081 100644
--- a/libs/ardour/ardour/audiofilesource.h
+++ b/libs/ardour/ardour/audiofilesource.h
@@ -27,7 +27,7 @@
namespace ARDOUR {
-struct SoundFileInfo {
+struct LIBARDOUR_API SoundFileInfo {
float samplerate;
uint16_t channels;
int64_t length;
@@ -35,7 +35,7 @@ struct SoundFileInfo {
int64_t timecode;
};
-class AudioFileSource : public AudioSource, public FileSource {
+class LIBARDOUR_API AudioFileSource : public AudioSource, public FileSource {
public:
virtual ~AudioFileSource ();
@@ -60,6 +60,7 @@ public:
virtual void clear_capture_marks() {}
virtual bool one_of_several_channels () const { return false; }
+ virtual void flush () = 0;
virtual int update_header (framepos_t when, struct tm&, time_t) = 0;
virtual int flush_header () = 0;
diff --git a/libs/ardour/ardour/audioplaylist.h b/libs/ardour/ardour/audioplaylist.h
index 478d4872cd..c4196dc3b6 100644
--- a/libs/ardour/ardour/audioplaylist.h
+++ b/libs/ardour/ardour/audioplaylist.h
@@ -29,13 +29,11 @@
namespace ARDOUR {
class Session;
-class Region;
class AudioRegion;
class Source;
-
class AudioPlaylist;
-class AudioPlaylist : public ARDOUR::Playlist
+class LIBARDOUR_API AudioPlaylist : public ARDOUR::Playlist
{
public:
AudioPlaylist (Session&, const XMLNode&, bool hidden = false);
diff --git a/libs/ardour/ardour/audioregion.h b/libs/ardour/ardour/audioregion.h
index 83cd227bce..b3bed8d5fd 100644
--- a/libs/ardour/ardour/audioregion.h
+++ b/libs/ardour/ardour/audioregion.h
@@ -40,17 +40,17 @@ class PlaylistReadTest;
namespace ARDOUR {
namespace Properties {
- extern PBD::PropertyDescriptor<bool> envelope_active;
- extern PBD::PropertyDescriptor<bool> default_fade_in;
- extern PBD::PropertyDescriptor<bool> default_fade_out;
- extern PBD::PropertyDescriptor<bool> fade_in_active;
- extern PBD::PropertyDescriptor<bool> fade_out_active;
- extern PBD::PropertyDescriptor<float> scale_amplitude;
- extern PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > fade_in;
- extern PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > inverse_fade_in;
- extern PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > fade_out;
- extern PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > inverse_fade_out;
- extern PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > envelope;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> envelope_active;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> default_fade_in;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> default_fade_out;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> fade_in_active;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> fade_out_active;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<float> scale_amplitude;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > fade_in;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > inverse_fade_in;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > fade_out;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > inverse_fade_out;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > envelope;
}
class Playlist;
@@ -59,7 +59,7 @@ class Filter;
class AudioSource;
-class AudioRegion : public Region
+class LIBARDOUR_API AudioRegion : public Region
{
public:
static void make_property_quarks ();
@@ -94,7 +94,7 @@ class AudioRegion : public Region
virtual framecnt_t read_peaks (PeakData *buf, framecnt_t npeaks,
framecnt_t offset, framecnt_t cnt,
- uint32_t chan_n=0, double samples_per_unit= 1.0) const;
+ uint32_t chan_n=0, double frames_per_pixel = 1.0) const;
/* Readable interface */
@@ -115,7 +115,6 @@ class AudioRegion : public Region
XMLNode& get_basic_state ();
int set_state (const XMLNode&, int version);
- static void set_default_fade (float steepness, framecnt_t len);
bool fade_in_is_default () const;
bool fade_out_is_default () const;
@@ -238,9 +237,9 @@ class AudioRegion : public Region
/* access from C objects */
extern "C" {
- int region_read_peaks_from_c (void *arg, uint32_t npeaks, uint32_t start, uint32_t length, intptr_t data, uint32_t n_chan, double samples_per_unit);
- uint32_t region_length_from_c (void *arg);
- uint32_t sourcefile_length_from_c (void *arg, double);
+ LIBARDOUR_API int region_read_peaks_from_c (void *arg, uint32_t npeaks, uint32_t start, uint32_t length, intptr_t data, uint32_t n_chan, double samples_per_unit);
+ LIBARDOUR_API uint32_t region_length_from_c (void *arg);
+ LIBARDOUR_API uint32_t sourcefile_length_from_c (void *arg, double);
}
#endif /* __ardour_audio_region_h__ */
diff --git a/libs/ardour/ardour/audiosource.h b/libs/ardour/ardour/audiosource.h
index d5c85a6bf8..910e03170d 100644
--- a/libs/ardour/ardour/audiosource.h
+++ b/libs/ardour/ardour/audiosource.h
@@ -38,7 +38,7 @@
namespace ARDOUR {
-class AudioSource : virtual public Source,
+class LIBARDOUR_API AudioSource : virtual public Source,
public ARDOUR::Readable,
public boost::enable_shared_from_this<ARDOUR::AudioSource>
{
diff --git a/libs/ardour/ardour/auditioner.h b/libs/ardour/ardour/auditioner.h
index e73824b669..452f7eb246 100644
--- a/libs/ardour/ardour/auditioner.h
+++ b/libs/ardour/ardour/auditioner.h
@@ -37,7 +37,7 @@ class Session;
class AudioRegion;
class AudioPlaylist;
-class Auditioner : public Track
+class LIBARDOUR_API Auditioner : public Track
{
public:
Auditioner (Session&);
@@ -97,7 +97,7 @@ class Auditioner : public Track
boost::shared_ptr<Region> bounce_range (framepos_t, framepos_t, InterThreadInfo&, boost::shared_ptr<Processor>, bool)
{ return boost::shared_ptr<Region> (); }
- int export_stuff (BufferSet&, framepos_t, framecnt_t, boost::shared_ptr<Processor>, bool, bool)
+ int export_stuff (BufferSet&, framepos_t, framecnt_t, boost::shared_ptr<Processor>, bool, bool, bool)
{ return -1; }
boost::shared_ptr<Diskstream> diskstream_factory (XMLNode const &)
@@ -136,6 +136,7 @@ class Auditioner : public Track
static void *_drop_ports (void *);
void actually_drop_ports ();
void output_changed (IOChange, void*);
+ frameoffset_t _import_position;
};
}; /* namespace ARDOUR */
diff --git a/libs/ardour/ardour/auto_bundle.h b/libs/ardour/ardour/auto_bundle.h
index d97080c089..703aa8e73d 100644
--- a/libs/ardour/ardour/auto_bundle.h
+++ b/libs/ardour/ardour/auto_bundle.h
@@ -26,7 +26,7 @@
namespace ARDOUR {
-class AutoBundle : public Bundle {
+class LIBARDOUR_API AutoBundle : public Bundle {
public:
AutoBundle (bool i = true);
diff --git a/libs/ardour/ardour/automatable.h b/libs/ardour/ardour/automatable.h
index b10b8eb2bc..11fb48904c 100644
--- a/libs/ardour/ardour/automatable.h
+++ b/libs/ardour/ardour/automatable.h
@@ -26,6 +26,7 @@
#include <boost/shared_ptr.hpp>
#include "pbd/signals.h"
#include "evoral/ControlSet.hpp"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
class XMLNode;
@@ -38,7 +39,7 @@ class AutomationControl;
/* The inherited ControlSet is virtual because AutomatableSequence inherits
* from this AND EvoralSequence, which is also a ControlSet
*/
-class Automatable : virtual public Evoral::ControlSet
+class LIBARDOUR_API Automatable : virtual public Evoral::ControlSet
{
public:
Automatable(Session&);
diff --git a/libs/ardour/ardour/automatable_sequence.h b/libs/ardour/ardour/automatable_sequence.h
index 730ea33a7c..b0003189a4 100644
--- a/libs/ardour/ardour/automatable_sequence.h
+++ b/libs/ardour/ardour/automatable_sequence.h
@@ -27,7 +27,7 @@ namespace ARDOUR {
/** Contains notes and controllers */
template<typename T>
-class AutomatableSequence : public Automatable, public Evoral::Sequence<T> {
+class /*LIBARDOUR_API*/ AutomatableSequence : public Automatable, public Evoral::Sequence<T> {
public:
AutomatableSequence(Session& s)
: Evoral::ControlSet()
diff --git a/libs/ardour/ardour/automation_control.h b/libs/ardour/ardour/automation_control.h
index 10194b3f9b..aeee9dab30 100644
--- a/libs/ardour/ardour/automation_control.h
+++ b/libs/ardour/ardour/automation_control.h
@@ -26,6 +26,8 @@
#include "pbd/controllable.h"
#include "evoral/Control.hpp"
+
+#include "ardour/libardour_visibility.h"
#include "ardour/automation_list.h"
namespace ARDOUR {
@@ -36,7 +38,7 @@ class Automatable;
/** A PBD::Controllable with associated automation data (AutomationList)
*/
-class AutomationControl : public PBD::Controllable, public Evoral::Control, public boost::enable_shared_from_this<AutomationControl>
+class LIBARDOUR_API AutomationControl : public PBD::Controllable, public Evoral::Control, public boost::enable_shared_from_this<AutomationControl>
{
public:
AutomationControl(ARDOUR::Session&,
diff --git a/libs/ardour/ardour/automation_list.h b/libs/ardour/ardour/automation_list.h
index 71eddda6dd..6e7b0007cd 100644
--- a/libs/ardour/ardour/automation_list.h
+++ b/libs/ardour/ardour/automation_list.h
@@ -40,7 +40,7 @@ namespace ARDOUR {
class AutomationList;
/** A SharedStatefulProperty for AutomationLists */
-class AutomationListProperty : public PBD::SharedStatefulProperty<AutomationList>
+class LIBARDOUR_API AutomationListProperty : public PBD::SharedStatefulProperty<AutomationList>
{
public:
AutomationListProperty (PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > d, Ptr p)
@@ -59,7 +59,7 @@ private:
AutomationListProperty& operator= (AutomationListProperty const &);
};
-class AutomationList : public PBD::StatefulDestructible, public Evoral::ControlList
+class LIBARDOUR_API AutomationList : public PBD::StatefulDestructible, public Evoral::ControlList
{
public:
AutomationList (Evoral::Parameter id);
diff --git a/libs/ardour/ardour/automation_watch.h b/libs/ardour/ardour/automation_watch.h
index f3e343468d..db6474c062 100644
--- a/libs/ardour/ardour/automation_watch.h
+++ b/libs/ardour/ardour/automation_watch.h
@@ -30,7 +30,7 @@ namespace ARDOUR {
class AutomationControl;
-class AutomationWatch : public sigc::trackable, public ARDOUR::SessionHandlePtr, public PBD::ScopedConnectionList {
+class LIBARDOUR_API AutomationWatch : public sigc::trackable, public ARDOUR::SessionHandlePtr, public PBD::ScopedConnectionList {
public:
static AutomationWatch& instance();
diff --git a/libs/ardour/ardour/backend_search_path.h b/libs/ardour/ardour/backend_search_path.h
deleted file mode 100644
index 2adc22bd6f..0000000000
--- a/libs/ardour/ardour/backend_search_path.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- Copyright (C) 2011 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_backend_search_path_h__
-#define __ardour_backend_search_path_h__
-
-#include "pbd/search_path.h"
-
-namespace ARDOUR {
-
- /**
- * return a SearchPath containing directories in which to look for
- * backend plugins.
- *
- * If ARDOUR_BACKEND_PATH is defined then the SearchPath returned
- * will contain only those directories specified in it, otherwise it will
- * contain the user and system directories which may contain audio/MIDI
- * backends.
- */
- PBD::SearchPath backend_search_path ();
-
-} // namespace ARDOUR
-
-#endif /* __ardour_backend_search_path_h__ */
diff --git a/libs/ardour/ardour/beats_frames_converter.h b/libs/ardour/ardour/beats_frames_converter.h
index e331b8411d..2e170d278a 100644
--- a/libs/ardour/ardour/beats_frames_converter.h
+++ b/libs/ardour/ardour/beats_frames_converter.h
@@ -20,6 +20,7 @@
*/
#include "evoral/TimeConverter.hpp"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#ifndef __ardour_beats_frames_converter_h__
@@ -33,7 +34,7 @@ class TempoMap;
* from some origin (supplied to the constructor in frames), and converts
* them to the opposite unit, taking tempo changes into account.
*/
-class BeatsFramesConverter : public Evoral::TimeConverter<double,framepos_t> {
+class LIBARDOUR_API BeatsFramesConverter : public Evoral::TimeConverter<double,framepos_t> {
public:
BeatsFramesConverter (TempoMap& tempo_map, framepos_t origin)
: Evoral::TimeConverter<double, framepos_t> (origin)
diff --git a/libs/ardour/ardour/broadcast_info.h b/libs/ardour/ardour/broadcast_info.h
index 0e87d6e6df..97f86dd133 100644
--- a/libs/ardour/ardour/broadcast_info.h
+++ b/libs/ardour/ardour/broadcast_info.h
@@ -23,6 +23,7 @@
#include <string>
+#include "ardour/libardour_visibility.h"
#include "audiographer/broadcast_info.h"
namespace ARDOUR
@@ -30,7 +31,7 @@ namespace ARDOUR
class Session;
-class BroadcastInfo : public AudioGrapher::BroadcastInfo
+class LIBARDOUR_API BroadcastInfo : public AudioGrapher::BroadcastInfo
{
public:
BroadcastInfo ();
diff --git a/libs/ardour/ardour/buffer.h b/libs/ardour/ardour/buffer.h
index 87f7a90fc3..8293a22beb 100644
--- a/libs/ardour/ardour/buffer.h
+++ b/libs/ardour/ardour/buffer.h
@@ -23,6 +23,7 @@
#include <boost/utility.hpp>
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/data_type.h"
@@ -38,7 +39,7 @@ namespace ARDOUR {
*
* To actually read/write buffer contents, use the appropriate derived class.
*/
-class Buffer : public boost::noncopyable
+class LIBARDOUR_API Buffer : public boost::noncopyable
{
public:
virtual ~Buffer() {}
diff --git a/libs/ardour/ardour/buffer_manager.h b/libs/ardour/ardour/buffer_manager.h
index fccd981fba..c73b59b763 100644
--- a/libs/ardour/ardour/buffer_manager.h
+++ b/libs/ardour/ardour/buffer_manager.h
@@ -32,7 +32,7 @@ namespace ARDOUR {
class ThreadBuffers;
-class BufferManager
+class LIBARDOUR_API BufferManager
{
public:
static void init (uint32_t);
@@ -40,7 +40,7 @@ public:
static ThreadBuffers* get_thread_buffers ();
static void put_thread_buffers (ThreadBuffers*);
- static void ensure_buffers (ChanCount howmany = ChanCount::ZERO);
+ static void ensure_buffers (ChanCount howmany = ChanCount::ZERO, size_t custom = 0);
private:
static Glib::Threads::Mutex rb_mutex;
diff --git a/libs/ardour/ardour/buffer_set.h b/libs/ardour/ardour/buffer_set.h
index 5f8553218b..9ea6ab7d6a 100644
--- a/libs/ardour/ardour/buffer_set.h
+++ b/libs/ardour/ardour/buffer_set.h
@@ -27,9 +27,10 @@
#include <vector>
#include "ardour/chan_count.h"
#include "ardour/data_type.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
-#if defined VST_SUPPORT || defined LXVST_SUPPORT
+#if defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT
#include "evoral/MIDIEvent.hpp"
struct _VstEvents;
typedef struct _VstEvents VstEvents;
@@ -61,7 +62,7 @@ class PortSet;
* others the form of their output (eg what they did to the BufferSet).
* Setting the use counts is realtime safe.
*/
-class BufferSet
+class LIBARDOUR_API BufferSet
{
public:
BufferSet();
@@ -129,7 +130,7 @@ public:
void forward_lv2_midi(LV2_Evbuf*, size_t, bool purge_ardour_buffer = true);
#endif
-#if defined VST_SUPPORT || defined LXVST_SUPPORT
+#if defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT
VstEvents* get_vst_midi (size_t);
#endif
@@ -188,7 +189,7 @@ private:
LV2Buffers _lv2_buffers;
#endif
-#if defined VST_SUPPORT || defined LXVST_SUPPORT
+#if defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT
class VSTBuffer {
public:
VSTBuffer (size_t);
diff --git a/libs/ardour/ardour/bundle.h b/libs/ardour/ardour/bundle.h
index 02845481b6..ef2247f12b 100644
--- a/libs/ardour/ardour/bundle.h
+++ b/libs/ardour/ardour/bundle.h
@@ -40,7 +40,7 @@ class AudioEngine;
* `Channel' is a rather overloaded term but I can't think of a better
* one right now.
*/
-class Bundle : public PBD::ScopedConnectionList
+class LIBARDOUR_API Bundle : public PBD::ScopedConnectionList
{
public:
@@ -149,7 +149,7 @@ class Bundle : public PBD::ScopedConnectionList
Change _pending_change;
};
-class BundleChannel
+class LIBARDOUR_API BundleChannel
{
public:
BundleChannel () : channel (-1) {}
diff --git a/libs/ardour/ardour/butler.h b/libs/ardour/ardour/butler.h
index cdd48c3e3a..949668dab3 100644
--- a/libs/ardour/ardour/butler.h
+++ b/libs/ardour/ardour/butler.h
@@ -20,13 +20,22 @@
#ifndef __ardour_butler_h__
#define __ardour_butler_h__
+#include <pthread.h>
+
#include <glibmm/threads.h>
+#ifdef PLATFORM_WINDOWS
+#include "pbd/glib_semaphore.h"
+#endif
+
#include "pbd/ringbuffer.h"
#include "pbd/pool.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/session_handle.h"
+
+
namespace ARDOUR {
/**
@@ -36,7 +45,7 @@ namespace ARDOUR {
* are empty they are deleted.
*/
-class Butler : public SessionHandleRef
+class LIBARDOUR_API Butler : public SessionHandleRef
{
public:
Butler (Session& session);
@@ -67,19 +76,48 @@ class Butler : public SessionHandleRef
};
pthread_t thread;
+ bool have_thread;
Glib::Threads::Mutex request_lock;
Glib::Threads::Cond paused;
bool should_run;
mutable gint should_do_transport_work;
- int request_pipe[2];
framecnt_t audio_dstream_capture_buffer_size;
framecnt_t audio_dstream_playback_buffer_size;
uint32_t midi_dstream_buffer_size;
RingBuffer<CrossThreadPool*> pool_trash;
+#ifdef PLATFORM_WINDOWS
+ PBD::atomic_counter m_request_state;
+ PBD::GlibSemaphore m_request_sem;
+#else
+ int request_pipe[2];
+#endif
+
private:
void empty_pool_trash ();
void config_changed (std::string);
+
+#ifndef PLATFORM_WINDOWS
+ int setup_request_pipe ();
+#endif
+
+ /**
+ * return true if there are requests to be processed
+ */
+ bool wait_for_requests ();
+
+ /**
+ * Remove request from butler request queue
+ *
+ * return true if there was another request and req is valid
+ */
+ bool dequeue_request (Request::Type& req);
+
+ /**
+ * Add request to butler thread request queue
+ */
+ void queue_request (Request::Type r);
+
};
} // namespace ARDOUR
diff --git a/libs/ardour/ardour/caimportable.h b/libs/ardour/ardour/caimportable.h
index 1ed8676ee6..211329b8c6 100644
--- a/libs/ardour/ardour/caimportable.h
+++ b/libs/ardour/ardour/caimportable.h
@@ -21,6 +21,7 @@
#define __ardour_ca_importable_source_h__
#include "pbd/failed_constructor.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/importable_source.h"
@@ -28,7 +29,7 @@
namespace ARDOUR {
-class CAImportableSource : public ImportableSource {
+class LIBARDOUR_API CAImportableSource : public ImportableSource {
public:
CAImportableSource (const std::string& path);
virtual ~CAImportableSource();
diff --git a/libs/ardour/ardour/capturing_processor.h b/libs/ardour/ardour/capturing_processor.h
index 5b9ea51557..9a91e6d02f 100644
--- a/libs/ardour/ardour/capturing_processor.h
+++ b/libs/ardour/ardour/capturing_processor.h
@@ -24,7 +24,7 @@
namespace ARDOUR {
-class CapturingProcessor : public Processor
+class LIBARDOUR_API CapturingProcessor : public Processor
{
public:
CapturingProcessor (Session & session);
diff --git a/libs/ardour/ardour/chan_count.h b/libs/ardour/ardour/chan_count.h
index c4f3caef6b..9f9fd07543 100644
--- a/libs/ardour/ardour/chan_count.h
+++ b/libs/ardour/ardour/chan_count.h
@@ -26,6 +26,10 @@
#include "pbd/xml++.h"
#include "ardour/data_type.h"
+#ifdef INFINITE
+#undef INFINITE
+#endif
+
namespace ARDOUR {
@@ -34,7 +38,7 @@ namespace ARDOUR {
* Operators are defined so this may safely be used as if it were a simple
* (single-typed) integer count of channels.
*/
-class ChanCount {
+class LIBARDOUR_API ChanCount {
public:
ChanCount(const XMLNode& node);
ChanCount() { reset(); }
diff --git a/libs/ardour/ardour/chan_mapping.h b/libs/ardour/ardour/chan_mapping.h
index 5b63844f66..ebb7be402a 100644
--- a/libs/ardour/ardour/chan_mapping.h
+++ b/libs/ardour/ardour/chan_mapping.h
@@ -34,7 +34,7 @@ namespace ARDOUR {
/** A mapping from one set of channels to another
* (e.g. how to 'connect' two BufferSets).
*/
-class ChanMapping {
+class LIBARDOUR_API ChanMapping {
public:
ChanMapping() {}
ChanMapping(ARDOUR::ChanCount identity);
diff --git a/libs/ardour/ardour/click.h b/libs/ardour/ardour/click.h
index 1047540a74..7fc6d21f73 100644
--- a/libs/ardour/ardour/click.h
+++ b/libs/ardour/ardour/click.h
@@ -23,12 +23,13 @@
#include <list>
#include "pbd/pool.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/io.h"
namespace ARDOUR {
-class Click {
+class LIBARDOUR_API Click {
public:
framepos_t start;
framecnt_t duration;
@@ -49,7 +50,7 @@ private:
static Pool pool;
};
-class ClickIO : public IO
+class LIBARDOUR_API ClickIO : public IO
{
public:
ClickIO (Session& s, const std::string& name) : IO (s, name, IO::Output) {}
diff --git a/libs/ardour/ardour/comparable_shared_ptr.h b/libs/ardour/ardour/comparable_shared_ptr.h
index 5ff19af419..f5e9cd346a 100644
--- a/libs/ardour/ardour/comparable_shared_ptr.h
+++ b/libs/ardour/ardour/comparable_shared_ptr.h
@@ -21,10 +21,12 @@
#ifndef __ardour_comparable_shared_ptr_h__
#define __ardour_comparable_shared_ptr_h__
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
template<typename T>
-class ComparableSharedPtr : public boost::shared_ptr<T>
+class /*LIBARDOUR_API*/ ComparableSharedPtr : public boost::shared_ptr<T>
, public boost::less_than_comparable<ComparableSharedPtr<T> >
{
public:
diff --git a/libs/ardour/ardour/configuration.h b/libs/ardour/ardour/configuration.h
index 14a43e160c..f8e512e458 100644
--- a/libs/ardour/ardour/configuration.h
+++ b/libs/ardour/ardour/configuration.h
@@ -29,7 +29,7 @@ class XMLNode;
namespace ARDOUR {
-class Configuration : public PBD::Stateful
+class LIBARDOUR_API Configuration : public PBD::Stateful
{
public:
Configuration();
diff --git a/libs/ardour/ardour/configuration_variable.h b/libs/ardour/ardour/configuration_variable.h
index a7fe8def48..7a83c34c3f 100644
--- a/libs/ardour/ardour/configuration_variable.h
+++ b/libs/ardour/ardour/configuration_variable.h
@@ -25,12 +25,13 @@
#include "pbd/xml++.h"
#include "pbd/convert.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/utils.h"
namespace ARDOUR {
-class ConfigVariableBase {
+class LIBARDOUR_API ConfigVariableBase {
public:
ConfigVariableBase (std::string str) : _name (str) {}
@@ -51,7 +52,7 @@ class ConfigVariableBase {
};
template<class T>
-class ConfigVariable : public ConfigVariableBase
+class /*LIBARDOUR_API*/ ConfigVariable : public ConfigVariableBase
{
public:
@@ -91,7 +92,7 @@ class ConfigVariable : public ConfigVariableBase
/** Specialisation of ConfigVariable for std::string to cope with whitespace properly */
template<>
-class ConfigVariable<std::string> : public ConfigVariableBase
+class /*LIBARDOUR_API*/ ConfigVariable<std::string> : public ConfigVariableBase
{
public:
@@ -126,7 +127,7 @@ class ConfigVariable<std::string> : public ConfigVariableBase
};
template<>
-class ConfigVariable<bool> : public ConfigVariableBase
+class /*LIBARDOUR_API*/ ConfigVariable<bool> : public ConfigVariableBase
{
public:
@@ -163,7 +164,7 @@ class ConfigVariable<bool> : public ConfigVariableBase
};
template<class T>
-class ConfigVariableWithMutation : public ConfigVariable<T>
+class /*LIBARDOUR_API*/ ConfigVariableWithMutation : public ConfigVariable<T>
{
public:
ConfigVariableWithMutation (std::string name, T val, T (*m)(T))
@@ -192,7 +193,7 @@ class ConfigVariableWithMutation : public ConfigVariable<T>
};
template<>
-class ConfigVariableWithMutation<std::string> : public ConfigVariable<std::string>
+class /*LIBARDOUR_API*/ ConfigVariableWithMutation<std::string> : public ConfigVariable<std::string>
{
public:
ConfigVariableWithMutation (std::string name, std::string val, std::string (*m)(std::string))
diff --git a/libs/ardour/ardour/control_protocol_manager.h b/libs/ardour/ardour/control_protocol_manager.h
index 7d3d4872e6..0c8c9014f0 100644
--- a/libs/ardour/ardour/control_protocol_manager.h
+++ b/libs/ardour/ardour/control_protocol_manager.h
@@ -35,7 +35,7 @@ class ControlProtocol;
class ControlProtocolDescriptor;
class Session;
-class ControlProtocolInfo {
+class LIBARDOUR_API ControlProtocolInfo {
public:
ControlProtocolDescriptor* descriptor;
ControlProtocol* protocol;
@@ -52,7 +52,7 @@ public:
~ControlProtocolInfo() { delete state; }
};
-class ControlProtocolManager : public PBD::Stateful, public ARDOUR::SessionHandlePtr
+class LIBARDOUR_API ControlProtocolManager : public PBD::Stateful, public ARDOUR::SessionHandlePtr
{
public:
~ControlProtocolManager ();
diff --git a/libs/ardour/ardour/control_protocol_search_path.h b/libs/ardour/ardour/control_protocol_search_path.h
deleted file mode 100644
index 8795f4501a..0000000000
--- a/libs/ardour/ardour/control_protocol_search_path.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- Copyright (C) 2007 Tim Mayberry
-
- 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_CONTROL_PROTOCOL_SEARCH_PATH_INCLUDED
-#define ARDOUR_CONTROL_PROTOCOL_SEARCH_PATH_INCLUDED
-
-#include "pbd/search_path.h"
-
-namespace ARDOUR {
-
- /**
- * return a SearchPath containing directories in which to look for
- * control surface plugins.
- *
- * If ARDOUR_SURFACES_PATH is defined then the SearchPath returned
- * will contain only those directories specified in it, otherwise it will
- * contain the user and system directories which may contain control
- * surface plugins.
- */
- PBD::SearchPath control_protocol_search_path ();
-
-} // namespace ARDOUR
-
-#endif
diff --git a/libs/ardour/ardour/coreaudiosource.h b/libs/ardour/ardour/coreaudiosource.h
index 820fa0b9d8..f12a67ded7 100644
--- a/libs/ardour/ardour/coreaudiosource.h
+++ b/libs/ardour/ardour/coreaudiosource.h
@@ -28,7 +28,7 @@ using namespace std;
namespace ARDOUR {
-class CoreAudioSource : public AudioFileSource {
+class LIBARDOUR_API CoreAudioSource : public AudioFileSource {
public:
CoreAudioSource (ARDOUR::Session&, const XMLNode&);
CoreAudioSource (ARDOUR::Session&, const string& path, int chn, Flag);
@@ -43,6 +43,8 @@ class CoreAudioSource : public AudioFileSource {
void set_header_timeline_position () {};
bool clamped_at_unity () const { return false; }
+ void flush () {}
+
static int get_soundfile_info (string path, SoundFileInfo& _info, string& error_msg);
protected:
diff --git a/libs/ardour/ardour/cycle_timer.h b/libs/ardour/ardour/cycle_timer.h
index 35cc2a4c73..cab389ee69 100644
--- a/libs/ardour/ardour/cycle_timer.h
+++ b/libs/ardour/ardour/cycle_timer.h
@@ -24,12 +24,13 @@
#include <iostream>
#include <cstdlib>
+#include "ardour/libardour_visibility.h"
#include "ardour/cycles.h"
#include "ardour/debug.h"
float get_mhz ();
-class CycleTimer {
+class LIBARDOUR_API CycleTimer {
private:
static float cycles_per_usec;
#ifndef NDEBUG
@@ -48,6 +49,8 @@ class CycleTimer {
}
_entry = get_cycles();
}
+#else
+ (void) name;
#endif
}
@@ -61,7 +64,7 @@ class CycleTimer {
}
};
-class StoringTimer
+class LIBARDOUR_API StoringTimer
{
public:
StoringTimer (int);
diff --git a/libs/ardour/ardour/cycles.h b/libs/ardour/ardour/cycles.h
index 01e1d55221..dc1095db7b 100644
--- a/libs/ardour/ardour/cycles.h
+++ b/libs/ardour/ardour/cycles.h
@@ -216,7 +216,10 @@ static inline cycles_t get_cycles (void)
/* debian: sparc, arm, m68k */
+#ifndef COMPILER_MSVC
+/* GRRR... Annoyingly, #warning aborts the compilation for MSVC !! */
#warning You are compiling libardour on a platform for which ardour/cycles.h needs work
+#endif
#include <sys/time.h>
diff --git a/libs/ardour/ardour/data_type.h b/libs/ardour/ardour/data_type.h
index b4129e2629..2a4514a5cf 100644
--- a/libs/ardour/ardour/data_type.h
+++ b/libs/ardour/ardour/data_type.h
@@ -24,6 +24,8 @@
#include <stdint.h>
#include <glib.h>
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
/** A type of Data Ardour is capable of processing.
@@ -32,7 +34,7 @@ namespace ARDOUR {
* other type representations, simple comparison between then, etc. This code
* is deliberately 'ugly' so other code doesn't have to be.
*/
-class DataType
+class LIBARDOUR_API DataType
{
public:
/** Numeric symbol for this DataType.
diff --git a/libs/ardour/ardour/debug.h b/libs/ardour/ardour/debug.h
index 5811f7a484..9a7b0a495f 100644
--- a/libs/ardour/ardour/debug.h
+++ b/libs/ardour/ardour/debug.h
@@ -24,46 +24,51 @@
#include <sstream>
+#include "ardour/libardour_visibility.h"
#include "pbd/debug.h"
namespace PBD {
namespace DEBUG {
- extern uint64_t MidiSourceIO;
- extern uint64_t MidiPlaylistIO;
- extern uint64_t MidiDiskstreamIO;
- extern uint64_t SnapBBT;
- extern uint64_t Configuration;
- extern uint64_t Latency;
- extern uint64_t Processors;
- extern uint64_t ProcessThreads;
- extern uint64_t Graph;
- extern uint64_t Destruction;
- extern uint64_t MTC;
- extern uint64_t LTC;
- extern uint64_t Transport;
- extern uint64_t Slave;
- extern uint64_t SessionEvents;
- extern uint64_t MidiIO;
- extern uint64_t MackieControl;
- extern uint64_t MidiClock;
- extern uint64_t Monitor;
- extern uint64_t Solo;
- extern uint64_t AudioPlayback;
- extern uint64_t Panning;
- extern uint64_t LV2;
- extern uint64_t CaptureAlignment;
- extern uint64_t PluginManager;
- extern uint64_t AudioUnits;
- extern uint64_t ControlProtocols;
- extern uint64_t CycleTimers;
- extern uint64_t MidiTrackers;
- extern uint64_t Layering;
- extern uint64_t TempoMath;
- extern uint64_t TempoMap;
- extern uint64_t OrderKeys;
- extern uint64_t Automation;
- extern uint64_t WiimoteControl;
- extern uint64_t Ports;
+ LIBARDOUR_API extern uint64_t MidiSourceIO;
+ LIBARDOUR_API extern uint64_t MidiPlaylistIO;
+ LIBARDOUR_API extern uint64_t MidiDiskstreamIO;
+ LIBARDOUR_API extern uint64_t SnapBBT;
+ LIBARDOUR_API extern uint64_t Configuration;
+ LIBARDOUR_API extern uint64_t Latency;
+ LIBARDOUR_API extern uint64_t LatencyCompensation;
+ LIBARDOUR_API extern uint64_t Peaks;
+ LIBARDOUR_API extern uint64_t Processors;
+ LIBARDOUR_API extern uint64_t ProcessThreads;
+ LIBARDOUR_API extern uint64_t Graph;
+ LIBARDOUR_API extern uint64_t Destruction;
+ LIBARDOUR_API extern uint64_t MTC;
+ LIBARDOUR_API extern uint64_t LTC;
+ LIBARDOUR_API extern uint64_t Transport;
+ LIBARDOUR_API extern uint64_t Slave;
+ LIBARDOUR_API extern uint64_t SessionEvents;
+ LIBARDOUR_API extern uint64_t MidiIO;
+ LIBARDOUR_API extern uint64_t MackieControl;
+ LIBARDOUR_API extern uint64_t MidiClock;
+ LIBARDOUR_API extern uint64_t Monitor;
+ LIBARDOUR_API extern uint64_t Solo;
+ LIBARDOUR_API extern uint64_t AudioPlayback;
+ LIBARDOUR_API extern uint64_t Panning;
+ LIBARDOUR_API extern uint64_t LV2;
+ LIBARDOUR_API extern uint64_t CaptureAlignment;
+ LIBARDOUR_API extern uint64_t PluginManager;
+ LIBARDOUR_API extern uint64_t AudioUnits;
+ LIBARDOUR_API extern uint64_t ControlProtocols;
+ LIBARDOUR_API extern uint64_t CycleTimers;
+ LIBARDOUR_API extern uint64_t MidiTrackers;
+ LIBARDOUR_API extern uint64_t Layering;
+ LIBARDOUR_API extern uint64_t TempoMath;
+ LIBARDOUR_API extern uint64_t TempoMap;
+ LIBARDOUR_API extern uint64_t OrderKeys;
+ LIBARDOUR_API extern uint64_t Automation;
+ LIBARDOUR_API extern uint64_t WiimoteControl;
+ LIBARDOUR_API extern uint64_t Ports;
+ LIBARDOUR_API extern uint64_t AudioEngine;
+ LIBARDOUR_API extern uint64_t Soundcloud;
}
}
diff --git a/libs/ardour/ardour/delayline.h b/libs/ardour/ardour/delayline.h
new file mode 100644
index 0000000000..56a6de0c63
--- /dev/null
+++ b/libs/ardour/ardour/delayline.h
@@ -0,0 +1,69 @@
+/*
+ Copyright (C) 2006, 2013 Paul Davis
+ Copyright (C) 2013, 2014 Robin Gareus <robin@gareus.org>
+
+ 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_delayline_h__
+#define __ardour_delayline_h__
+
+#include "ardour/types.h"
+#include "ardour/processor.h"
+
+namespace ARDOUR {
+
+class BufferSet;
+class ChanCount;
+class Session;
+
+/** Meters peaks on the input and stores them for access.
+ */
+class LIBARDOUR_API DelayLine : public Processor {
+public:
+
+ DelayLine (Session& s, const std::string& name);
+ ~DelayLine ();
+
+ bool display_to_user() const { return false; }
+
+ void run (BufferSet&, framepos_t, framepos_t, pframes_t, bool);
+ void set_delay(framecnt_t signal_delay);
+ framecnt_t get_delay() { return _pending_delay; }
+
+ bool configure_io (ChanCount in, ChanCount out);
+ bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
+
+ void flush();
+ void realtime_handle_transport_stopped () { flush(); }
+ void realtime_locate () { flush(); }
+ void monitoring_changed() { flush(); }
+
+ XMLNode& state (bool full);
+
+private:
+ friend class IO;
+ framecnt_t _delay, _pending_delay;
+ framecnt_t _bsiz, _pending_bsiz;
+ frameoffset_t _roff, _woff;
+ boost::shared_ptr<Sample> _buf;
+ boost::shared_ptr<Sample> _pending_buf;
+ boost::shared_ptr<MidiBuffer> _midi_buf;
+ bool _pending_flush;
+};
+
+} // namespace ARDOUR
+
+#endif // __ardour_meter_h__
diff --git a/libs/ardour/ardour/delivery.h b/libs/ardour/ardour/delivery.h
index 4a6d4368a6..e19eef719f 100644
--- a/libs/ardour/ardour/delivery.h
+++ b/libs/ardour/ardour/delivery.h
@@ -21,6 +21,7 @@
#include <string>
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/chan_count.h"
#include "ardour/io_processor.h"
@@ -34,7 +35,7 @@ class PannerShell;
class Panner;
class Pannable;
-class Delivery : public IOProcessor
+class LIBARDOUR_API Delivery : public IOProcessor
{
public:
enum Role {
diff --git a/libs/ardour/ardour/directory_names.h b/libs/ardour/ardour/directory_names.h
index 935cdd977b..17532e2a3a 100644
--- a/libs/ardour/ardour/directory_names.h
+++ b/libs/ardour/ardour/directory_names.h
@@ -21,24 +21,28 @@
#ifndef __ardour_directory_names_h__
#define __ardour_directory_names_h__
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
-extern const char* const old_sound_dir_name;
-extern const char* const sound_dir_name;
-extern const char* const midi_dir_name;
-extern const char* const midi_patch_dir_name;
-extern const char* const video_dir_name;
-extern const char* const dead_dir_name;
-extern const char* const interchange_dir_name;
-extern const char* const peak_dir_name;
-extern const char* const export_dir_name;
-extern const char* const export_formats_dir_name;
-extern const char* const templates_dir_name;
-extern const char* const route_templates_dir_name;
-extern const char* const surfaces_dir_name;
-extern const char* const user_config_dir_name;
-extern const char* const panner_dir_name;
-extern const char* const backend_dir_name;
+ LIBARDOUR_API extern const char* const old_sound_dir_name;
+ LIBARDOUR_API extern const char* const sound_dir_name;
+ LIBARDOUR_API extern const char* const ladspa_dir_name;
+ LIBARDOUR_API extern const char* const midi_dir_name;
+ LIBARDOUR_API extern const char* const midi_patch_dir_name;
+ LIBARDOUR_API extern const char* const video_dir_name;
+ LIBARDOUR_API extern const char* const dead_dir_name;
+ LIBARDOUR_API extern const char* const interchange_dir_name;
+ LIBARDOUR_API extern const char* const peak_dir_name;
+ LIBARDOUR_API extern const char* const export_dir_name;
+ LIBARDOUR_API extern const char* const export_formats_dir_name;
+ LIBARDOUR_API extern const char* const templates_dir_name;
+ LIBARDOUR_API extern const char* const route_templates_dir_name;
+ LIBARDOUR_API extern const char* const surfaces_dir_name;
+ LIBARDOUR_API extern const char* const ladspa_dir_name;
+ LIBARDOUR_API extern const char* const user_config_dir_name;
+ LIBARDOUR_API extern const char* const panner_dir_name;
+ LIBARDOUR_API extern const char* const backend_dir_name;
};
diff --git a/libs/ardour/ardour/diskstream.h b/libs/ardour/ardour/diskstream.h
index 91efb0d517..055a298d84 100644
--- a/libs/ardour/ardour/diskstream.h
+++ b/libs/ardour/ardour/diskstream.h
@@ -34,6 +34,7 @@
#include "ardour/ardour.h"
#include "ardour/chan_count.h"
#include "ardour/session_object.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/utils.h"
#include "ardour/public_diskstream.h"
@@ -54,7 +55,7 @@ class BufferSet;
/** Parent class for classes which can stream data to and from disk.
* These are used by Tracks to get playback and put recorded data.
*/
-class Diskstream : public SessionObject, public PublicDiskstream
+class LIBARDOUR_API Diskstream : public SessionObject, public PublicDiskstream
{
public:
enum Flag {
@@ -69,6 +70,15 @@ class Diskstream : public SessionObject, public PublicDiskstream
virtual ~Diskstream();
virtual bool set_name (const std::string& str);
+ virtual bool set_write_source_name (const std::string& str);
+
+ std::string write_source_name () const {
+ if (_write_source_name.empty()) {
+ return name();
+ } else {
+ return _write_source_name;
+ }
+ }
virtual std::string steal_write_source_name () { return std::string(); }
@@ -311,6 +321,8 @@ class Diskstream : public SessionObject, public PublicDiskstream
bool in_set_state;
+ std::string _write_source_name;
+
Glib::Threads::Mutex state_lock;
PBD::ScopedConnectionList playlist_connections;
diff --git a/libs/ardour/ardour/element_import_handler.h b/libs/ardour/ardour/element_import_handler.h
index be2e3fafb0..32898ec9de 100644
--- a/libs/ardour/ardour/element_import_handler.h
+++ b/libs/ardour/ardour/element_import_handler.h
@@ -27,6 +27,9 @@
#include <boost/shared_ptr.hpp>
+#include "ardour/libardour_visibility.h"
+#include "pbd/libpbd_visibility.h"
+
class XMLTree;
namespace ARDOUR {
@@ -35,7 +38,7 @@ class Session;
class ElementImporter;
/// Virtual interface class for element import handlers
-class ElementImportHandler
+class LIBARDOUR_API ElementImportHandler
{
public:
typedef boost::shared_ptr<ElementImporter> ElementPtr;
diff --git a/libs/ardour/ardour/element_importer.h b/libs/ardour/ardour/element_importer.h
index 8c25fd380d..b6d6ff7166 100644
--- a/libs/ardour/ardour/element_importer.h
+++ b/libs/ardour/ardour/element_importer.h
@@ -25,6 +25,7 @@
#include <utility>
#include "pbd/signals.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
class XMLTree;
@@ -34,7 +35,7 @@ class Session;
class ImportStatus;
/// Virtual interface class for element importers
-class ElementImporter
+class LIBARDOUR_API ElementImporter
{
public:
diff --git a/libs/ardour/ardour/event_type_map.h b/libs/ardour/ardour/event_type_map.h
index 02852e9711..fbfd9ec73c 100644
--- a/libs/ardour/ardour/event_type_map.h
+++ b/libs/ardour/ardour/event_type_map.h
@@ -25,12 +25,14 @@
#include "evoral/TypeMap.hpp"
#include "evoral/ControlList.hpp"
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
/** This is the interface Ardour provides to Evoral about what
* parameter and event types/ranges/names etc. to use.
*/
-class EventTypeMap : public Evoral::TypeMap {
+class LIBARDOUR_API EventTypeMap : public Evoral::TypeMap {
public:
bool type_is_midi(uint32_t type) const;
uint8_t parameter_midi_type(const Evoral::Parameter& param) const;
diff --git a/libs/ardour/ardour/export_channel.h b/libs/ardour/ardour/export_channel.h
index f3244095a3..894406874e 100644
--- a/libs/ardour/ardour/export_channel.h
+++ b/libs/ardour/ardour/export_channel.h
@@ -40,7 +40,7 @@ class AudioRegion;
class CapturingProcessor;
/// Export channel base class interface for different source types
-class ExportChannel : public boost::less_than_comparable<ExportChannel>
+class LIBARDOUR_API ExportChannel : public boost::less_than_comparable<ExportChannel>
{
public:
@@ -62,7 +62,7 @@ class ExportChannel : public boost::less_than_comparable<ExportChannel>
};
/// Basic export channel that reads from AudioPorts
-class PortExportChannel : public ExportChannel
+class LIBARDOUR_API PortExportChannel : public ExportChannel
{
public:
typedef std::set<boost::weak_ptr<AudioPort> > PortSet;
@@ -89,7 +89,7 @@ class PortExportChannel : public ExportChannel
/// Handles RegionExportChannels and does actual reading from region
-class RegionExportChannelFactory
+class LIBARDOUR_API RegionExportChannelFactory
{
public:
enum Type {
@@ -128,7 +128,7 @@ class RegionExportChannelFactory
};
/// Export channel that reads from region channel
-class RegionExportChannel : public ExportChannel
+class LIBARDOUR_API RegionExportChannel : public ExportChannel
{
friend class RegionExportChannelFactory;
@@ -152,7 +152,7 @@ class RegionExportChannel : public ExportChannel
};
/// Export channel for exporting from different positions in a route
-class RouteExportChannel : public ExportChannel
+class LIBARDOUR_API RouteExportChannel : public ExportChannel
{
class ProcessorRemover; // fwd declaration
diff --git a/libs/ardour/ardour/export_channel_configuration.h b/libs/ardour/ardour/export_channel_configuration.h
index b625be9dc3..4cab886c88 100644
--- a/libs/ardour/ardour/export_channel_configuration.h
+++ b/libs/ardour/ardour/export_channel_configuration.h
@@ -37,7 +37,7 @@ namespace ARDOUR
class Session;
-class ExportChannelConfiguration : public boost::enable_shared_from_this<ExportChannelConfiguration>
+class LIBARDOUR_API ExportChannelConfiguration : public boost::enable_shared_from_this<ExportChannelConfiguration>
{
private:
diff --git a/libs/ardour/ardour/export_failed.h b/libs/ardour/ardour/export_failed.h
index 16687826b1..f1fd57ab4b 100644
--- a/libs/ardour/ardour/export_failed.h
+++ b/libs/ardour/ardour/export_failed.h
@@ -24,10 +24,12 @@
#include <exception>
#include <string>
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR
{
-class ExportFailed : public std::exception
+class LIBARDOUR_API ExportFailed : public std::exception
{
public:
ExportFailed (std::string const &);
diff --git a/libs/ardour/ardour/export_filename.h b/libs/ardour/ardour/export_filename.h
index 994f584e8d..7eacc11b90 100644
--- a/libs/ardour/ardour/export_filename.h
+++ b/libs/ardour/ardour/export_filename.h
@@ -34,7 +34,7 @@ namespace ARDOUR
class Session;
-class ExportFilename {
+class LIBARDOUR_API ExportFilename {
public:
enum DateFormat {
diff --git a/libs/ardour/ardour/export_format_base.h b/libs/ardour/ardour/export_format_base.h
index a21c977833..7f09d148fe 100644
--- a/libs/ardour/ardour/export_format_base.h
+++ b/libs/ardour/ardour/export_format_base.h
@@ -30,6 +30,7 @@
#include <samplerate.h>
#include "pbd/signals.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "audiographer/general/sample_format_converter.h"
@@ -37,7 +38,7 @@
namespace ARDOUR
{
-class ExportFormatBase {
+class LIBARDOUR_API ExportFormatBase {
public:
enum Type {
@@ -113,7 +114,7 @@ class ExportFormatBase {
};
/// Class for managing selection and compatibility states
- class SelectableCompatible {
+ class LIBARDOUR_API SelectableCompatible {
public:
SelectableCompatible ()
: _selected (false), _compatible (true) { }
diff --git a/libs/ardour/ardour/export_format_compatibility.h b/libs/ardour/ardour/export_format_compatibility.h
index a220e4e4a2..6f6e367ae0 100644
--- a/libs/ardour/ardour/export_format_compatibility.h
+++ b/libs/ardour/ardour/export_format_compatibility.h
@@ -28,7 +28,7 @@ namespace ARDOUR
{
/// Allows adding to all sets. A format should be able to test if it is compatible with this
-class ExportFormatCompatibility : public ExportFormatBase, public ExportFormatBase::SelectableCompatible {
+class LIBARDOUR_API ExportFormatCompatibility : public ExportFormatBase, public ExportFormatBase::SelectableCompatible {
private:
public:
diff --git a/libs/ardour/ardour/export_format_manager.h b/libs/ardour/ardour/export_format_manager.h
index 2b5d0ad804..dad7d84b72 100644
--- a/libs/ardour/ardour/export_format_manager.h
+++ b/libs/ardour/ardour/export_format_manager.h
@@ -39,7 +39,7 @@ class ExportFormatCompatibility;
class ExportFormatSpecification;
class AnyTime;
-class ExportFormatManager : public PBD::ScopedConnectionList
+class LIBARDOUR_API ExportFormatManager : public PBD::ScopedConnectionList
{
public:
@@ -100,6 +100,8 @@ class ExportFormatManager : public PBD::ScopedConnectionList
void select_with_cue (bool);
void select_with_toc (bool);
+ void select_upload (bool);
+ void set_command (std::string);
void select_src_quality (ExportFormatBase::SRCQuality value);
void select_trim_beginning (bool value);
void select_silence_beginning (AnyTime const & time);
diff --git a/libs/ardour/ardour/export_format_specification.h b/libs/ardour/ardour/export_format_specification.h
index fc03eb94b0..2a62d792f0 100644
--- a/libs/ardour/ardour/export_format_specification.h
+++ b/libs/ardour/ardour/export_format_specification.h
@@ -25,6 +25,7 @@
#include "pbd/uuid.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/export_format_base.h"
@@ -37,7 +38,7 @@ class ExportFormat;
class ExportFormatCompatibility;
class Session;
-class ExportFormatSpecification : public ExportFormatBase {
+class LIBARDOUR_API ExportFormatSpecification : public ExportFormatBase {
private:
@@ -95,6 +96,8 @@ class ExportFormatSpecification : public ExportFormatBase {
void set_tag (bool tag_it) { _tag = tag_it; }
void set_with_cue (bool yn) { _with_cue = yn; }
void set_with_toc (bool yn) { _with_toc = yn; }
+ void set_soundcloud_upload (bool yn) { _soundcloud_upload = yn; }
+ void set_command (std::string command) { _command = command; }
void set_silence_beginning (AnyTime const & value) { _silence_beginning = value; }
void set_silence_end (AnyTime const & value) { _silence_end = value; }
@@ -124,6 +127,8 @@ class ExportFormatSpecification : public ExportFormatBase {
float normalize_target () const { return _normalize_target; }
bool with_toc() const { return _with_toc; }
bool with_cue() const { return _with_cue; }
+ bool soundcloud_upload() const { return _soundcloud_upload; }
+ std::string command() const { return _command; }
bool tag () const { return _tag && supports_tagging; }
@@ -173,6 +178,8 @@ class ExportFormatSpecification : public ExportFormatBase {
float _normalize_target;
bool _with_toc;
bool _with_cue;
+ bool _soundcloud_upload;
+ std::string _command;
/* serialization helpers */
diff --git a/libs/ardour/ardour/export_formats.h b/libs/ardour/ardour/export_formats.h
index 0e9a93ff96..076bb90d3d 100644
--- a/libs/ardour/ardour/export_formats.h
+++ b/libs/ardour/ardour/export_formats.h
@@ -33,13 +33,13 @@
namespace ARDOUR
{
-class ExportFormatIncompatible : public failed_constructor {
+class LIBARDOUR_API ExportFormatIncompatible : public failed_constructor {
public:
virtual const char *what() const throw() { return "Export format constructor failed: Format incompatible with system"; }
};
/// Base class for formats
-class ExportFormat : public ExportFormatBase, public ExportFormatBase::SelectableCompatible {
+class LIBARDOUR_API ExportFormat : public ExportFormatBase, public ExportFormatBase::SelectableCompatible {
public:
ExportFormat () {};
@@ -86,7 +86,7 @@ class ExportFormat : public ExportFormatBase, public ExportFormatBase::Selectabl
};
/// Class to be inherited by export formats that have a selectable sample format
-class HasSampleFormat : public PBD::ScopedConnectionList {
+class LIBARDOUR_API HasSampleFormat : public PBD::ScopedConnectionList {
public:
class SampleFormatState : public ExportFormatBase::SelectableCompatible {
@@ -156,7 +156,7 @@ class HasSampleFormat : public PBD::ScopedConnectionList {
ExportFormatBase::SampleFormatSet & _sample_formats;
};
-class ExportFormatLinear : public ExportFormat, public HasSampleFormat {
+class LIBARDOUR_API ExportFormatLinear : public ExportFormat, public HasSampleFormat {
public:
ExportFormatLinear (std::string name, FormatId format_id);
@@ -174,7 +174,7 @@ class ExportFormatLinear : public ExportFormat, public HasSampleFormat {
SampleFormat _default_sample_format;
};
-class ExportFormatOggVorbis : public ExportFormat {
+class LIBARDOUR_API ExportFormatOggVorbis : public ExportFormat {
public:
ExportFormatOggVorbis ();
~ExportFormatOggVorbis () {};
@@ -185,7 +185,7 @@ class ExportFormatOggVorbis : public ExportFormat {
virtual bool supports_tagging () const { return true; }
};
-class ExportFormatFLAC : public ExportFormat, public HasSampleFormat {
+class LIBARDOUR_API ExportFormatFLAC : public ExportFormat, public HasSampleFormat {
public:
ExportFormatFLAC ();
~ExportFormatFLAC () {};
@@ -198,7 +198,7 @@ class ExportFormatFLAC : public ExportFormat, public HasSampleFormat {
virtual bool supports_tagging () const { return true; }
};
-class ExportFormatBWF : public ExportFormat, public HasSampleFormat {
+class LIBARDOUR_API ExportFormatBWF : public ExportFormat, public HasSampleFormat {
public:
ExportFormatBWF ();
~ExportFormatBWF () {};
diff --git a/libs/ardour/ardour/export_graph_builder.h b/libs/ardour/ardour/export_graph_builder.h
index 07e866475a..40960b2b38 100644
--- a/libs/ardour/ardour/export_graph_builder.h
+++ b/libs/ardour/ardour/export_graph_builder.h
@@ -48,7 +48,7 @@ namespace ARDOUR
class ExportTimespan;
class Session;
-class ExportGraphBuilder
+class LIBARDOUR_API ExportGraphBuilder
{
private:
typedef ExportHandler::FileSpec FileSpec;
diff --git a/libs/ardour/ardour/export_handler.h b/libs/ardour/ardour/export_handler.h
index d4dd5627f7..8336cea732 100644
--- a/libs/ardour/ardour/export_handler.h
+++ b/libs/ardour/ardour/export_handler.h
@@ -29,7 +29,9 @@
#include "ardour/export_pointers.h"
#include "ardour/session.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
+#include "pbd/signals.h"
namespace AudioGrapher {
class BroadcastInfo;
@@ -45,7 +47,7 @@ class ExportFilename;
class ExportGraphBuilder;
class Location;
-class ExportElementFactory
+class LIBARDOUR_API ExportElementFactory
{
public:
@@ -67,7 +69,7 @@ class ExportElementFactory
Session & session;
};
-class ExportHandler : public ExportElementFactory
+class LIBARDOUR_API ExportHandler : public ExportElementFactory, public sigc::trackable
{
public:
struct FileSpec {
@@ -94,6 +96,8 @@ class ExportHandler : public ExportElementFactory
friend boost::shared_ptr<ExportHandler> Session::get_export_handler();
ExportHandler (Session & session);
+ void command_output(std::string output, size_t size);
+
public:
~ExportHandler ();
@@ -104,6 +108,18 @@ class ExportHandler : public ExportElementFactory
std::string get_cd_marker_filename(std::string filename, CDMarkerFormat format);
+ /** signal emitted when soundcloud export reports progress updates during upload.
+ * The parameters are total and current bytes downloaded, and the current filename
+ */
+ PBD::Signal3<void, double, double, std::string> SoundcloudProgress;
+
+ /* upload credentials & preferences */
+ std::string soundcloud_username;
+ std::string soundcloud_password;
+ bool soundcloud_make_public;
+ bool soundcloud_open_page;
+ bool soundcloud_downloadable;
+
private:
void handle_duplicate_format_extensions();
diff --git a/libs/ardour/ardour/export_pointers.h b/libs/ardour/ardour/export_pointers.h
index edd7f91325..ee29f0ee4c 100644
--- a/libs/ardour/ardour/export_pointers.h
+++ b/libs/ardour/ardour/export_pointers.h
@@ -25,6 +25,7 @@
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
+#include "ardour/libardour_visibility.h"
#include "ardour/comparable_shared_ptr.h"
namespace AudioGrapher {
diff --git a/libs/ardour/ardour/export_preset.h b/libs/ardour/ardour/export_preset.h
index b24cc70dcf..b11ab75bab 100644
--- a/libs/ardour/ardour/export_preset.h
+++ b/libs/ardour/ardour/export_preset.h
@@ -26,12 +26,14 @@
#include "pbd/uuid.h"
#include "pbd/xml++.h"
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR
{
class Session;
-class ExportPreset {
+class LIBARDOUR_API ExportPreset {
public:
ExportPreset (std::string filename, Session & s);
~ExportPreset ();
diff --git a/libs/ardour/ardour/export_profile_manager.h b/libs/ardour/ardour/export_profile_manager.h
index 424e0fe163..2757795ff3 100644
--- a/libs/ardour/ardour/export_profile_manager.h
+++ b/libs/ardour/ardour/export_profile_manager.h
@@ -35,6 +35,7 @@
#include "ardour/filesystem_paths.h"
#include "ardour/location.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/export_handler.h"
@@ -46,7 +47,7 @@ class Location;
class Session;
/// Manages (de)serialization of export profiles and related classes
-class ExportProfileManager
+class LIBARDOUR_API ExportProfileManager
{
public:
@@ -102,7 +103,7 @@ class ExportProfileManager
std::vector<std::string> find_file (std::string const & pattern);
std::string export_config_dir;
- PBD::SearchPath search_path;
+ PBD::Searchpath search_path;
/* Timespans */
public:
diff --git a/libs/ardour/ardour/export_status.h b/libs/ardour/ardour/export_status.h
index 31027269f8..6a5be177e4 100644
--- a/libs/ardour/ardour/export_status.h
+++ b/libs/ardour/ardour/export_status.h
@@ -23,6 +23,7 @@
#include <stdint.h>
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "pbd/signals.h"
@@ -30,7 +31,7 @@
namespace ARDOUR
{
-class ExportStatus {
+class LIBARDOUR_API ExportStatus {
public:
ExportStatus ();
void init ();
diff --git a/libs/ardour/ardour/export_timespan.h b/libs/ardour/ardour/export_timespan.h
index 5cb32dbb1a..754335ba48 100644
--- a/libs/ardour/ardour/export_timespan.h
+++ b/libs/ardour/ardour/export_timespan.h
@@ -25,6 +25,7 @@
#include <boost/shared_ptr.hpp>
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
namespace ARDOUR
@@ -34,7 +35,7 @@ class ExportStatus;
class ExportChannel;
class ExportTempFile;
-class ExportTimespan
+class LIBARDOUR_API ExportTimespan
{
private:
typedef boost::shared_ptr<ExportStatus> ExportStatusPtr;
diff --git a/libs/ardour/ardour/file_source.h b/libs/ardour/ardour/file_source.h
index 8eebfeac4e..8b8adfeb66 100644
--- a/libs/ardour/ardour/file_source.h
+++ b/libs/ardour/ardour/file_source.h
@@ -28,7 +28,7 @@
namespace ARDOUR {
-class MissingSource : public std::exception
+class LIBARDOUR_API MissingSource : public std::exception
{
public:
MissingSource (const std::string& p, DataType t) throw ()
@@ -42,7 +42,7 @@ class MissingSource : public std::exception
};
/** A source associated with a file on disk somewhere */
-class FileSource : virtual public Source {
+class LIBARDOUR_API FileSource : virtual public Source {
public:
virtual ~FileSource ();
@@ -80,7 +80,7 @@ public:
virtual void set_path (const std::string&);
- static PBD::Signal3<int,std::string,std::string,std::vector<std::string> > AmbiguousFileName;
+ static PBD::Signal2<int,std::string,std::vector<std::string> > AmbiguousFileName;
void existence_check ();
virtual void prevent_deletion ();
diff --git a/libs/ardour/ardour/filename_extensions.h b/libs/ardour/ardour/filename_extensions.h
index a7c9274c4a..c0725932fa 100644
--- a/libs/ardour/ardour/filename_extensions.h
+++ b/libs/ardour/ardour/filename_extensions.h
@@ -21,17 +21,19 @@
#ifndef __ardour_filename_extensions_h__
#define __ardour_filename_extensions_h__
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
-extern const char* const template_suffix;
-extern const char* const statefile_suffix;
-extern const char* const pending_suffix;
-extern const char* const peakfile_suffix;
-extern const char* const backup_suffix;
-extern const char* const temp_suffix;
-extern const char* const history_suffix;
-extern const char* const export_preset_suffix;
-extern const char* const export_format_suffix;
+ LIBARDOUR_API extern const char* const template_suffix;
+ LIBARDOUR_API extern const char* const statefile_suffix;
+ LIBARDOUR_API extern const char* const pending_suffix;
+ LIBARDOUR_API extern const char* const peakfile_suffix;
+ LIBARDOUR_API extern const char* const backup_suffix;
+ LIBARDOUR_API extern const char* const temp_suffix;
+ LIBARDOUR_API extern const char* const history_suffix;
+ LIBARDOUR_API extern const char* const export_preset_suffix;
+ LIBARDOUR_API extern const char* const export_format_suffix;
}
diff --git a/libs/ardour/ardour/filesystem_paths.h b/libs/ardour/ardour/filesystem_paths.h
index cfeb633597..a6ca2d1c77 100644
--- a/libs/ardour/ardour/filesystem_paths.h
+++ b/libs/ardour/ardour/filesystem_paths.h
@@ -22,6 +22,8 @@
#include "pbd/search_path.h"
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
/**
@@ -29,27 +31,41 @@ namespace ARDOUR {
* configuration files.
* @post user_config_directory() exists
*/
- std::string user_config_directory ();
+ LIBARDOUR_API std::string user_config_directory ();
+
+ /**
+ * @return the path to the directory used to store user specific
+ * caches (e.g. plugin indices, blacklist/whitelist)
+ * it defaults to XDG_CACHE_HOME
+ */
+ LIBARDOUR_API std::string user_cache_directory ();
+
/**
* @return the path to the directory that contains the system wide ardour
* modules.
*/
- std::string ardour_dll_directory ();
+ LIBARDOUR_API std::string ardour_dll_directory ();
/**
* @return the search path to be used when looking for per-system
* configuration files. This may include user configuration files.
*/
- PBD::SearchPath ardour_config_search_path ();
+ LIBARDOUR_API PBD::Searchpath ardour_config_search_path ();
/**
* @return the search path to be used when looking for data files
* that could be shared by systems (h/w and configuration independent
* files, such as icons, XML files, etc)
*/
- PBD::SearchPath ardour_data_search_path ();
+ LIBARDOUR_API PBD::Searchpath ardour_data_search_path ();
+#ifdef PLATFORM_WINDOWS
+ /**
+ * @return our 'Windows' search path ( corresponds to <install_dir>/share/ardour3 )
+ */
+ LIBARDOUR_API PBD::Searchpath windows_search_path ();
+#endif
} // namespace ARDOUR
#endif
diff --git a/libs/ardour/ardour/filter.h b/libs/ardour/ardour/filter.h
index a9cdc893a6..2b6476c49f 100644
--- a/libs/ardour/ardour/filter.h
+++ b/libs/ardour/ardour/filter.h
@@ -23,6 +23,7 @@
#include <vector>
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
namespace ARDOUR {
@@ -31,7 +32,7 @@ class Region;
class Session;
class Progress;
-class Filter {
+class LIBARDOUR_API Filter {
public:
virtual ~Filter() {}
diff --git a/libs/ardour/ardour/graph.h b/libs/ardour/ardour/graph.h
index 763723c792..b433580a54 100644
--- a/libs/ardour/ardour/graph.h
+++ b/libs/ardour/ardour/graph.h
@@ -33,6 +33,7 @@
#include "pbd/semutils.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/audio_backend.h"
#include "ardour/session_handle.h"
@@ -52,7 +53,7 @@ typedef boost::shared_ptr<GraphNode> node_ptr_t;
typedef std::list< node_ptr_t > node_list_t;
typedef std::set< node_ptr_t > node_set_t;
-class Graph : public SessionHandleRef
+class LIBARDOUR_API Graph : public SessionHandleRef
{
public:
Graph (Session & session);
diff --git a/libs/ardour/ardour/graphnode.h b/libs/ardour/ardour/graphnode.h
index 9e0182300f..55867eac4c 100644
--- a/libs/ardour/ardour/graphnode.h
+++ b/libs/ardour/ardour/graphnode.h
@@ -38,7 +38,7 @@ typedef std::set< node_ptr_t > node_set_t;
typedef std::list< node_ptr_t > node_list_t;
/** A node on our processing graph, ie a Route */
-class GraphNode
+class LIBARDOUR_API GraphNode
{
public:
GraphNode( boost::shared_ptr<Graph> Graph );
diff --git a/libs/ardour/ardour/iec1ppmdsp.h b/libs/ardour/ardour/iec1ppmdsp.h
index 0fe11681b1..b6f1501db7 100644
--- a/libs/ardour/ardour/iec1ppmdsp.h
+++ b/libs/ardour/ardour/iec1ppmdsp.h
@@ -20,8 +20,9 @@
#ifndef __IEC1PPMDSP_H
#define __IEC1PPMDSP_H
+#include "ardour/libardour_visibility.h"
-class Iec1ppmdsp
+class LIBARDOUR_API Iec1ppmdsp
{
public:
diff --git a/libs/ardour/ardour/iec2ppmdsp.h b/libs/ardour/ardour/iec2ppmdsp.h
index 8e26dd9e74..6a3852da1d 100644
--- a/libs/ardour/ardour/iec2ppmdsp.h
+++ b/libs/ardour/ardour/iec2ppmdsp.h
@@ -20,8 +20,9 @@
#ifndef __IEC2PPMDSP_H
#define __IEC2PPMDSP_H
+#include "ardour/libardour_visibility.h"
-class Iec2ppmdsp
+class LIBARDOUR_API Iec2ppmdsp
{
public:
diff --git a/libs/ardour/ardour/import_status.h b/libs/ardour/ardour/import_status.h
index c261b7a960..4dbf8f8456 100644
--- a/libs/ardour/ardour/import_status.h
+++ b/libs/ardour/ardour/import_status.h
@@ -26,11 +26,12 @@
#include <stdint.h>
#include "ardour/interthread_info.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
namespace ARDOUR {
-class ImportStatus : public InterThreadInfo {
+class LIBARDOUR_API ImportStatus : public InterThreadInfo {
public:
std::string doing_what;
diff --git a/libs/ardour/ardour/importable_source.h b/libs/ardour/ardour/importable_source.h
index fc695d88c1..9463f0b28b 100644
--- a/libs/ardour/ardour/importable_source.h
+++ b/libs/ardour/ardour/importable_source.h
@@ -21,11 +21,12 @@
#define __ardour_importable_source_h__
#include "pbd/failed_constructor.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
namespace ARDOUR {
-class ImportableSource {
+class LIBARDOUR_API ImportableSource {
public:
ImportableSource () {}
virtual ~ImportableSource() {}
diff --git a/libs/ardour/ardour/instrument_info.h b/libs/ardour/ardour/instrument_info.h
index 8691db24e5..745e4803c0 100644
--- a/libs/ardour/ardour/instrument_info.h
+++ b/libs/ardour/ardour/instrument_info.h
@@ -28,19 +28,22 @@
#include "evoral/Parameter.hpp"
+#include "midi++/libmidi_visibility.h"
+#include "ardour/libardour_visibility.h"
+
namespace MIDI {
-namespace Name {
-class ChannelNameSet;
-class Patch;
-typedef std::list<boost::shared_ptr<Patch> > PatchNameList;
-}
+ namespace Name {
+ class ChannelNameSet;
+ class Patch;
+ typedef std::list<boost::shared_ptr<Patch> > PatchNameList;
+ }
}
namespace ARDOUR {
class Processor;
-class InstrumentInfo {
+class LIBARDOUR_API InstrumentInfo {
public:
InstrumentInfo();
~InstrumentInfo ();
diff --git a/libs/ardour/ardour/internal_return.h b/libs/ardour/ardour/internal_return.h
index 4d2b32f031..d12b330e37 100644
--- a/libs/ardour/ardour/internal_return.h
+++ b/libs/ardour/ardour/internal_return.h
@@ -29,7 +29,7 @@ namespace ARDOUR {
class InternalSend;
-class InternalReturn : public Return
+class LIBARDOUR_API InternalReturn : public Return
{
public:
InternalReturn (Session&);
diff --git a/libs/ardour/ardour/internal_send.h b/libs/ardour/ardour/internal_send.h
index ea3d645754..6feeb35c6d 100644
--- a/libs/ardour/ardour/internal_send.h
+++ b/libs/ardour/ardour/internal_send.h
@@ -25,10 +25,10 @@
namespace ARDOUR {
-class InternalSend : public Send
+class LIBARDOUR_API InternalSend : public Send
{
public:
- InternalSend (Session&, boost::shared_ptr<Pannable>, boost::shared_ptr<MuteMaster>, boost::shared_ptr<Route> send_to, Delivery::Role role = Delivery::Aux, bool ignore_bitslot = false);
+ InternalSend (Session&, boost::shared_ptr<Pannable>, boost::shared_ptr<MuteMaster>, boost::shared_ptr<Route> send_from, boost::shared_ptr<Route> send_to, Delivery::Role role = Delivery::Aux, bool ignore_bitslot = false);
virtual ~InternalSend ();
std::string display_name() const;
@@ -46,6 +46,7 @@ class InternalSend : public Send
bool configure_io (ChanCount in, ChanCount out);
int set_block_size (pframes_t);
+ boost::shared_ptr<Route> source_route() const { return _send_from; }
boost::shared_ptr<Route> target_route() const { return _send_to; }
const PBD::ID& target_id() const { return _send_to_id; }
@@ -60,6 +61,7 @@ class InternalSend : public Send
private:
BufferSet mixbufs;
+ boost::shared_ptr<Route> _send_from;
boost::shared_ptr<Route> _send_to;
PBD::ID _send_to_id;
PBD::ScopedConnection connect_c;
diff --git a/libs/ardour/ardour/interpolation.h b/libs/ardour/ardour/interpolation.h
index a4a332c8a2..64b0431e0f 100644
--- a/libs/ardour/ardour/interpolation.h
+++ b/libs/ardour/ardour/interpolation.h
@@ -20,6 +20,7 @@
#include <math.h>
#include <samplerate.h>
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#ifndef __interpolation_h__
@@ -27,7 +28,7 @@
namespace ARDOUR {
-class Interpolation {
+class LIBARDOUR_API Interpolation {
protected:
double _speed;
double _target_speed;
@@ -57,12 +58,12 @@ public:
}
};
-class LinearInterpolation : public Interpolation {
+class LIBARDOUR_API LinearInterpolation : public Interpolation {
public:
framecnt_t interpolate (int channel, framecnt_t nframes, Sample* input, Sample* output);
};
-class CubicInterpolation : public Interpolation {
+class LIBARDOUR_API CubicInterpolation : public Interpolation {
public:
framecnt_t interpolate (int channel, framecnt_t nframes, Sample* input, Sample* output);
};
diff --git a/libs/ardour/ardour/interthread_info.h b/libs/ardour/ardour/interthread_info.h
index 01cacf437c..49055de5d0 100644
--- a/libs/ardour/ardour/interthread_info.h
+++ b/libs/ardour/ardour/interthread_info.h
@@ -22,6 +22,7 @@
#include <pthread.h>
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/process_thread.h"
@@ -29,7 +30,7 @@ namespace ARDOUR {
class InterThreadInfo {
public:
- InterThreadInfo () : done (false), cancel (false), progress (0), thread (0) {}
+ InterThreadInfo () : done (false), cancel (false), progress (0), thread () {}
volatile bool done;
volatile bool cancel;
diff --git a/libs/ardour/ardour/io.h b/libs/ardour/ardour/io.h
index adad0c753f..9afd0167e3 100644
--- a/libs/ardour/ardour/io.h
+++ b/libs/ardour/ardour/io.h
@@ -23,7 +23,6 @@
#include <string>
#include <vector>
#include <cmath>
-#include <jack/jack.h>
#include <glibmm/threads.h>
@@ -40,6 +39,7 @@
#include "ardour/latent.h"
#include "ardour/port_set.h"
#include "ardour/session_object.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/utils.h"
#include "ardour/buffer_set.h"
@@ -64,7 +64,7 @@ class UserBundle;
* An IO can contain ports of varying types, making routes/inserts/etc with
* varied combinations of types (eg MIDI and audio) possible.
*/
-class IO : public SessionObject, public Latent
+class LIBARDOUR_API IO : public SessionObject, public Latent
{
public:
static const std::string state_node_name;
diff --git a/libs/ardour/ardour/io_processor.h b/libs/ardour/ardour/io_processor.h
index 7adfab2225..a2735453a7 100644
--- a/libs/ardour/ardour/io_processor.h
+++ b/libs/ardour/ardour/io_processor.h
@@ -40,7 +40,7 @@ class Route;
/** A mixer strip element (Processor) with 1 or 2 IO elements.
*/
-class IOProcessor : public Processor
+class LIBARDOUR_API IOProcessor : public Processor
{
public:
IOProcessor (Session&, bool with_input, bool with_output,
diff --git a/libs/ardour/ardour/jack_utils.h b/libs/ardour/ardour/jack_utils.h
new file mode 100644
index 0000000000..40eb30f9ea
--- /dev/null
+++ b/libs/ardour/ardour/jack_utils.h
@@ -0,0 +1,253 @@
+/*
+ Copyright (C) 2011 Tim Mayberry
+
+ 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.
+
+*/
+
+#include <stdint.h>
+
+#include <vector>
+#include <map>
+#include <string>
+
+namespace ARDOUR {
+
+ // Names for the drivers on all possible systems
+ extern const char * const portaudio_driver_name;
+ extern const char * const coreaudio_driver_name;
+ extern const char * const alsa_driver_name;
+ extern const char * const oss_driver_name;
+ extern const char * const freebob_driver_name;
+ extern const char * const ffado_driver_name;
+ extern const char * const netjack_driver_name;
+ extern const char * const dummy_driver_name;
+
+ /**
+ * Get a list of possible JACK audio driver names based on platform
+ */
+ void get_jack_audio_driver_names (std::vector<std::string>& driver_names);
+
+ /**
+ * Get the default JACK audio driver based on platform
+ */
+ void get_jack_default_audio_driver_name (std::string& driver_name);
+
+ /**
+ * Get a list of possible JACK midi driver names based on platform
+ */
+ void get_jack_midi_system_names (const std::string& driver, std::vector<std::string>& driver_names);
+
+ /**
+ * Get the default JACK midi driver based on platform
+ */
+ void get_jack_default_midi_system_name (const std::string& driver_name, std::string& midi_system);
+
+ /**
+ * Get a list of possible samplerates supported be JACK
+ */
+ void get_jack_sample_rate_strings (std::vector<std::string>& sample_rates);
+
+ /**
+ * @return The default samplerate
+ */
+ std::string get_jack_default_sample_rate ();
+
+ /**
+ * @return true if sample rate string was able to be converted
+ */
+ bool get_jack_sample_rate_value_from_string (const std::string& srs, uint32_t& srv);
+
+ /**
+ * Get a list of possible period sizes supported be JACK
+ */
+ void get_jack_period_size_strings (std::vector<std::string>& samplerates);
+
+ /**
+ * @return The default period size
+ */
+ std::string get_jack_default_period_size ();
+
+ /**
+ * @return true if period size string was able to be converted
+ */
+ bool get_jack_period_size_value_from_string (const std::string& pss, uint32_t& psv);
+
+ /**
+ * These are driver specific I think, so it may require a driver arg
+ * in future
+ */
+ void get_jack_dither_mode_strings (const std::string& driver, std::vector<std::string>& dither_modes);
+
+ /**
+ * @return The default dither mode
+ */
+ std::string get_jack_default_dither_mode (const std::string& driver);
+
+ /**
+ * @return Estimate of latency
+ *
+ * API matches current use in GUI
+ */
+ std::string get_jack_latency_string (std::string samplerate, float periods, std::string period_size);
+
+ /**
+ * @return true if a JACK server is running
+ */
+ bool jack_server_running ();
+
+ /**
+ * Key being a readable name to display in a GUI
+ * Value being name used in a jack commandline
+ */
+ typedef std::map<std::string, std::string> device_map_t;
+
+ /**
+ * Use library specific code to find out what what devices exist for a given
+ * driver that might work in JACK. There is no easy way to find out what
+ * modules the JACK server supports so guess based on platform. For instance
+ * portaudio is cross-platform but we only return devices if built for
+ * windows etc
+ */
+ void get_jack_alsa_device_names (device_map_t& devices);
+ void get_jack_portaudio_device_names (device_map_t& devices);
+ void get_jack_coreaudio_device_names (device_map_t& devices);
+ void get_jack_oss_device_names (device_map_t& devices);
+ void get_jack_freebob_device_names (device_map_t& devices);
+ void get_jack_ffado_device_names (device_map_t& devices);
+ void get_jack_netjack_device_names (device_map_t& devices);
+ void get_jack_dummy_device_names (device_map_t& devices);
+
+ /*
+ * @return true if there were devices found for the driver
+ *
+ * @param driver The driver name returned by get_jack_audio_driver_names
+ * @param devices The map used to insert the drivers into, devices will be cleared before
+ * adding the available drivers
+ */
+ bool get_jack_device_names_for_audio_driver (const std::string& driver, device_map_t& devices);
+
+ /*
+ * @return a list of readable device names for a specific driver.
+ */
+ std::vector<std::string> get_jack_device_names_for_audio_driver (const std::string& driver);
+
+ /**
+ * @return true if the driver supports playback and recording
+ * on separate devices
+ */
+ bool get_jack_audio_driver_supports_two_devices (const std::string& driver);
+
+ bool get_jack_audio_driver_supports_latency_adjustment (const std::string& driver);
+
+ bool get_jack_audio_driver_supports_setting_period_count (const std::string& driver);
+
+ /**
+ * The possible names to use to try and find servers, this includes
+ * any file extensions like .exe on Windows
+ *
+ * @return true if the JACK application names for this platform could be guessed
+ */
+ bool get_jack_server_application_names (std::vector<std::string>& server_names);
+
+ /**
+ * Sets the PATH environment variable to contain directories likely to contain
+ * JACK servers so that if the JACK server is auto-started it can find the server
+ * executable.
+ *
+ * This is only modifies PATH on the mac at the moment.
+ */
+ void set_path_env_for_jack_autostart (const std::vector<std::string>&);
+
+ /**
+ * Get absolute paths to directories that might contain JACK servers on the system
+ *
+ * @return true if !server_paths.empty()
+ */
+ bool get_jack_server_dir_paths (std::vector<std::string>& server_dir_paths);
+
+ /**
+ * Get absolute paths to JACK servers on the system
+ *
+ * @return true if a server was found
+ */
+ bool get_jack_server_paths (const std::vector<std::string>& server_dir_paths,
+ const std::vector<std::string>& server_names,
+ std::vector<std::string>& server_paths);
+
+
+ bool get_jack_server_paths (std::vector<std::string>& server_paths);
+
+ /**
+ * Get absolute path to default JACK server
+ */
+ bool get_jack_default_server_path (std::string& server_path);
+
+ /**
+ * @return The name of the jack server config file
+ */
+ std::string get_jack_server_config_file_name ();
+
+ std::string get_jack_server_user_config_dir_path ();
+
+ std::string get_jack_server_user_config_file_path ();
+
+ bool write_jack_config_file (const std::string& config_file_path, const std::string& command_line);
+
+ struct JackCommandLineOptions {
+
+ // see implementation for defaults
+ JackCommandLineOptions ();
+
+ //operator bool
+ //operator ostream
+
+ std::string server_path;
+ uint32_t timeout;
+ bool no_mlock;
+ uint32_t ports_max;
+ bool realtime;
+ uint32_t priority;
+ bool unlock_gui_libs;
+ bool verbose;
+ bool temporary;
+ bool playback_only;
+ bool capture_only;
+ std::string driver;
+ std::string input_device;
+ std::string output_device;
+ uint32_t num_periods;
+ uint32_t period_size;
+ uint32_t samplerate;
+ uint32_t input_latency;
+ uint32_t output_latency;
+ bool hardware_metering;
+ bool hardware_monitoring;
+ std::string dither_mode;
+ bool force16_bit;
+ bool soft_mode;
+ std::string midi_driver;
+ };
+
+ /**
+ * @return true if able to build a valid command line based on options
+ */
+ bool get_jack_command_line_string (const JackCommandLineOptions& options, std::string& command_line);
+
+ /**
+ * We don't need this at the moment because the gui stores all its settings
+ */
+ //std::string get_jack_command_line_from_config_file (const std::string& config_file_path);
+}
diff --git a/libs/ardour/ardour/kmeterdsp.h b/libs/ardour/ardour/kmeterdsp.h
index 69d1215b98..7fe2b9d11b 100644
--- a/libs/ardour/ardour/kmeterdsp.h
+++ b/libs/ardour/ardour/kmeterdsp.h
@@ -20,7 +20,9 @@
#ifndef __KMETERDSP_H
#define __KMETERDSP_H
-class Kmeterdsp
+#include "ardour/libardour_visibility.h"
+
+class LIBARDOUR_API Kmeterdsp
{
public:
diff --git a/libs/ardour/ardour/ladspa_plugin.h b/libs/ardour/ardour/ladspa_plugin.h
index 6853a1dc36..473953e221 100644
--- a/libs/ardour/ardour/ladspa_plugin.h
+++ b/libs/ardour/ardour/ladspa_plugin.h
@@ -23,12 +23,11 @@
#include <set>
#include <vector>
#include <string>
-#include <dlfcn.h>
+#include <glibmm/module.h>
#include "pbd/stateful.h"
-#include <jack/types.h>
#include "ardour/ladspa.h"
#include "ardour/plugin.h"
@@ -36,10 +35,10 @@ namespace ARDOUR {
class AudioEngine;
class Session;
-class LadspaPlugin : public ARDOUR::Plugin
+class LIBARDOUR_API LadspaPlugin : public ARDOUR::Plugin
{
public:
- LadspaPlugin (void *module, ARDOUR::AudioEngine&, ARDOUR::Session&, uint32_t index, framecnt_t sample_rate);
+ LadspaPlugin (std::string module_path, ARDOUR::AudioEngine&, ARDOUR::Session&, uint32_t index, framecnt_t sample_rate);
LadspaPlugin (const LadspaPlugin &);
~LadspaPlugin ();
@@ -122,7 +121,8 @@ class LadspaPlugin : public ARDOUR::Plugin
void connect_port (uint32_t port, float *ptr) { _descriptor->connect_port (_handle, port, ptr); }
private:
- void* _module;
+ std::string _module_path;
+ Glib::Module* _module;
const LADSPA_Descriptor* _descriptor;
LADSPA_Handle _handle;
framecnt_t _sample_rate;
@@ -134,7 +134,7 @@ class LadspaPlugin : public ARDOUR::Plugin
void find_presets ();
- void init (void *mod, uint32_t index, framecnt_t rate);
+ void init (std::string module_path, uint32_t index, framecnt_t rate);
void run_in_place (pframes_t nsamples);
void latency_compute_run ();
int set_state_2X (const XMLNode&, int version);
@@ -146,7 +146,7 @@ class LadspaPlugin : public ARDOUR::Plugin
void add_state (XMLNode *) const;
};
-class LadspaPluginInfo : public PluginInfo {
+class LIBARDOUR_API LadspaPluginInfo : public PluginInfo {
public:
LadspaPluginInfo ();
~LadspaPluginInfo () { };
diff --git a/libs/ardour/ardour/latent.h b/libs/ardour/ardour/latent.h
index c6e81c17a2..bd639a8651 100644
--- a/libs/ardour/ardour/latent.h
+++ b/libs/ardour/ardour/latent.h
@@ -20,11 +20,12 @@
#ifndef __ardour_latent_h__
#define __ardour_latent_h__
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
namespace ARDOUR {
-class Latent {
+class LIBARDOUR_API Latent {
public:
Latent() : _user_latency (0) {}
virtual ~Latent() {}
diff --git a/libs/ardour/ardour/libardour_visibility.h b/libs/ardour/ardour/libardour_visibility.h
new file mode 100644
index 0000000000..917307732c
--- /dev/null
+++ b/libs/ardour/ardour/libardour_visibility.h
@@ -0,0 +1,45 @@
+/*
+ Copyright (C) 2013 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 __libardour_libardour_visibility_h__
+#define __libardour_libardour_visibility_h__
+
+#if defined(COMPILER_MSVC)
+ #define LIBARDOUR_DLL_IMPORT __declspec(dllimport)
+ #define LIBARDOUR_DLL_EXPORT __declspec(dllexport)
+ #define LIBARDOUR_DLL_LOCAL
+#else
+ #define LIBARDOUR_DLL_IMPORT __attribute__ ((visibility ("default")))
+ #define LIBARDOUR_DLL_EXPORT __attribute__ ((visibility ("default")))
+ #define LIBARDOUR_DLL_LOCAL __attribute__ ((visibility ("hidden")))
+#endif
+
+#ifdef LIBARDOUR_STATIC // libardour is not a DLL
+#define LIBARDOUR_API
+#define LIBARDOUR_LOCAL
+#else
+ #ifdef LIBARDOUR_DLL_EXPORTS // defined if we are building the libardour DLL (instead of using it)
+ #define LIBARDOUR_API LIBARDOUR_DLL_EXPORT
+ #else
+ #define LIBARDOUR_API LIBARDOUR_DLL_IMPORT
+ #endif
+ #define LIBARDOUR_LOCAL LIBARDOUR_DLL_LOCAL
+#endif
+
+#endif /* __libardour_libardour_visibility_h__ */
diff --git a/libs/ardour/ardour/linux_vst_support.h b/libs/ardour/ardour/linux_vst_support.h
index c99c4a8cb3..8575e2a72a 100644
--- a/libs/ardour/ardour/linux_vst_support.h
+++ b/libs/ardour/ardour/linux_vst_support.h
@@ -25,44 +25,43 @@
#include <pthread.h>
#include <stdio.h>
+#include "ardour/libardour_visibility.h"
#include "ardour/vst_types.h"
/******************************************************************************************/
/*VSTFX - an engine to manage native linux VST plugins - derived from FST for Windows VSTs*/
/******************************************************************************************/
-extern void (*vstfx_error_callback)(const char *msg);
+LIBARDOUR_API extern void (*vstfx_error_callback)(const char *msg);
-void vstfx_set_error_function (void (*func)(const char *));
+LIBARDOUR_API void vstfx_set_error_function (void (*func)(const char *));
-void vstfx_error (const char *fmt, ...);
+LIBARDOUR_API void vstfx_error (const char *fmt, ...);
/*API to vstfx*/
-extern int vstfx_launch_editor (VSTState *);
-extern int vstfx_init (void *);
-extern void vstfx_exit ();
-extern VSTHandle * vstfx_load (const char*);
-extern int vstfx_unload (VSTHandle *);
-extern VSTState * vstfx_instantiate (VSTHandle *, audioMasterCallback, void *);
-extern void vstfx_close (VSTState*);
+LIBARDOUR_API extern int vstfx_launch_editor (VSTState *);
+LIBARDOUR_API extern int vstfx_init (void *);
+LIBARDOUR_API extern void vstfx_exit ();
+LIBARDOUR_API extern VSTHandle * vstfx_load (const char*);
+LIBARDOUR_API extern int vstfx_unload (VSTHandle *);
-extern int vstfx_create_editor (VSTState *);
-extern int vstfx_run_editor (VSTState *);
-extern void vstfx_destroy_editor (VSTState *);
+LIBARDOUR_API extern VSTState * vstfx_instantiate (VSTHandle *, audioMasterCallback, void *);
+LIBARDOUR_API extern void vstfx_close (VSTState*);
-extern VSTInfo * vstfx_get_info (char *);
-extern void vstfx_free_info (VSTInfo *);
-extern void vstfx_event_loop_remove_plugin (VSTState *);
-extern int vstfx_call_dispatcher (VSTState *, int, int, int, void *, float);
+LIBARDOUR_API extern int vstfx_create_editor (VSTState *);
+LIBARDOUR_API extern int vstfx_run_editor (VSTState *);
+LIBARDOUR_API extern void vstfx_destroy_editor (VSTState *);
+
+LIBARDOUR_API extern void vstfx_event_loop_remove_plugin (VSTState *);
+LIBARDOUR_API extern int vstfx_call_dispatcher (VSTState *, int, int, int, void *, float);
/** Load a plugin state from a file.**/
-extern int vstfx_load_state (VSTState* vstfx, char * filename);
+LIBARDOUR_API extern int vstfx_load_state (VSTState* vstfx, char * filename);
/** Save a plugin state to a file.**/
-extern bool vstfx_save_state (VSTState* vstfx, char * filename);
-
+LIBARDOUR_API extern bool vstfx_save_state (VSTState* vstfx, char * filename);
#endif /* __vstfx_h__ */
diff --git a/libs/ardour/ardour/location.h b/libs/ardour/ardour/location.h
index bb42df1b58..6cea208f05 100644
--- a/libs/ardour/ardour/location.h
+++ b/libs/ardour/ardour/location.h
@@ -34,11 +34,14 @@
#include "pbd/statefuldestructible.h"
#include "ardour/ardour.h"
+#include "ardour/scene_change.h"
#include "ardour/session_handle.h"
namespace ARDOUR {
-class Location : public SessionHandleRef, public PBD::StatefulDestructible
+class SceneChange;
+
+class LIBARDOUR_API Location : public SessionHandleRef, public PBD::StatefulDestructible
{
public:
enum Flags {
@@ -93,6 +96,9 @@ class Location : public SessionHandleRef, public PBD::StatefulDestructible
Flags flags () const { return _flags; }
+ boost::shared_ptr<SceneChange> scene_change() const { return _scene_change; }
+ void set_scene_change (boost::shared_ptr<SceneChange>);
+
PBD::Signal1<void,Location*> name_changed;
PBD::Signal1<void,Location*> end_changed;
PBD::Signal1<void,Location*> start_changed;
@@ -116,6 +122,8 @@ class Location : public SessionHandleRef, public PBD::StatefulDestructible
void set_position_lock_style (PositionLockStyle ps);
void recompute_frames_from_bbt ();
+ static PBD::Signal0<void> scene_changed;
+
private:
std::string _name;
framepos_t _start;
@@ -125,13 +133,14 @@ class Location : public SessionHandleRef, public PBD::StatefulDestructible
Flags _flags;
bool _locked;
PositionLockStyle _position_lock_style;
+ boost::shared_ptr<SceneChange> _scene_change;
void set_mark (bool yn);
bool set_flag_internal (bool yn, Flags flag);
void recompute_bbt_from_frames ();
};
-class Locations : public SessionHandleRef, public PBD::StatefulDestructible
+class LIBARDOUR_API Locations : public SessionHandleRef, public PBD::StatefulDestructible
{
public:
typedef std::list<Location *> LocationList;
@@ -161,6 +170,8 @@ class Locations : public SessionHandleRef, public PBD::StatefulDestructible
int set_current (Location *, bool want_lock = true);
Location *current () const { return current_location; }
+ Location* mark_at (framepos_t, framecnt_t slop = 0) const;
+
framepos_t first_mark_before (framepos_t, bool include_special_ranges = false);
framepos_t first_mark_after (framepos_t, bool include_special_ranges = false);
diff --git a/libs/ardour/ardour/location_importer.h b/libs/ardour/ardour/location_importer.h
index 332c5ae685..574b948062 100644
--- a/libs/ardour/ardour/location_importer.h
+++ b/libs/ardour/ardour/location_importer.h
@@ -33,14 +33,14 @@ namespace ARDOUR {
class Location;
class Session;
-class LocationImportHandler : public ElementImportHandler
+class LIBARDOUR_API LocationImportHandler : public ElementImportHandler
{
public:
LocationImportHandler (XMLTree const & source, Session & session);
std::string get_info () const;
};
-class LocationImporter : public ElementImporter
+class LIBARDOUR_API LocationImporter : public ElementImporter
{
public:
LocationImporter (XMLTree const & source, Session & session, LocationImportHandler & handler, XMLNode const & node);
diff --git a/libs/ardour/ardour/logcurve.h b/libs/ardour/ardour/logcurve.h
index 4c91ad9a79..2585da66c8 100644
--- a/libs/ardour/ardour/logcurve.h
+++ b/libs/ardour/ardour/logcurve.h
@@ -25,7 +25,7 @@
namespace ARDOUR {
-class LogCurve {
+class LIBARDOUR_API LogCurve {
public:
LogCurve (float steepness = 0.2, uint32_t len = 0) {
l = len;
@@ -102,7 +102,7 @@ class LogCurve {
uint32_t l;
};
-class LogCurveIn : public LogCurve
+class LIBARDOUR_API LogCurveIn : public LogCurve
{
public:
LogCurveIn (float steepness = 0.2, uint32_t len = 0)
@@ -117,7 +117,7 @@ class LogCurveIn : public LogCurve
}
};
-class LogCurveOut : public LogCurve
+class LIBARDOUR_API LogCurveOut : public LogCurve
{
public:
LogCurveOut (float steepness = 0.2, uint32_t len = 0)
diff --git a/libs/ardour/ardour/lv2_plugin.h b/libs/ardour/ardour/lv2_plugin.h
index 56aa9dc7cf..034101ee41 100644
--- a/libs/ardour/ardour/lv2_plugin.h
+++ b/libs/ardour/ardour/lv2_plugin.h
@@ -29,6 +29,8 @@
#include "ardour/worker.h"
#include "pbd/ringbuffer.h"
+typedef struct LV2_Evbuf_Impl LV2_Evbuf;
+
namespace ARDOUR {
// a callback function for lilv_state_new_from_instance(). friend of LV2Plugin
@@ -41,7 +43,7 @@ const void* lv2plugin_get_port_value(const char* port_symbol,
class AudioEngine;
class Session;
-class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
+class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
{
public:
LV2Plugin (ARDOUR::AudioEngine& engine,
@@ -270,7 +272,7 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
};
-class LV2PluginInfo : public PluginInfo {
+class LIBARDOUR_API LV2PluginInfo : public PluginInfo {
public:
LV2PluginInfo (const void* c_plugin);
~LV2PluginInfo ();
diff --git a/libs/ardour/ardour/lxvst_plugin.h b/libs/ardour/ardour/lxvst_plugin.h
index 58bc626d32..cc6f507144 100644
--- a/libs/ardour/ardour/lxvst_plugin.h
+++ b/libs/ardour/ardour/lxvst_plugin.h
@@ -30,17 +30,17 @@ namespace ARDOUR {
class AudioEngine;
class Session;
-class LXVSTPlugin : public VSTPlugin
+class LIBARDOUR_API LXVSTPlugin : public VSTPlugin
{
public:
- LXVSTPlugin (AudioEngine &, Session &, VSTHandle *);
+ LXVSTPlugin (AudioEngine &, Session &, VSTHandle *, int unique_id);
LXVSTPlugin (const LXVSTPlugin &);
~LXVSTPlugin ();
std::string state_node_name () const { return "lxvst"; }
};
-class LXVSTPluginInfo : public PluginInfo
+class LIBARDOUR_API LXVSTPluginInfo : public PluginInfo
{
public:
LXVSTPluginInfo ();
diff --git a/libs/ardour/ardour/meter.h b/libs/ardour/ardour/meter.h
index df1e381bb4..8ed1ade50d 100644
--- a/libs/ardour/ardour/meter.h
+++ b/libs/ardour/ardour/meter.h
@@ -20,6 +20,7 @@
#define __ardour_meter_h__
#include <vector>
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/processor.h"
#include "pbd/fastlog.h"
@@ -35,7 +36,7 @@ class BufferSet;
class ChanCount;
class Session;
-class Metering {
+class LIBARDOUR_API Metering {
public:
static void update_meters ();
static PBD::Signal0<void> Meter;
@@ -47,7 +48,7 @@ class Metering {
/** Meters peaks on the input and stores them for access.
*/
-class PeakMeter : public Processor {
+class LIBARDOUR_API PeakMeter : public Processor {
public:
PeakMeter(Session& s, const std::string& name);
~PeakMeter();
diff --git a/libs/ardour/ardour/midi_automation_list_binder.h b/libs/ardour/ardour/midi_automation_list_binder.h
index 89c6cdb90b..241c4e7320 100644
--- a/libs/ardour/ardour/midi_automation_list_binder.h
+++ b/libs/ardour/ardour/midi_automation_list_binder.h
@@ -27,7 +27,7 @@ class MidiSource;
class AutomationList;
/** A class for late-binding a MidiSource and a Parameter to an AutomationList */
-class MidiAutomationListBinder : public MementoCommandBinder<ARDOUR::AutomationList>
+class LIBARDOUR_API MidiAutomationListBinder : public MementoCommandBinder<ARDOUR::AutomationList>
{
public:
MidiAutomationListBinder (boost::shared_ptr<ARDOUR::MidiSource>, Evoral::Parameter);
diff --git a/libs/ardour/ardour/midi_buffer.h b/libs/ardour/ardour/midi_buffer.h
index c67eef178a..2e2cbf6504 100644
--- a/libs/ardour/ardour/midi_buffer.h
+++ b/libs/ardour/ardour/midi_buffer.h
@@ -29,7 +29,7 @@ namespace ARDOUR {
/** Buffer containing 8-bit unsigned char (MIDI) data. */
-class MidiBuffer : public Buffer
+class LIBARDOUR_API MidiBuffer : public Buffer
{
public:
typedef framepos_t TimeType;
@@ -45,23 +45,27 @@ public:
bool push_back(const Evoral::MIDIEvent<TimeType>& event);
bool push_back(TimeType time, size_t size, const uint8_t* data);
+
uint8_t* reserve(TimeType time, size_t size);
void resize(size_t);
size_t size() const { return _size; }
bool empty() const { return _size == 0; }
+ bool insert_event(const Evoral::MIDIEvent<TimeType>& event);
bool merge_in_place(const MidiBuffer &other);
template<typename BufferType, typename EventType>
- class iterator_base {
+ class iterator_base
+ {
public:
- iterator_base<BufferType, EventType>(BufferType& b, framecnt_t o)
- : buffer(&b), offset(o) {}
- iterator_base<BufferType, EventType>(const iterator_base<BufferType,EventType>& o)
- : buffer (o.buffer), offset(o.offset) {}
-
- inline iterator_base<BufferType,EventType> operator= (const iterator_base<BufferType,EventType>& o) {
+ iterator_base<BufferType, EventType>(BufferType& b, framecnt_t o)
+ : buffer(&b), offset(o) {}
+
+ iterator_base<BufferType, EventType>(const iterator_base<BufferType,EventType>& o)
+ : buffer (o.buffer), offset(o.offset) {}
+
+ inline iterator_base<BufferType,EventType> operator= (const iterator_base<BufferType,EventType>& o) {
if (&o != this) {
buffer = o.buffer;
offset = o.offset;
@@ -77,6 +81,7 @@ public:
*((TimeType*)(buffer->_data + offset)),
event_size, ev_start);
}
+
inline EventType operator*() {
uint8_t* ev_start = buffer->_data + offset + sizeof(TimeType);
int event_size = Evoral::midi_event_size(ev_start);
@@ -86,6 +91,10 @@ public:
event_size, ev_start);
}
+ inline TimeType * timeptr() {
+ return ((TimeType*)(buffer->_data + offset));
+ }
+
inline iterator_base<BufferType, EventType>& operator++() {
uint8_t* ev_start = buffer->_data + offset + sizeof(TimeType);
int event_size = Evoral::midi_event_size(ev_start);
@@ -93,12 +102,15 @@ public:
offset += sizeof(TimeType) + event_size;
return *this;
}
+
inline bool operator!=(const iterator_base<BufferType, EventType>& other) const {
return (buffer != other.buffer) || (offset != other.offset);
}
+
inline bool operator==(const iterator_base<BufferType, EventType>& other) const {
return (buffer == other.buffer) && (offset == other.offset);
}
+
BufferType* buffer;
size_t offset;
};
@@ -112,7 +124,7 @@ public:
const_iterator begin() const { return const_iterator(*this, 0); }
const_iterator end() const { return const_iterator(*this, _size); }
- iterator erase(const iterator& i) {
+ iterator erase(const iterator& i) {
assert (i.buffer == this);
uint8_t* ev_start = _data + i.offset + sizeof (TimeType);
int event_size = Evoral::midi_event_size (ev_start);
@@ -124,7 +136,7 @@ public:
size_t total_data_deleted = sizeof(TimeType) + event_size;
- if (i.offset + total_data_deleted >= _size) {
+ if (i.offset + total_data_deleted > _size) {
_size = 0;
return end();
}
@@ -155,7 +167,7 @@ public:
* its MIDI status byte.
*/
static bool second_simultaneous_midi_byte_is_first (uint8_t, uint8_t);
-
+
private:
friend class iterator_base< MidiBuffer, Evoral::MIDIEvent<TimeType> >;
friend class iterator_base< const MidiBuffer, const Evoral::MIDIEvent<TimeType> >;
@@ -164,7 +176,6 @@ private:
pframes_t _size;
};
-
} // namespace ARDOUR
#endif // __ardour_midi_buffer_h__
diff --git a/libs/ardour/ardour/midi_diskstream.h b/libs/ardour/ardour/midi_diskstream.h
index 6401554711..91fb891f17 100644
--- a/libs/ardour/ardour/midi_diskstream.h
+++ b/libs/ardour/ardour/midi_diskstream.h
@@ -52,7 +52,7 @@ class SMFSource;
class Send;
class Session;
-class MidiDiskstream : public Diskstream
+class LIBARDOUR_API MidiDiskstream : public Diskstream
{
public:
MidiDiskstream (Session &, const string& name, Diskstream::Flag f = Recordable);
@@ -76,6 +76,7 @@ class MidiDiskstream : public Diskstream
int use_copy_playlist ();
bool set_name (std::string const &);
+ bool set_write_source_name (const std::string& str);
/* stateful */
XMLNode& get_state(void);
@@ -173,6 +174,7 @@ class MidiDiskstream : public Diskstream
gint _frames_read_from_ringbuffer;
volatile gint _frames_pending_write;
volatile gint _num_captured_loops;
+ framepos_t _accumulated_capture_offset;
/** A buffer that we use to put newly-arrived MIDI data in for
the GUI to read (so that it can update itself).
diff --git a/libs/ardour/ardour/midi_model.h b/libs/ardour/ardour/midi_model.h
index 3ecfca7d1c..dc1c7af0e9 100644
--- a/libs/ardour/ardour/midi_model.h
+++ b/libs/ardour/ardour/midi_model.h
@@ -27,10 +27,12 @@
#include <boost/utility.hpp>
#include <glibmm/threads.h>
#include "pbd/command.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/midi_buffer.h"
#include "ardour/midi_ring_buffer.h"
#include "ardour/automatable_sequence.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "evoral/Note.hpp"
#include "evoral/Sequence.hpp"
@@ -47,7 +49,7 @@ class MidiSource;
* Because of this MIDI controllers and automatable controllers/widgets/etc
* are easily interchangeable.
*/
-class MidiModel : public AutomatableSequence<Evoral::MusicalTime> {
+class LIBARDOUR_API MidiModel : public AutomatableSequence<Evoral::MusicalTime> {
public:
typedef Evoral::MusicalTime TimeType;
@@ -56,7 +58,7 @@ public:
NoteMode note_mode() const { return (percussive() ? Percussive : Sustained); }
void set_note_mode(NoteMode mode) { set_percussive(mode == Percussive); };
- class DiffCommand : public Command {
+ class LIBARDOUR_API DiffCommand : public Command {
public:
DiffCommand (boost::shared_ptr<MidiModel> m, const std::string& name);
@@ -77,7 +79,7 @@ public:
};
- class NoteDiffCommand : public DiffCommand {
+ class LIBARDOUR_API NoteDiffCommand : public DiffCommand {
public:
NoteDiffCommand (boost::shared_ptr<MidiModel> m, const std::string& name) : DiffCommand (m, name) {}
@@ -143,7 +145,7 @@ public:
};
/* Currently this class only supports changes of sys-ex time, but could be expanded */
- class SysExDiffCommand : public DiffCommand {
+ class LIBARDOUR_API SysExDiffCommand : public DiffCommand {
public:
SysExDiffCommand (boost::shared_ptr<MidiModel> m, const XMLNode& node);
@@ -178,7 +180,7 @@ public:
Change unmarshal_change (XMLNode *);
};
- class PatchChangeDiffCommand : public DiffCommand {
+ class LIBARDOUR_API PatchChangeDiffCommand : public DiffCommand {
public:
PatchChangeDiffCommand (boost::shared_ptr<MidiModel>, const std::string &);
PatchChangeDiffCommand (boost::shared_ptr<MidiModel>, const XMLNode &);
@@ -220,6 +222,8 @@ public:
uint8_t new_program;
int new_bank;
};
+
+ Change() : patch_id (-1) {}
};
typedef std::list<Change> ChangeList;
diff --git a/libs/ardour/ardour/midi_operator.h b/libs/ardour/ardour/midi_operator.h
index c5def76384..00678a2831 100644
--- a/libs/ardour/ardour/midi_operator.h
+++ b/libs/ardour/ardour/midi_operator.h
@@ -32,7 +32,7 @@ namespace ARDOUR {
class MidiModel;
-class MidiOperator {
+class LIBARDOUR_API MidiOperator {
public:
MidiOperator () {}
virtual ~MidiOperator() {}
diff --git a/libs/ardour/ardour/midi_patch_manager.h b/libs/ardour/ardour/midi_patch_manager.h
index 77e63a2791..cd898aa00f 100644
--- a/libs/ardour/ardour/midi_patch_manager.h
+++ b/libs/ardour/ardour/midi_patch_manager.h
@@ -35,7 +35,7 @@ namespace MIDI
namespace Name
{
-class MidiPatchManager : public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr
+class LIBARDOUR_API MidiPatchManager : public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr
{
/// Singleton
private:
diff --git a/libs/ardour/ardour/midi_patch_search_path.h b/libs/ardour/ardour/midi_patch_search_path.h
deleted file mode 100644
index 5d27823461..0000000000
--- a/libs/ardour/ardour/midi_patch_search_path.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- Copyright (C) 2011 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_midi_patch_search_path_h__
-#define __ardour_midi_patch_search_path_h__
-
-#include "pbd/search_path.h"
-
-namespace ARDOUR {
-
- /**
- * return a SearchPath containing directories in which to look for
- * MIDI patch files ("*.midnam") aka MIDNAM files
- *
- * If ARDOUR_MIDI_PATCH_PATH is defined then the SearchPath returned
- * will contain only those directories specified in it, otherwise it will
- * contain the user and system directories which may contain control
- * surface plugins.
- */
- PBD::SearchPath midi_patch_search_path ();
-
-} // namespace ARDOUR
-
-#endif /* __ardour_midi_patch_search_path_h__ */
diff --git a/libs/ardour/ardour/midi_playlist.h b/libs/ardour/ardour/midi_playlist.h
index 543e1b353f..b118214c9e 100644
--- a/libs/ardour/ardour/midi_playlist.h
+++ b/libs/ardour/ardour/midi_playlist.h
@@ -32,12 +32,11 @@ namespace ARDOUR
{
class Session;
-class Region;
class MidiRegion;
class Source;
template<typename T> class MidiRingBuffer;
-class MidiPlaylist : public ARDOUR::Playlist
+class LIBARDOUR_API MidiPlaylist : public ARDOUR::Playlist
{
public:
MidiPlaylist (Session&, const XMLNode&, bool hidden = false);
diff --git a/libs/ardour/ardour/midi_playlist_source.h b/libs/ardour/ardour/midi_playlist_source.h
index 5e3bb0de67..7a61f5aa02 100644
--- a/libs/ardour/ardour/midi_playlist_source.h
+++ b/libs/ardour/ardour/midi_playlist_source.h
@@ -32,7 +32,7 @@ namespace ARDOUR {
class MidiPlaylist;
-class MidiPlaylistSource : public MidiSource, public PlaylistSource {
+class LIBARDOUR_API MidiPlaylistSource : public MidiSource, public PlaylistSource {
public:
virtual ~MidiPlaylistSource ();
diff --git a/libs/ardour/ardour/midi_port.h b/libs/ardour/ardour/midi_port.h
index 00617d90ec..cc9fee1b15 100644
--- a/libs/ardour/ardour/midi_port.h
+++ b/libs/ardour/ardour/midi_port.h
@@ -31,7 +31,7 @@ namespace ARDOUR {
class MidiEngine;
-class MidiPort : public Port {
+class LIBARDOUR_API MidiPort : public Port {
public:
~MidiPort();
diff --git a/libs/ardour/ardour/midi_region.h b/libs/ardour/ardour/midi_region.h
index 91e048c03e..38229b998b 100644
--- a/libs/ardour/ardour/midi_region.h
+++ b/libs/ardour/ardour/midi_region.h
@@ -34,9 +34,9 @@ namespace ARDOUR {
property, but it allows us to signal changes to the
MidiModel used by the MidiRegion
*/
- extern PBD::PropertyDescriptor<void*> midi_data;
- extern PBD::PropertyDescriptor<Evoral::MusicalTime> start_beats;
- extern PBD::PropertyDescriptor<Evoral::MusicalTime> length_beats;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<void*> midi_data;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<Evoral::MusicalTime> start_beats;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<Evoral::MusicalTime> length_beats;
}
}
@@ -53,9 +53,10 @@ class MidiFilter;
class MidiModel;
class MidiSource;
class MidiStateTracker;
+
template<typename T> class MidiRingBuffer;
-class MidiRegion : public Region
+class LIBARDOUR_API MidiRegion : public Region
{
public:
static void make_property_quarks ();
diff --git a/libs/ardour/ardour/midi_ring_buffer.h b/libs/ardour/ardour/midi_ring_buffer.h
index d5c9947b9a..78d14b9185 100644
--- a/libs/ardour/ardour/midi_ring_buffer.h
+++ b/libs/ardour/ardour/midi_ring_buffer.h
@@ -24,6 +24,7 @@
#include "evoral/EventRingBuffer.hpp"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/midi_state_tracker.h"
@@ -40,7 +41,7 @@ class MidiBuffer;
* [timestamp][type][size][size bytes of raw MIDI][timestamp][type][size](etc...)
*/
template<typename T>
-class MidiRingBuffer : public Evoral::EventRingBuffer<T> {
+class /*LIBARDOUR_API*/ MidiRingBuffer : public Evoral::EventRingBuffer<T> {
public:
/** @param size Size in bytes.
*/
diff --git a/libs/ardour/ardour/midi_scene_change.h b/libs/ardour/ardour/midi_scene_change.h
new file mode 100644
index 0000000000..1a27446367
--- /dev/null
+++ b/libs/ardour/ardour/midi_scene_change.h
@@ -0,0 +1,63 @@
+/*
+ Copyright (C) 2014 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 __libardour_midi_scene_change_h__
+#define __libardour_midi_scene_change_h__
+
+#include "evoral/PatchChange.hpp"
+
+#include "ardour/scene_change.h"
+
+namespace ARDOUR
+{
+
+class MidiPort;
+
+class MIDISceneChange : public SceneChange
+{
+ public:
+ MIDISceneChange (int channel, int bank = -1, int program = -1);
+ MIDISceneChange (const XMLNode&, int version);
+ ~MIDISceneChange ();
+
+ void set_channel (int channel);
+ void set_program (int program);
+ void set_bank (int bank);
+
+ int channel () const { return _channel; }
+ int program () const { return _program; }
+ int bank () const { return _bank; }
+
+ size_t get_bank_msb_message (uint8_t* buf, size_t size) const;
+ size_t get_bank_lsb_message (uint8_t* buf, size_t size) const;
+ size_t get_program_message (uint8_t* buf, size_t size) const;
+
+ XMLNode& get_state();
+ int set_state (const XMLNode&, int version);
+
+ private:
+ int _bank;
+ int _program;
+ uint8_t _channel;
+};
+
+} /* namespace */
+
+
+#endif /* __libardour_scene_change_h__ */
diff --git a/libs/ardour/ardour/midi_scene_changer.h b/libs/ardour/ardour/midi_scene_changer.h
new file mode 100644
index 0000000000..e2c62a2656
--- /dev/null
+++ b/libs/ardour/ardour/midi_scene_changer.h
@@ -0,0 +1,75 @@
+/*
+ Copyright (C) 2014 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 __libardour_midi_scene_changer_h__
+#define __libardour_midi_scene_changer_h__
+
+#include <glibmm/threads.h>
+
+#include "ardour/scene_changer.h"
+
+namespace ARDOUR
+{
+
+class MIDISceneChanger : public SceneChanger
+{
+ public:
+ MIDISceneChanger (Session&);
+ ~MIDISceneChanger ();
+
+ void run (framepos_t start, framepos_t end);
+ void set_input_port (MIDI::Port*);
+ void set_output_port (boost::shared_ptr<MidiPort>);
+
+ uint8_t bank_at (framepos_t, uint8_t channel);
+ uint8_t program_at (framepos_t, uint8_t channel);
+
+ void set_recording (bool);
+ void locate (framepos_t);
+
+ private:
+ typedef std::multimap<framepos_t,boost::shared_ptr<MIDISceneChange> > Scenes;
+
+ MIDI::Port* input_port;
+ boost::shared_ptr<MidiPort> output_port;
+ Glib::Threads::RWLock scene_lock;
+ Scenes scenes;
+ bool _recording;
+ framepos_t last_bank_message_time;
+ framepos_t last_program_message_time;
+ unsigned short current_bank;
+ int last_delivered_program;
+ int last_delivered_bank;
+
+ void gather ();
+ bool recording () const;
+ void jump_to (int bank, int program);
+ void rt_deliver (MidiBuffer&, framepos_t, boost::shared_ptr<MIDISceneChange>);
+ void non_rt_deliver (boost::shared_ptr<MIDISceneChange>);
+
+ void bank_change_input (MIDI::Parser&, unsigned short, int channel);
+ void program_change_input (MIDI::Parser&, MIDI::byte, int channel);
+ void locations_changed (Locations::Change);
+
+ PBD::ScopedConnectionList incoming_connections;
+};
+
+} // namespace
+
+#endif /* __libardour_midi_scene_changer_h__ */
diff --git a/libs/ardour/ardour/midi_source.h b/libs/ardour/ardour/midi_source.h
index 6a21c03856..07a32c5bfc 100644
--- a/libs/ardour/ardour/midi_source.h
+++ b/libs/ardour/ardour/midi_source.h
@@ -36,10 +36,11 @@ namespace ARDOUR {
class MidiStateTracker;
class MidiModel;
+
template<typename T> class MidiRingBuffer;
/** Source for MIDI data */
-class MidiSource : virtual public Source, public boost::enable_shared_from_this<MidiSource>
+class LIBARDOUR_API MidiSource : virtual public Source, public boost::enable_shared_from_this<MidiSource>
{
public:
typedef double TimeType;
diff --git a/libs/ardour/ardour/midi_state_tracker.h b/libs/ardour/ardour/midi_state_tracker.h
index 24d3ab73a1..046e77f38c 100644
--- a/libs/ardour/ardour/midi_state_tracker.h
+++ b/libs/ardour/ardour/midi_state_tracker.h
@@ -27,12 +27,13 @@ template <typename T> class EventSink;
}
namespace ARDOUR {
+
class MidiSource;
/** Tracks played notes, so they can be resolved in potential stuck note
* situations (e.g. looping, transport stop, etc).
*/
-class MidiStateTracker
+class LIBARDOUR_API MidiStateTracker
{
public:
MidiStateTracker();
diff --git a/libs/ardour/ardour/midi_stretch.h b/libs/ardour/ardour/midi_stretch.h
index 42b201b55a..b6f6ac5073 100644
--- a/libs/ardour/ardour/midi_stretch.h
+++ b/libs/ardour/ardour/midi_stretch.h
@@ -25,7 +25,7 @@
namespace ARDOUR {
-class MidiStretch : public Filter {
+class LIBARDOUR_API MidiStretch : public Filter {
public:
MidiStretch (ARDOUR::Session&, const TimeFXRequest&);
~MidiStretch ();
diff --git a/libs/ardour/ardour/midi_track.h b/libs/ardour/ardour/midi_track.h
index 3b75c0a51b..1acec0346e 100644
--- a/libs/ardour/ardour/midi_track.h
+++ b/libs/ardour/ardour/midi_track.h
@@ -20,6 +20,8 @@
#ifndef __ardour_midi_track_h__
#define __ardour_midi_track_h__
+#include "pbd/ffs.h"
+
#include "ardour/track.h"
#include "ardour/midi_ring_buffer.h"
@@ -33,7 +35,7 @@ class RouteGroup;
class SMFSource;
class Session;
-class MidiTrack : public Track
+class LIBARDOUR_API MidiTrack : public Track
{
public:
MidiTrack (Session&, string name, Route::Flag f = Route::Flag (0), TrackMode m = Normal);
@@ -70,7 +72,8 @@ public:
framecnt_t end_frame,
boost::shared_ptr<Processor> endpoint,
bool include_endpoint,
- bool for_export);
+ bool for_export,
+ bool for_freeze);
int set_state (const XMLNode&, int version);
@@ -183,7 +186,7 @@ private:
/* if mode is ForceChannel, force mask to the lowest set channel or 1 if no
* channels are set.
*/
-#define force_mask(mode,mask) (((mode) == ForceChannel) ? (((mask) ? (1<<(ffs((mask))-1)) : 1)) : mask)
+#define force_mask(mode,mask) (((mode) == ForceChannel) ? (((mask) ? (1<<(PBD::ffs((mask))-1)) : 1)) : mask)
void _set_playback_channel_mode(ChannelMode mode, uint16_t mask) {
mask = force_mask (mode, mask);
diff --git a/libs/ardour/ardour/midi_ui.h b/libs/ardour/ardour/midi_ui.h
index 9e46f226f7..85a8a15e21 100644
--- a/libs/ardour/ardour/midi_ui.h
+++ b/libs/ardour/ardour/midi_ui.h
@@ -22,6 +22,7 @@
#include <list>
+#define ABSTRACT_UI_EXPORTS
#include "pbd/abstract_ui.h"
#include "pbd/signals.h"
#include "pbd/stacktrace.h"
@@ -37,13 +38,13 @@ class AsyncMIDIPort;
certain types of requests to the MIDI UI
*/
-struct MidiUIRequest : public BaseUI::BaseRequestObject {
+struct LIBARDOUR_API MidiUIRequest : public BaseUI::BaseRequestObject {
public:
MidiUIRequest () { }
~MidiUIRequest() { }
};
-class MidiControlUI : public AbstractUI<MidiUIRequest>
+class LIBARDOUR_API MidiControlUI : public AbstractUI<MidiUIRequest>
{
public:
MidiControlUI (Session& s);
diff --git a/libs/ardour/ardour/mididm.h b/libs/ardour/ardour/mididm.h
new file mode 100644
index 0000000000..65ed15ab72
--- /dev/null
+++ b/libs/ardour/ardour/mididm.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2013-2014 Robin Gareus <robin@gareus.org>
+ *
+ * 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 __libardour_mididm_h__
+#define __libardour_mididm_h__
+
+#include "ardour/types.h"
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class PortEngine;
+
+class LIBARDOUR_API MIDIDM
+{
+public:
+
+ MIDIDM (framecnt_t sample_rate);
+
+ int process (pframes_t nframes, PortEngine &pe, void *midi_in, void *midi_out);
+
+ framecnt_t latency (void) { return _cnt_total > 10 ? _avg_delay : 0; }
+ framecnt_t processed (void) { return _cnt_total; }
+ double deviation (void) { return _cnt_total > 1 ? sqrt(_var_s / ((double)(_cnt_total - 1))) : 0; }
+ bool ok (void) { return _cnt_total > 200; }
+ bool have_signal (void) { return (_monotonic_cnt - _last_signal_tme) < (uint64_t) _sample_rate ; }
+
+private:
+ int64_t parse_mclk (uint8_t* buf, pframes_t timestamp) const;
+ int64_t parse_mtc (uint8_t* buf, pframes_t timestamp) const;
+
+ framecnt_t _sample_rate;
+
+ uint64_t _monotonic_cnt;
+ uint64_t _last_signal_tme;
+
+ uint64_t _cnt_total;
+ uint64_t _dly_total;
+ uint32_t _min_delay;
+ uint32_t _max_delay;
+ double _avg_delay;
+ double _var_m;
+ double _var_s;
+
+};
+
+}
+
+#endif /* __libardour_mididm_h__ */
diff --git a/libs/ardour/ardour/midiport_manager.h b/libs/ardour/ardour/midiport_manager.h
index 9f93c43d5a..5e87238c22 100644
--- a/libs/ardour/ardour/midiport_manager.h
+++ b/libs/ardour/ardour/midiport_manager.h
@@ -29,6 +29,8 @@
#include "midi++/types.h"
#include "midi++/port.h"
+#include "ardour/libardour_visibility.h"
+#include "ardour/midi_port.h"
#include "ardour/types.h"
namespace ARDOUR {
@@ -36,7 +38,7 @@ namespace ARDOUR {
class MidiPort;
class Port;
-class MidiPortManager {
+class LIBARDOUR_API MidiPortManager {
public:
MidiPortManager();
virtual ~MidiPortManager ();
@@ -55,7 +57,12 @@ class MidiPortManager {
MIDI::Port* midi_output_port () const { return _midi_output_port; }
MIDI::Port* mmc_input_port () const { return _mmc_input_port; }
MIDI::Port* mmc_output_port () const { return _mmc_output_port; }
+ MIDI::Port* scene_input_port () const { return _scene_input_port; }
+ MIDI::Port* scene_output_port () const { return _scene_output_port; }
+ boost::shared_ptr<MidiPort> scene_in() const { return boost::dynamic_pointer_cast<MidiPort>(_scene_in); }
+ boost::shared_ptr<MidiPort> scene_out() const { return boost::dynamic_pointer_cast<MidiPort>(_scene_out); }
+
/* Ports used for synchronization. These have their I/O handled inside the
* process callback.
*/
@@ -76,13 +83,17 @@ class MidiPortManager {
MIDI::Port* _midi_output_port;
MIDI::Port* _mmc_input_port;
MIDI::Port* _mmc_output_port;
- /* these point to the same objects as the 4 members above,
+ MIDI::Port* _scene_input_port;
+ MIDI::Port* _scene_output_port;
+ /* these point to the same objects as the members above,
but cast to their ARDOUR::Port base class
*/
boost::shared_ptr<Port> _midi_in;
boost::shared_ptr<Port> _midi_out;
boost::shared_ptr<Port> _mmc_in;
boost::shared_ptr<Port> _mmc_out;
+ boost::shared_ptr<Port> _scene_in;
+ boost::shared_ptr<Port> _scene_out;
/* synchronously handled ports: ARDOUR::MidiPort */
boost::shared_ptr<MidiPort> _mtc_input_port;
diff --git a/libs/ardour/ardour/mix.h b/libs/ardour/ardour/mix.h
index 1c3fb6e5c4..3cd9a3e60f 100644
--- a/libs/ardour/ardour/mix.h
+++ b/libs/ardour/ardour/mix.h
@@ -19,6 +19,7 @@
#ifndef __ardour_mix_h__
#define __ardour_mix_h__
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/utils.h"
@@ -26,39 +27,39 @@
extern "C" {
/* SSE functions */
-float x86_sse_compute_peak (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float current);
-void x86_sse_apply_gain_to_buffer (ARDOUR::Sample * buf, ARDOUR::pframes_t nframes, float gain);
-void x86_sse_mix_buffers_with_gain(ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes, float gain);
-void x86_sse_mix_buffers_no_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes);
+ LIBARDOUR_API float x86_sse_compute_peak (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float current);
+ LIBARDOUR_API void x86_sse_apply_gain_to_buffer (ARDOUR::Sample * buf, ARDOUR::pframes_t nframes, float gain);
+ LIBARDOUR_API void x86_sse_mix_buffers_with_gain(ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes, float gain);
+ LIBARDOUR_API void x86_sse_mix_buffers_no_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes);
}
-void x86_sse_find_peaks (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float *min, float *max);
+LIBARDOUR_API void x86_sse_find_peaks (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float *min, float *max);
/* debug wrappers for SSE functions */
-float debug_compute_peak (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float current);
-void debug_apply_gain_to_buffer (ARDOUR::Sample * buf, ARDOUR::pframes_t nframes, float gain);
-void debug_mix_buffers_with_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes, float gain);
-void debug_mix_buffers_no_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes);
+LIBARDOUR_API float debug_compute_peak (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float current);
+LIBARDOUR_API void debug_apply_gain_to_buffer (ARDOUR::Sample * buf, ARDOUR::pframes_t nframes, float gain);
+LIBARDOUR_API void debug_mix_buffers_with_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes, float gain);
+LIBARDOUR_API void debug_mix_buffers_no_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes);
#endif
#if defined (__APPLE__)
-float veclib_compute_peak (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float current);
-void veclib_find_peaks (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float *min, float *max);
-void veclib_apply_gain_to_buffer (ARDOUR::Sample * buf, ARDOUR::pframes_t nframes, float gain);
-void veclib_mix_buffers_with_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes, float gain);
-void veclib_mix_buffers_no_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes);
+LIBARDOUR_API float veclib_compute_peak (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float current);
+LIBARDOUR_API void veclib_find_peaks (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float *min, float *max);
+LIBARDOUR_API void veclib_apply_gain_to_buffer (ARDOUR::Sample * buf, ARDOUR::pframes_t nframes, float gain);
+LIBARDOUR_API void veclib_mix_buffers_with_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes, float gain);
+LIBARDOUR_API void veclib_mix_buffers_no_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes);
#endif
/* non-optimized functions */
-float default_compute_peak (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float current);
-void default_find_peaks (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float *min, float *max);
-void default_apply_gain_to_buffer (ARDOUR::Sample * buf, ARDOUR::pframes_t nframes, float gain);
-void default_mix_buffers_with_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes, float gain);
-void default_mix_buffers_no_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes);
+LIBARDOUR_API float default_compute_peak (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float current);
+LIBARDOUR_API void default_find_peaks (const ARDOUR::Sample * buf, ARDOUR::pframes_t nsamples, float *min, float *max);
+LIBARDOUR_API void default_apply_gain_to_buffer (ARDOUR::Sample * buf, ARDOUR::pframes_t nframes, float gain);
+LIBARDOUR_API void default_mix_buffers_with_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes, float gain);
+LIBARDOUR_API void default_mix_buffers_no_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, ARDOUR::pframes_t nframes);
#endif /* __ardour_mix_h__ */
diff --git a/libs/ardour/ardour/monitor_processor.h b/libs/ardour/ardour/monitor_processor.h
index 64d3b86bfb..33b3e9c366 100644
--- a/libs/ardour/ardour/monitor_processor.h
+++ b/libs/ardour/ardour/monitor_processor.h
@@ -28,6 +28,7 @@
#include "pbd/compose.h"
#include "pbd/controllable.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/processor.h"
@@ -38,7 +39,7 @@ namespace ARDOUR {
class Session;
template<typename T>
-class MPControl : public PBD::Controllable {
+class /*LIBARDOUR_API*/ MPControl : public PBD::Controllable {
public:
MPControl (T initial, const std::string& name, PBD::Controllable::Flag flag,
float lower = 0.0f, float upper = 1.0f)
@@ -104,7 +105,7 @@ protected:
T _upper;
};
-class MonitorProcessor : public Processor
+class LIBARDOUR_API MonitorProcessor : public Processor
{
public:
MonitorProcessor (Session&);
diff --git a/libs/ardour/ardour/movable.h b/libs/ardour/ardour/movable.h
index d68d7620ba..df63987f4f 100644
--- a/libs/ardour/ardour/movable.h
+++ b/libs/ardour/ardour/movable.h
@@ -22,7 +22,7 @@
namespace ARDOUR {
-class Movable {
+class LIBARDOUR_API Movable {
public:
Movable() {}
diff --git a/libs/ardour/ardour/msvc_libardour.h b/libs/ardour/ardour/msvc_libardour.h
new file mode 100644
index 0000000000..f8edcdd3cb
--- /dev/null
+++ b/libs/ardour/ardour/msvc_libardour.h
@@ -0,0 +1,73 @@
+/*
+ Copyright (C) 2009 John Emmas
+
+ 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 __msvc_libardour_h__
+#define __msvc_libardour_h__
+
+#include <ardour/libardour_visibility.h>
+#include <limits.h>
+
+#ifndef _MAX_PATH
+#define _MAX_PATH 260
+#endif
+#ifndef PATH_MAX
+#define PATH_MAX _MAX_PATH
+#endif
+
+#define LIBARDOUR_APICALLTYPE __cdecl
+
+namespace ARDOUR {
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+// LIBARDOUR_API char* LIBARDOUR_APICALLTYPE placeholder_for_non_msvc_specific_function(s);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* __cplusplus */
+
+} // namespace ARDOUR
+
+#ifdef COMPILER_MSVC
+#include <rpc.h>
+//#include <io.h>
+
+#ifndef __THROW
+#define __THROW throw()
+#endif
+#include <ardourext/sys/time.h>
+
+namespace ARDOUR {
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+LIBARDOUR_API int LIBARDOUR_APICALLTYPE symlink(const char *dest, const char *shortcut, const char *working_directory = 0);
+LIBARDOUR_API int LIBARDOUR_APICALLTYPE readlink(const char *__restrict shortcut, char *__restrict buf, size_t bufsize);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* __cplusplus */
+
+} // namespace ARDOUR
+
+#endif // COMPILER_MSVC
+#endif // __mavc_libardour_h__
diff --git a/libs/ardour/ardour/mtdm.h b/libs/ardour/ardour/mtdm.h
index b46e53c0a2..b57df7254a 100644
--- a/libs/ardour/ardour/mtdm.h
+++ b/libs/ardour/ardour/mtdm.h
@@ -21,7 +21,9 @@
#include <stddef.h>
-class MTDM
+#include "ardour/libardour_visibility.h"
+
+class LIBARDOUR_API MTDM
{
public:
diff --git a/libs/ardour/ardour/mute_master.h b/libs/ardour/ardour/mute_master.h
index 460c7bf48b..8a83352a5b 100644
--- a/libs/ardour/ardour/mute_master.h
+++ b/libs/ardour/ardour/mute_master.h
@@ -31,7 +31,7 @@ namespace ARDOUR {
class Session;
-class MuteMaster : public SessionHandleRef, public PBD::Stateful
+class LIBARDOUR_API MuteMaster : public SessionHandleRef, public PBD::Stateful
{
public:
/** deliveries to mute when the channel is "muted" */
diff --git a/libs/ardour/ardour/onset_detector.h b/libs/ardour/ardour/onset_detector.h
index 6604a3a362..40eac9b465 100644
--- a/libs/ardour/ardour/onset_detector.h
+++ b/libs/ardour/ardour/onset_detector.h
@@ -27,7 +27,7 @@ namespace ARDOUR {
class AudioSource;
class Session;
-class OnsetDetector : public AudioAnalyser
+class LIBARDOUR_API OnsetDetector : public AudioAnalyser
{
public:
OnsetDetector (float sample_rate);
diff --git a/libs/ardour/ardour/operations.h b/libs/ardour/ardour/operations.h
index dd6329d7b9..d113c621c2 100644
--- a/libs/ardour/ardour/operations.h
+++ b/libs/ardour/ardour/operations.h
@@ -17,6 +17,8 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#include "ardour/libardour_visibility.h"
+
/** These are GQuarks for a subset of UI operations. We use these
* so that the undo system can be queried to find out what operations
* are currently in progress, by calling Session::current_operations().
@@ -27,19 +29,19 @@
namespace Operations {
- extern GQuark capture;
- extern GQuark paste;
- extern GQuark duplicate_region;
- extern GQuark insert_file;
- extern GQuark insert_region;
- extern GQuark drag_region_brush;
- extern GQuark region_drag;
- extern GQuark selection_grab;
- extern GQuark region_fill;
- extern GQuark fill_selection;
- extern GQuark create_region;
- extern GQuark region_copy;
- extern GQuark fixed_time_region_copy;
+ LIBARDOUR_API extern GQuark capture;
+ LIBARDOUR_API extern GQuark paste;
+ LIBARDOUR_API extern GQuark duplicate_region;
+ LIBARDOUR_API extern GQuark insert_file;
+ LIBARDOUR_API extern GQuark insert_region;
+ LIBARDOUR_API extern GQuark drag_region_brush;
+ LIBARDOUR_API extern GQuark region_drag;
+ LIBARDOUR_API extern GQuark selection_grab;
+ LIBARDOUR_API extern GQuark region_fill;
+ LIBARDOUR_API extern GQuark fill_selection;
+ LIBARDOUR_API extern GQuark create_region;
+ LIBARDOUR_API extern GQuark region_copy;
+ LIBARDOUR_API extern GQuark fixed_time_region_copy;
};
diff --git a/libs/ardour/ardour/pan_controllable.h b/libs/ardour/ardour/pan_controllable.h
index be0c9260c0..9abbec42ab 100644
--- a/libs/ardour/ardour/pan_controllable.h
+++ b/libs/ardour/ardour/pan_controllable.h
@@ -34,7 +34,7 @@ namespace ARDOUR {
class Session;
class Pannable;
-class PanControllable : public AutomationControl
+class LIBARDOUR_API PanControllable : public AutomationControl
{
public:
PanControllable (Session& s, std::string name, Pannable* o, Evoral::Parameter param)
diff --git a/libs/ardour/ardour/pannable.h b/libs/ardour/ardour/pannable.h
index 0d5200b685..62c9cd123b 100644
--- a/libs/ardour/ardour/pannable.h
+++ b/libs/ardour/ardour/pannable.h
@@ -36,7 +36,7 @@ class Session;
class AutomationControl;
class Panner;
-class Pannable : public PBD::Stateful, public Automatable, public SessionHandleRef
+class LIBARDOUR_API Pannable : public PBD::Stateful, public Automatable, public SessionHandleRef
{
public:
Pannable (Session& s);
diff --git a/libs/ardour/ardour/panner.h b/libs/ardour/ardour/panner.h
index 18e3e8045a..211ad0ca8e 100644
--- a/libs/ardour/ardour/panner.h
+++ b/libs/ardour/ardour/panner.h
@@ -30,10 +30,23 @@
#include "pbd/signals.h"
#include "pbd/stateful.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/automation_control.h"
#include "ardour/automatable.h"
+
+/* This section is for actual panners to use. They will include this file,
+ * declare ARDOURPANNER_DLL_EXPORTS during compilation, and ... voila.
+ */
+
+#ifdef ARDOURPANNER_DLL_EXPORTS // defined if we are building a panner implementation
+ #define ARDOURPANNER_API LIBARDOUR_DLL_EXPORT
+ #else
+ #define ARDOURPANNER_API LIBARDOUR_DLL_IMPORT
+ #endif
+#define ARDOURPANNER_LOCAL LIBARDOUR_DLL_LOCAL
+
namespace ARDOUR {
class Session;
@@ -42,7 +55,7 @@ class BufferSet;
class AudioBuffer;
class Speakers;
-class Panner : public PBD::Stateful, public PBD::ScopedConnectionList
+class LIBARDOUR_API Panner : public PBD::Stateful, public PBD::ScopedConnectionList
{
public:
Panner (boost::shared_ptr<Pannable>);
@@ -175,7 +188,7 @@ protected:
} // namespace
extern "C" {
-struct PanPluginDescriptor {
+struct LIBARDOUR_API PanPluginDescriptor {
std::string name;
std::string panner_uri;
std::string gui_uri;
diff --git a/libs/ardour/ardour/panner_manager.h b/libs/ardour/ardour/panner_manager.h
index 4a29e1c36b..73d667424f 100644
--- a/libs/ardour/ardour/panner_manager.h
+++ b/libs/ardour/ardour/panner_manager.h
@@ -20,7 +20,10 @@
#ifndef __ardour_panner_manager_h__
#define __ardour_panner_manager_h__
-#include <dlfcn.h>
+#include <map>
+#include <string>
+#include <glibmm/module.h>
+
#include "ardour/panner.h"
#include "ardour/session_handle.h"
@@ -28,21 +31,22 @@ namespace ARDOUR {
typedef std::map<std::string,std::string> PannerUriMap;
-struct PannerInfo {
+struct LIBARDOUR_API PannerInfo {
+
PanPluginDescriptor descriptor;
- void* module;
+ Glib::Module* module;
- PannerInfo (PanPluginDescriptor& d, void* handle)
+ PannerInfo (PanPluginDescriptor& d, Glib::Module* m)
: descriptor (d)
- , module (handle)
+ , module (m)
{}
~PannerInfo () {
- dlclose (module);
+ delete module;
}
};
-class PannerManager : public ARDOUR::SessionHandlePtr
+class LIBARDOUR_API PannerManager : public ARDOUR::SessionHandlePtr
{
public:
~PannerManager ();
diff --git a/libs/ardour/ardour/panner_search_path.h b/libs/ardour/ardour/panner_search_path.h
deleted file mode 100644
index 889b9efb23..0000000000
--- a/libs/ardour/ardour/panner_search_path.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- Copyright (C) 2011 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_panner_search_path_h__
-#define __ardour_panner_search_path_h__
-
-#include "pbd/search_path.h"
-
-namespace ARDOUR {
-
- /**
- * return a SearchPath containing directories in which to look for
- * panner plugins.
- *
- * If ARDOUR_PANNER_PATH is defined then the SearchPath returned
- * will contain only those directories specified in it, otherwise it will
- * contain the user and system directories which may contain control
- * surface plugins.
- */
- PBD::SearchPath panner_search_path ();
-
-} // namespace ARDOUR
-
-#endif /* __ardour_panner_search_path_h__ */
diff --git a/libs/ardour/ardour/panner_shell.h b/libs/ardour/ardour/panner_shell.h
index da4e6e3bee..f344afd54a 100644
--- a/libs/ardour/ardour/panner_shell.h
+++ b/libs/ardour/ardour/panner_shell.h
@@ -30,6 +30,7 @@
#include "pbd/cartesian.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/session_object.h"
@@ -46,7 +47,7 @@ class Pannable;
/** Class to manage panning by instantiating and controlling
* an appropriate Panner object for a given in/out configuration.
*/
-class PannerShell : public SessionObject
+class LIBARDOUR_API PannerShell : public SessionObject
{
public:
PannerShell (std::string name, Session&, boost::shared_ptr<Pannable>, bool is_send = false);
diff --git a/libs/ardour/ardour/peak.h b/libs/ardour/ardour/peak.h
index ab99889dd3..9c871a9e35 100644
--- a/libs/ardour/ardour/peak.h
+++ b/libs/ardour/ardour/peak.h
@@ -21,6 +21,7 @@
#define __ardour_peak_h__
#include <cmath>
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/utils.h"
diff --git a/libs/ardour/ardour/pi_controller.h b/libs/ardour/ardour/pi_controller.h
deleted file mode 100644
index bcbc81701a..0000000000
--- a/libs/ardour/ardour/pi_controller.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- Copyright (C) 2008 Torben Hohn
-
- 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 __libardour_pi_controller__
-#define __libardour_pi_controller__
-
-#include "ardour/types.h"
-
-class PIController {
-public:
- PIController (double resample_factor, int fir_size);
- ~PIController();
-
- void reset (double resample_factor) {
- resample_mean = resample_factor;
- static_resample_factor = resample_factor;
- out_of_bounds ();
- }
-
- double get_ratio (int fill_level, int period_size);
- void out_of_bounds();
-
-public:
- double resample_mean;
- double static_resample_factor;
- double* offset_array;
- double* window_array;
- int offset_differential_index;
- double offset_integral;
- double catch_factor;
- double catch_factor2;
- double pclamp;
- double controlquant;
- int smooth_size;
- double smooth_offset;
- double current_resample_factor;
- bool fir_empty;
-};
-
-#define ESTIMATOR_SIZE 16
-
-class PIChaser {
-public:
- PIChaser();
- ~PIChaser();
-
- double get_ratio( framepos_t chasetime_measured, framepos_t chasetime, framepos_t slavetime_measured, framepos_t slavetime, bool in_control, int period_size );
- void reset();
- framepos_t want_locate() { return want_locate_val; }
-
-private:
- PIController *pic;
- framepos_t realtime_stamps[ESTIMATOR_SIZE];
- framepos_t chasetime_stamps[ESTIMATOR_SIZE];
- int array_index;
- framepos_t want_locate_val;
-
- void feed_estimator( framepos_t realtime, framepos_t chasetime );
- double get_estimate();
-
- double speed;
-
- double speed_threshold;
- framepos_t pos_threshold;
-};
-
-#endif /* __libardour_pi_controller__ */
diff --git a/libs/ardour/ardour/pitch.h b/libs/ardour/ardour/pitch.h
index 961609938c..4c8db5fb80 100644
--- a/libs/ardour/ardour/pitch.h
+++ b/libs/ardour/ardour/pitch.h
@@ -37,7 +37,7 @@ namespace ARDOUR {
namespace ARDOUR {
-class Pitch : public RBEffect {
+class LIBARDOUR_API Pitch : public RBEffect {
public:
Pitch (ARDOUR::Session&, TimeFXRequest&);
~Pitch () {}
@@ -49,7 +49,7 @@ class Pitch : public RBEffect {
namespace ARDOUR {
-class Pitch : public Filter {
+class LIBARDOUR_API Pitch : public Filter {
public:
Pitch (ARDOUR::Session&, TimeFXRequest&);
~Pitch () {}
diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h
index 754e48cc25..5629a04629 100644
--- a/libs/ardour/ardour/playlist.h
+++ b/libs/ardour/ardour/playlist.h
@@ -41,13 +41,13 @@
#include "evoral/types.hpp"
#include "ardour/ardour.h"
+#include "ardour/region.h"
#include "ardour/session_object.h"
#include "ardour/data_type.h"
namespace ARDOUR {
class Session;
-class Region;
class Playlist;
class Crossfade;
@@ -55,10 +55,10 @@ namespace Properties {
/* fake the type, since regions are handled by SequenceProperty which doesn't
care about such things.
*/
- extern PBD::PropertyDescriptor<bool> regions;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> regions;
}
-class RegionListProperty : public PBD::SequenceProperty<std::list<boost::shared_ptr<Region> > >
+class LIBARDOUR_API RegionListProperty : public PBD::SequenceProperty<std::list<boost::shared_ptr<Region> > >
{
public:
RegionListProperty (Playlist&);
@@ -78,7 +78,7 @@ class RegionListProperty : public PBD::SequenceProperty<std::list<boost::shared_
Playlist& _playlist;
};
-class Playlist : public SessionObject , public boost::enable_shared_from_this<Playlist>
+class LIBARDOUR_API Playlist : public SessionObject , public boost::enable_shared_from_this<Playlist>
{
public:
static void make_property_quarks ();
diff --git a/libs/ardour/ardour/playlist_factory.h b/libs/ardour/ardour/playlist_factory.h
index 8b5d9d6a23..505836234b 100644
--- a/libs/ardour/ardour/playlist_factory.h
+++ b/libs/ardour/ardour/playlist_factory.h
@@ -28,7 +28,7 @@ namespace ARDOUR {
class Session;
-class PlaylistFactory {
+class LIBARDOUR_API PlaylistFactory {
public:
static PBD::Signal2<void,boost::shared_ptr<Playlist>, bool> PlaylistCreated;
diff --git a/libs/ardour/ardour/playlist_source.h b/libs/ardour/ardour/playlist_source.h
index 71802fddb6..55cc1f6b59 100644
--- a/libs/ardour/ardour/playlist_source.h
+++ b/libs/ardour/ardour/playlist_source.h
@@ -31,7 +31,7 @@ namespace ARDOUR {
class Playlist;
-class PlaylistSource : virtual public Source {
+class LIBARDOUR_API PlaylistSource : virtual public Source {
public:
virtual ~PlaylistSource ();
diff --git a/libs/ardour/ardour/plugin.h b/libs/ardour/ardour/plugin.h
index 1bc7dc5afd..a69b87efbd 100644
--- a/libs/ardour/ardour/plugin.h
+++ b/libs/ardour/ardour/plugin.h
@@ -32,6 +32,7 @@
#include "ardour/cycles.h"
#include "ardour/latent.h"
#include "ardour/plugin_insert.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/midi_state_tracker.h"
@@ -49,7 +50,7 @@ class Plugin;
typedef boost::shared_ptr<Plugin> PluginPtr;
-class PluginInfo {
+class LIBARDOUR_API PluginInfo {
public:
PluginInfo () { }
virtual ~PluginInfo () { }
@@ -87,7 +88,7 @@ class PluginInfo {
typedef boost::shared_ptr<PluginInfo> PluginInfoPtr;
typedef std::list<PluginInfoPtr> PluginInfoList;
-class Plugin : public PBD::StatefulDestructible, public Latent
+class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent
{
public:
Plugin (ARDOUR::AudioEngine&, ARDOUR::Session&);
diff --git a/libs/ardour/ardour/plugin_insert.h b/libs/ardour/ardour/plugin_insert.h
index 7d7e2e7269..f1c03a79d2 100644
--- a/libs/ardour/ardour/plugin_insert.h
+++ b/libs/ardour/ardour/plugin_insert.h
@@ -26,6 +26,7 @@
#include <boost/weak_ptr.hpp>
#include "ardour/ardour.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/processor.h"
#include "ardour/automation_control.h"
@@ -40,7 +41,7 @@ class Plugin;
/** Plugin inserts: send data through a plugin
*/
-class PluginInsert : public Processor
+class LIBARDOUR_API PluginInsert : public Processor
{
public:
PluginInsert (Session&, boost::shared_ptr<Plugin> = boost::shared_ptr<Plugin>());
@@ -176,7 +177,7 @@ class PluginInsert : public Processor
/** details of the match currently being used */
Match _match;
- void automation_run (BufferSet& bufs, pframes_t nframes);
+ void automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes);
void connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now = 0);
void create_automatable_parameters ();
diff --git a/libs/ardour/ardour/plugin_manager.h b/libs/ardour/ardour/plugin_manager.h
index a7a5703690..6239bd7cb0 100644
--- a/libs/ardour/ardour/plugin_manager.h
+++ b/libs/ardour/ardour/plugin_manager.h
@@ -30,6 +30,7 @@
#include <set>
#include <boost/utility.hpp>
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/plugin.h"
@@ -37,9 +38,10 @@ namespace ARDOUR {
class Plugin;
-class PluginManager : public boost::noncopyable {
+class LIBARDOUR_API PluginManager : public boost::noncopyable {
public:
static PluginManager& instance();
+ static std::string scanner_bin_path;
~PluginManager ();
@@ -49,11 +51,17 @@ class PluginManager : public boost::noncopyable {
ARDOUR::PluginInfoList &lv2_plugin_info ();
ARDOUR::PluginInfoList &au_plugin_info ();
- void refresh ();
+ void refresh (bool cache_only = false);
+ void cancel_plugin_scan();
+ void cancel_plugin_timeout();
+ void clear_vst_cache ();
+ void clear_vst_blacklist ();
- int add_ladspa_directory (std::string dirpath);
- int add_windows_vst_directory (std::string dirpath);
- int add_lxvst_directory (std::string dirpath);
+ const std::string get_default_windows_vst_path() const { return windows_vst_path; }
+ const std::string get_default_lxvst_path() const { return lxvst_path; }
+
+ bool cancelled () { return _cancel_scan; }
+ bool no_timeout () { return _cancel_timeout; }
enum PluginStatusType {
Normal = 0,
@@ -103,13 +111,15 @@ class PluginManager : public boost::noncopyable {
std::map<uint32_t, std::string> rdf_type;
- std::string ladspa_path;
std::string windows_vst_path;
std::string lxvst_path;
+ bool _cancel_scan;
+ bool _cancel_timeout;
+
void ladspa_refresh ();
- void windows_vst_refresh ();
- void lxvst_refresh ();
+ void windows_vst_refresh (bool cache_only = false);
+ void lxvst_refresh (bool cache_only = false);
void add_lrdf_data (const std::string &path);
void add_ladspa_presets ();
@@ -121,13 +131,12 @@ class PluginManager : public boost::noncopyable {
void lv2_refresh ();
- int windows_vst_discover_from_path (std::string path);
- int windows_vst_discover (std::string path);
+ int windows_vst_discover_from_path (std::string path, bool cache_only = false);
+ int windows_vst_discover (std::string path, bool cache_only = false);
- int lxvst_discover_from_path (std::string path);
- int lxvst_discover (std::string path);
+ int lxvst_discover_from_path (std::string path, bool cache_only = false);
+ int lxvst_discover (std::string path, bool cache_only = false);
- int ladspa_discover_from_path (std::string path);
int ladspa_discover (std::string path);
std::string get_ladspa_category (uint32_t id);
diff --git a/libs/ardour/ardour/lv2_bundled_search_path.h b/libs/ardour/ardour/plugin_types.h
index f5780c5e0e..e0dd6600fc 100644
--- a/libs/ardour/ardour/lv2_bundled_search_path.h
+++ b/libs/ardour/ardour/plugin_types.h
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2013 Paul Davis
+ Copyright (C) 2002 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
@@ -17,19 +17,18 @@
*/
-#ifndef ARDOUR_LV2_BUNDLED_SEARCH_PATH_INCLUDED
-#define ARDOUR_LV2_BUNDLED_SEARCH_PATH_INCLUDED
-
-#include "pbd/search_path.h"
+#ifndef __ardour_plugin_types_h__
+#define __ardour_plugin_types_h__
namespace ARDOUR {
- /**
- * return a SearchPath containing directories in which to look for
- * lv2 plugins.
- */
- PBD::SearchPath lv2_bundled_search_path ();
-
-} // namespace ARDOUR
+ enum PluginType {
+ AudioUnit,
+ LADSPA,
+ LV2,
+ Windows_VST,
+ LXVST,
+ };
+}
#endif
diff --git a/libs/ardour/ardour/port.h b/libs/ardour/ardour/port.h
index 77bf2b6f71..6a05314843 100644
--- a/libs/ardour/ardour/port.h
+++ b/libs/ardour/ardour/port.h
@@ -25,12 +25,12 @@
#include <set>
#include <string>
#include <vector>
-#include <jack/jack.h>
#include <boost/utility.hpp>
#include "pbd/signals.h"
#include "ardour/data_type.h"
#include "ardour/port_engine.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
namespace ARDOUR {
@@ -38,7 +38,7 @@ namespace ARDOUR {
class AudioEngine;
class Buffer;
-class Port : public boost::noncopyable
+class LIBARDOUR_API Port : public boost::noncopyable
{
public:
virtual ~Port ();
diff --git a/libs/ardour/ardour/port_engine.h b/libs/ardour/ardour/port_engine.h
index 68f8fe1232..62996b7cdf 100644
--- a/libs/ardour/ardour/port_engine.h
+++ b/libs/ardour/ardour/port_engine.h
@@ -26,6 +26,7 @@
#include <stdint.h>
#include "ardour/data_type.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
namespace ARDOUR {
@@ -74,7 +75,7 @@ class PortManager;
* documentation, on which this entire object is based.
*/
-class PortEngine {
+class LIBARDOUR_API PortEngine {
public:
PortEngine (PortManager& pm) : manager (pm) {}
virtual ~PortEngine() {}
diff --git a/libs/ardour/ardour/port_insert.h b/libs/ardour/ardour/port_insert.h
index abd9fb73cc..327080984a 100644
--- a/libs/ardour/ardour/port_insert.h
+++ b/libs/ardour/ardour/port_insert.h
@@ -26,6 +26,7 @@
#include "ardour/ardour.h"
#include "ardour/io_processor.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
class XMLNode;
@@ -41,7 +42,7 @@ class Pannable;
/** Port inserts: send output to a Jack port, pick up input at a Jack port
*/
-class PortInsert : public IOProcessor
+class LIBARDOUR_API PortInsert : public IOProcessor
{
public:
PortInsert (Session&, boost::shared_ptr<Pannable>, boost::shared_ptr<MuteMaster> mm);
diff --git a/libs/ardour/ardour/port_manager.h b/libs/ardour/ardour/port_manager.h
index ba15142d83..b36e98fe64 100644
--- a/libs/ardour/ardour/port_manager.h
+++ b/libs/ardour/ardour/port_manager.h
@@ -40,7 +40,7 @@ namespace ARDOUR {
class PortEngine;
class AudioBackend;
-class PortManager
+class LIBARDOUR_API PortManager
{
public:
typedef std::map<std::string,boost::shared_ptr<Port> > Ports;
diff --git a/libs/ardour/ardour/port_set.h b/libs/ardour/ardour/port_set.h
index 690875cd86..cd76f75ee3 100644
--- a/libs/ardour/ardour/port_set.h
+++ b/libs/ardour/ardour/port_set.h
@@ -39,7 +39,7 @@ class MidiPort;
* and once in a vector of all port (_all_ports). This is to speed up the
* fairly common case of iterating over all ports.
*/
-class PortSet : public boost::noncopyable {
+class LIBARDOUR_API PortSet : public boost::noncopyable {
public:
PortSet();
diff --git a/libs/ardour/ardour/process_thread.h b/libs/ardour/ardour/process_thread.h
index f96595fbbf..779fdaea2d 100644
--- a/libs/ardour/ardour/process_thread.h
+++ b/libs/ardour/ardour/process_thread.h
@@ -23,6 +23,7 @@
#include <glibmm/threads.h>
#include "ardour/chan_count.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
namespace ARDOUR {
@@ -30,7 +31,7 @@ namespace ARDOUR {
class ThreadBuffers;
class BufferSet;
-class ProcessThread
+class LIBARDOUR_API ProcessThread
{
public:
ProcessThread ();
diff --git a/libs/ardour/ardour/processor.h b/libs/ardour/ardour/processor.h
index 18f13dbc78..85d466a169 100644
--- a/libs/ardour/ardour/processor.h
+++ b/libs/ardour/ardour/processor.h
@@ -30,6 +30,7 @@
#include "ardour/buffer_set.h"
#include "ardour/latent.h"
#include "ardour/session_object.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/automatable.h"
@@ -41,7 +42,7 @@ class Session;
class Route;
/** A mixer strip element - plugin, send, meter, etc */
-class Processor : public SessionObject, public Automatable, public Latent
+class LIBARDOUR_API Processor : public SessionObject, public Automatable, public Latent
{
public:
static const std::string state_node_name;
diff --git a/libs/ardour/ardour/profile.h b/libs/ardour/ardour/profile.h
index 5d4e611833..56d9ff62be 100644
--- a/libs/ardour/ardour/profile.h
+++ b/libs/ardour/ardour/profile.h
@@ -23,15 +23,18 @@
#include <boost/dynamic_bitset.hpp>
#include <stdint.h>
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
-class RuntimeProfile {
+class LIBARDOUR_API RuntimeProfile {
public:
enum Element {
SmallScreen,
SAE,
SinglePackage,
- LastElement
+ Trx,
+ LastElement,
};
RuntimeProfile() { bits.resize (LastElement); }
@@ -43,6 +46,9 @@ public:
void set_sae () { bits[SAE] = true; }
bool get_sae () const { return bits[SAE]; }
+ bool get_trx() const { return bits[Trx]; }
+ void set_trx() { bits[Trx] = true; }
+
void set_single_package () { bits[SinglePackage] = true; }
bool get_single_package () const { return bits[SinglePackage]; }
@@ -51,7 +57,7 @@ private:
};
-extern RuntimeProfile* Profile;
+LIBARDOUR_API extern RuntimeProfile* Profile;
}; // namespace ARDOUR
diff --git a/libs/ardour/ardour/progress.h b/libs/ardour/ardour/progress.h
index 10b7d75960..79043a31ee 100644
--- a/libs/ardour/ardour/progress.h
+++ b/libs/ardour/ardour/progress.h
@@ -22,10 +22,12 @@
#include <list>
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
/** A class to handle reporting of progress of something */
-class Progress
+class LIBARDOUR_API Progress
{
public:
Progress ();
diff --git a/libs/ardour/ardour/proxy_controllable.h b/libs/ardour/ardour/proxy_controllable.h
index 169f60f9f5..066f2aac81 100644
--- a/libs/ardour/ardour/proxy_controllable.h
+++ b/libs/ardour/ardour/proxy_controllable.h
@@ -30,7 +30,7 @@ namespace ARDOUR {
so that it can be used like a regular Controllable, bound to MIDI, OSC etc.
*/
-class ProxyControllable : public PBD::Controllable {
+class LIBARDOUR_API ProxyControllable : public PBD::Controllable {
public:
ProxyControllable (const std::string& name, PBD::Controllable::Flag flags,
boost::function1<bool,double> setter,
diff --git a/libs/ardour/ardour/public_diskstream.h b/libs/ardour/ardour/public_diskstream.h
index c150ca93b0..4700e7b6be 100644
--- a/libs/ardour/ardour/public_diskstream.h
+++ b/libs/ardour/ardour/public_diskstream.h
@@ -27,7 +27,7 @@ class Source;
class Location;
/** Public interface to a Diskstream */
-class PublicDiskstream
+class LIBARDOUR_API PublicDiskstream
{
public:
virtual ~PublicDiskstream() {}
diff --git a/libs/ardour/ardour/quantize.h b/libs/ardour/ardour/quantize.h
index e56927767e..c41d172177 100644
--- a/libs/ardour/ardour/quantize.h
+++ b/libs/ardour/ardour/quantize.h
@@ -21,6 +21,7 @@
#ifndef __ardour_quantize_h__
#define __ardour_quantize_h__
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/midi_operator.h"
@@ -28,7 +29,7 @@ namespace ARDOUR {
class Session;
-class Quantize : public MidiOperator {
+class LIBARDOUR_API Quantize : public MidiOperator {
public:
Quantize (ARDOUR::Session&, bool snap_start, bool snap_end,
double start_grid, double end_grid,
diff --git a/libs/ardour/ardour/rb_effect.h b/libs/ardour/ardour/rb_effect.h
index 1d36f31332..6c10278fb3 100644
--- a/libs/ardour/ardour/rb_effect.h
+++ b/libs/ardour/ardour/rb_effect.h
@@ -27,7 +27,7 @@ namespace ARDOUR {
class AudioRegion;
-class RBEffect : public Filter {
+class LIBARDOUR_API RBEffect : public Filter {
public:
RBEffect (ARDOUR::Session&, TimeFXRequest&);
~RBEffect ();
diff --git a/libs/ardour/ardour/rc_configuration.h b/libs/ardour/ardour/rc_configuration.h
index e2f68477a1..d85c723ff8 100644
--- a/libs/ardour/ardour/rc_configuration.h
+++ b/libs/ardour/ardour/rc_configuration.h
@@ -23,6 +23,7 @@
#include <map>
#include <string>
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/utils.h"
#include "ardour/configuration.h"
@@ -31,7 +32,7 @@ class XMLNode;
namespace ARDOUR {
-class RCConfiguration : public Configuration
+class LIBARDOUR_API RCConfiguration : public Configuration
{
public:
RCConfiguration();
@@ -83,8 +84,8 @@ class RCConfiguration : public Configuration
};
/* XXX: rename this */
-extern RCConfiguration *Config;
-extern gain_t speed_quietning; /* see comment in configuration.cc */
+LIBARDOUR_API extern RCConfiguration *Config;
+LIBARDOUR_API extern gain_t speed_quietning; /* see comment in configuration.cc */
} // namespace ARDOUR
diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h
index 3c74f067ae..c0c76d3826 100644
--- a/libs/ardour/ardour/rc_configuration_vars.h
+++ b/libs/ardour/ardour/rc_configuration_vars.h
@@ -43,7 +43,8 @@ CONFIG_VARIABLE (bool, midi_feedback, "midi-feedback", false)
CONFIG_VARIABLE (int32_t, mmc_receive_device_id, "mmc-receive-device-id", 0x7f)
CONFIG_VARIABLE (int32_t, mmc_send_device_id, "mmc-send-device-id", 0)
CONFIG_VARIABLE (int32_t, initial_program_change, "initial-program-change", -1)
-CONFIG_VARIABLE (bool, first_midi_bank_is_zero, "diplay-first-midi-bank-as-zero", false)
+CONFIG_VARIABLE (bool, first_midi_bank_is_zero, "display-first-midi-bank-as-zero", false)
+CONFIG_VARIABLE (int32_t, inter_scene_gap_msecs, "inter-scene-gap-msecs", 1)
/* Timecode and related */
@@ -89,6 +90,7 @@ CONFIG_VARIABLE (bool, automation_follows_regions, "automation-follows-regions",
CONFIG_VARIABLE (bool, region_boundaries_from_selected_tracks, "region-boundaries-from-selected-tracks", true)
CONFIG_VARIABLE (bool, region_boundaries_from_onscreen_tracks, "region-boundaries-from-onscreen_tracks", true)
CONFIG_VARIABLE (bool, autoscroll_editor, "autoscroll-editor", true)
+CONFIG_VARIABLE (FadeShape, default_fade_shape, "default-fade-shape", FadeLinear)
/* monitoring, mute, solo etc */
@@ -133,6 +135,7 @@ CONFIG_VARIABLE (bool, stop_recording_on_xrun, "stop-recording-on-xrun", false)
CONFIG_VARIABLE (bool, create_xrun_marker, "create-xrun-marker", true)
CONFIG_VARIABLE (bool, stop_at_session_end, "stop-at-session-end", false)
CONFIG_VARIABLE (bool, seamless_loop, "seamless-loop", false)
+CONFIG_VARIABLE (bool, loop_is_mode, "loop-is-mode", false)
CONFIG_VARIABLE (framecnt_t, preroll, "preroll", 0)
CONFIG_VARIABLE (framecnt_t, postroll, "postroll", 0)
CONFIG_VARIABLE (float, rf_speed, "rf-speed", 2.0f)
@@ -158,6 +161,7 @@ CONFIG_VARIABLE (MeterLineUp, meter_line_up_din, "meter-line-up-din", MeteringLi
CONFIG_VARIABLE (float, meter_peak, "meter-peak", 0.0f)
CONFIG_VARIABLE (bool, meter_style_led, "meter-style-led", true)
CONFIG_VARIABLE (bool, show_editor_meter, "show-editor-meter", true)
+CONFIG_VARIABLE (double, waveform_clip_level, "waveform-clip-level", -0.0933967) /* units of dB */
/* miscellany */
@@ -167,8 +171,6 @@ CONFIG_VARIABLE (bool, replicate_missing_region_channels, "replicate-missing-reg
CONFIG_VARIABLE (bool, hiding_groups_deactivates_groups, "hiding-groups-deactivates-groups", true)
CONFIG_VARIABLE (bool, verify_remove_last_capture, "verify-remove-last-capture", true)
CONFIG_VARIABLE (bool, no_new_session_dialog, "no-new-session-dialog", false)
-CONFIG_VARIABLE (bool, use_windows_vst, "use-windows-vst", true)
-CONFIG_VARIABLE (bool, use_lxvst, "use-lxvst", true)
CONFIG_VARIABLE (bool, save_history, "save-history", true)
CONFIG_VARIABLE (int32_t, saved_history_depth, "save-history-depth", 20)
CONFIG_VARIABLE (int32_t, history_depth, "history-depth", 20)
@@ -178,7 +180,6 @@ CONFIG_VARIABLE (uint32_t, periodic_safety_backup_interval, "periodic-safety-bac
CONFIG_VARIABLE (float, automation_interval_msecs, "automation-interval-msecs", 30)
CONFIG_VARIABLE (bool, only_copy_imported_files, "only-copy-imported-files", false)
CONFIG_VARIABLE (bool, keep_tearoffs, "keep-tearoffs", false)
-CONFIG_VARIABLE (bool, new_plugins_active, "new-plugins-active", true)
CONFIG_VARIABLE (std::string, keyboard_layout, "keyboard-layout", "ansi")
CONFIG_VARIABLE (std::string, default_bindings, "default-bindings", "ardour")
CONFIG_VARIABLE (bool, default_narrow_ms, "default-narrow_ms", false)
@@ -192,16 +193,28 @@ CONFIG_VARIABLE (WaveformScale, waveform_scale, "waveform-scale", Linear)
CONFIG_VARIABLE (WaveformShape, waveform_shape, "waveform-shape", Traditional)
CONFIG_VARIABLE (bool, allow_special_bus_removal, "allow-special-bus-removal", false)
CONFIG_VARIABLE (int32_t, processor_usage, "processor-usage", -1)
-CONFIG_VARIABLE (bool, color_regions_using_track_color, "color-regions-using-track-color", false)
CONFIG_VARIABLE (gain_t, max_gain, "max-gain", 2.0) /* +6.0dB */
CONFIG_VARIABLE (bool, update_editor_during_summary_drag, "update-editor-during-summary-drag", true)
CONFIG_VARIABLE (bool, never_display_periodic_midi, "never-display-periodic-midi", true)
CONFIG_VARIABLE (bool, sound_midi_notes, "sound-midi-notes", false)
-CONFIG_VARIABLE (bool, use_plugin_own_gui, "use-plugin-own-gui", true)
CONFIG_VARIABLE (uint32_t, max_recent_sessions, "max-recent-sessions", 10)
CONFIG_VARIABLE (double, automation_thinning_factor, "automation-thinning-factor", 20.0)
CONFIG_VARIABLE (std::string, freesound_download_dir, "freesound-download-dir", Glib::get_home_dir() + "/Freesound/snd")
+/* plugin related */
+
+CONFIG_VARIABLE (bool, new_plugins_active, "new-plugins-active", true)
+CONFIG_VARIABLE (bool, use_plugin_own_gui, "use-plugin-own-gui", true)
+CONFIG_VARIABLE (bool, use_windows_vst, "use-windows-vst", true)
+CONFIG_VARIABLE (bool, use_lxvst, "use-lxvst", true)
+CONFIG_VARIABLE (bool, show_plugin_scan_window, "show-plugin-scan-window", false)
+CONFIG_VARIABLE (bool, discover_vst_on_start, "discover-vst-on-start", false)
+CONFIG_VARIABLE (int, vst_scan_timeout, "vst-scan-timeout", 600) /* deciseconds, per plugin, <= 0 no timeout */
+
+/* custom user plugin paths */
+CONFIG_VARIABLE (std::string, plugin_path_vst, "plugin-path-vst", "@default@")
+CONFIG_VARIABLE (std::string, plugin_path_lxvst, "plugin-path-lxvst", "@default@")
+
/* denormal management */
CONFIG_VARIABLE (bool, denormal_protection, "denormal-protection", false)
@@ -215,6 +228,7 @@ CONFIG_VARIABLE (bool, use_tooltips, "use-tooltips", true)
CONFIG_VARIABLE (std::string, mixer_strip_visibility, "mixer-strip-visibility", "PhaseInvert,SoloSafe,SoloIsolated,Group,MeterPoint")
CONFIG_VARIABLE (bool, allow_non_quarter_pulse, "allow-non-quarter-pulse", false)
CONFIG_VARIABLE (bool, show_region_gain, "show-region-gain", false)
+CONFIG_VARIABLE (bool, show_name_highlight, "show-name-highlight", false)
/* web addresses used in the program */
diff --git a/libs/ardour/ardour/readable.h b/libs/ardour/ardour/readable.h
index d184902deb..18190436df 100644
--- a/libs/ardour/ardour/readable.h
+++ b/libs/ardour/ardour/readable.h
@@ -20,11 +20,12 @@
#ifndef __ardour_readable_h__
#define __ardour_readable_h__
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
namespace ARDOUR {
-class Readable {
+class LIBARDOUR_API Readable {
public:
Readable () {}
virtual ~Readable() {}
diff --git a/libs/ardour/ardour/recent_sessions.h b/libs/ardour/ardour/recent_sessions.h
index 2951496849..03134da6d2 100644
--- a/libs/ardour/ardour/recent_sessions.h
+++ b/libs/ardour/ardour/recent_sessions.h
@@ -24,13 +24,15 @@
#include <utility>
#include <string>
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
typedef std::deque<std::pair<std::string,std::string> > RecentSessions;
- int read_recent_sessions (RecentSessions& rs);
- int store_recent_sessions (std::string name, std::string path);
- int write_recent_sessions (RecentSessions& rs);
- int remove_recent_sessions (const std::string& path);
+ LIBARDOUR_API int read_recent_sessions (RecentSessions& rs);
+ LIBARDOUR_API int store_recent_sessions (std::string name, std::string path);
+ LIBARDOUR_API int write_recent_sessions (RecentSessions& rs);
+ LIBARDOUR_API int remove_recent_sessions (const std::string& path);
}; // namespace ARDOUR
#endif // __ardour_recent_sessions_h__
diff --git a/libs/ardour/ardour/region.h b/libs/ardour/ardour/region.h
index 3ee829ed12..a66047a02a 100644
--- a/libs/ardour/ardour/region.h
+++ b/libs/ardour/ardour/region.h
@@ -38,35 +38,34 @@
class XMLNode;
-
namespace ARDOUR {
namespace Properties {
- extern PBD::PropertyDescriptor<bool> muted;
- extern PBD::PropertyDescriptor<bool> opaque;
- extern PBD::PropertyDescriptor<bool> locked;
- extern PBD::PropertyDescriptor<bool> video_locked;
- extern PBD::PropertyDescriptor<bool> automatic;
- extern PBD::PropertyDescriptor<bool> whole_file;
- extern PBD::PropertyDescriptor<bool> import;
- extern PBD::PropertyDescriptor<bool> external;
- extern PBD::PropertyDescriptor<bool> sync_marked;
- extern PBD::PropertyDescriptor<bool> left_of_split;
- extern PBD::PropertyDescriptor<bool> right_of_split;
- extern PBD::PropertyDescriptor<bool> hidden;
- extern PBD::PropertyDescriptor<bool> position_locked;
- extern PBD::PropertyDescriptor<bool> valid_transients;
- extern PBD::PropertyDescriptor<framepos_t> start;
- extern PBD::PropertyDescriptor<framecnt_t> length;
- extern PBD::PropertyDescriptor<framepos_t> position;
- extern PBD::PropertyDescriptor<framecnt_t> sync_position;
- extern PBD::PropertyDescriptor<layer_t> layer;
- extern PBD::PropertyDescriptor<framepos_t> ancestral_start;
- extern PBD::PropertyDescriptor<framecnt_t> ancestral_length;
- extern PBD::PropertyDescriptor<float> stretch;
- extern PBD::PropertyDescriptor<float> shift;
- extern PBD::PropertyDescriptor<PositionLockStyle> position_lock_style;
- extern PBD::PropertyDescriptor<uint64_t> layering_index;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> muted;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> opaque;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> locked;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> video_locked;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> automatic;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> whole_file;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> import;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> external;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> sync_marked;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> left_of_split;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> right_of_split;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> hidden;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> position_locked;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> valid_transients;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<framepos_t> start;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<framecnt_t> length;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<framepos_t> position;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<framecnt_t> sync_position;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<layer_t> layer;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<framepos_t> ancestral_start;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<framecnt_t> ancestral_length;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<float> stretch;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<float> shift;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<PositionLockStyle> position_lock_style;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<uint64_t> layering_index;
};
class Playlist;
@@ -74,14 +73,14 @@ class Filter;
class ExportSpecification;
class Progress;
-enum RegionEditState {
+enum LIBARDOUR_API RegionEditState {
EditChangesNothing = 0,
EditChangesName = 1,
EditChangesID = 2
};
-class Region
+class LIBARDOUR_API Region
: public SessionObject
, public boost::enable_shared_from_this<Region>
, public Readable
@@ -220,7 +219,7 @@ class Region
bool at_natural_position () const;
void move_to_natural_position ();
- void trim_start (framepos_t new_position);
+ void move_start (frameoffset_t distance);
void trim_front (framepos_t new_position);
void trim_end (framepos_t new_position);
void trim_to (framepos_t position, framecnt_t length);
diff --git a/libs/ardour/ardour/region_factory.h b/libs/ardour/ardour/region_factory.h
index ed0c962d87..a9b73dc462 100644
--- a/libs/ardour/ardour/region_factory.h
+++ b/libs/ardour/ardour/region_factory.h
@@ -28,6 +28,7 @@
#include "pbd/property_list.h"
#include "pbd/signals.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
class XMLNode;
@@ -38,7 +39,7 @@ namespace ARDOUR {
class Session;
class AudioRegion;
-class RegionFactory {
+class LIBARDOUR_API RegionFactory {
public:
typedef std::map<PBD::ID,boost::shared_ptr<Region> > RegionMap;
diff --git a/libs/ardour/ardour/region_sorters.h b/libs/ardour/ardour/region_sorters.h
index baa3a3417d..3afd66bf3c 100644
--- a/libs/ardour/ardour/region_sorters.h
+++ b/libs/ardour/ardour/region_sorters.h
@@ -24,18 +24,31 @@
namespace ARDOUR {
-struct RegionSortByPosition {
+struct LIBARDOUR_API RegionSortByPosition {
bool operator() (boost::shared_ptr<Region> a, boost::shared_ptr<Region> b) {
return a->position() < b->position();
}
};
-struct RegionSortByLayer {
+struct LIBARDOUR_API RegionSortByLayer {
bool operator() (boost::shared_ptr<Region> a, boost::shared_ptr<Region> b) {
return a->layer() < b->layer();
}
};
+/* sort by RegionSortByLayerAndPosition()
+ * is equivalent to
+ * stable_sort by RegionSortByPosition();
+ * stable_sort by RegionSortByLayer();
+ */
+struct LIBARDOUR_API RegionSortByLayerAndPosition {
+ bool operator() (boost::shared_ptr<Region> a, boost::shared_ptr<Region> b) {
+ return
+ (a->layer() < b->layer() && a->position() < b->position())
+ || (a->layer() == b->layer() && a->position() < b->position());
+ }
+};
+
} // namespace
#endif /* __libardour_region_sorters_h__ */
diff --git a/libs/ardour/ardour/resampled_source.h b/libs/ardour/ardour/resampled_source.h
index a36ad4331f..bb088f36fb 100644
--- a/libs/ardour/ardour/resampled_source.h
+++ b/libs/ardour/ardour/resampled_source.h
@@ -22,12 +22,13 @@
#include <samplerate.h>
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/importable_source.h"
namespace ARDOUR {
-class ResampledImportableSource : public ImportableSource
+class LIBARDOUR_API ResampledImportableSource : public ImportableSource
{
public:
ResampledImportableSource (boost::shared_ptr<ImportableSource>, framecnt_t rate, SrcQuality);
diff --git a/libs/ardour/ardour/return.h b/libs/ardour/ardour/return.h
index 6dcd6ac2fc..45bb5573b2 100644
--- a/libs/ardour/ardour/return.h
+++ b/libs/ardour/ardour/return.h
@@ -34,7 +34,7 @@ class Amp;
class PeakMeter;
-class Return : public IOProcessor
+class LIBARDOUR_API Return : public IOProcessor
{
public:
Return (Session&, bool internal = false);
diff --git a/libs/ardour/ardour/reverse.h b/libs/ardour/ardour/reverse.h
index edc72ce707..4c24a7c1cb 100644
--- a/libs/ardour/ardour/reverse.h
+++ b/libs/ardour/ardour/reverse.h
@@ -24,7 +24,7 @@
namespace ARDOUR {
-class Reverse : public Filter {
+class LIBARDOUR_API Reverse : public Filter {
public:
Reverse (ARDOUR::Session&);
~Reverse ();
diff --git a/libs/ardour/ardour/revision.h b/libs/ardour/ardour/revision.h
index 9eeb1e2a9a..69c7519e01 100644
--- a/libs/ardour/ardour/revision.h
+++ b/libs/ardour/ardour/revision.h
@@ -20,8 +20,15 @@
#ifndef __ardour_revision_h__
#define __ardour_revision_h__
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
- extern const char* revision;
+
+ extern LIBARDOUR_API const char* revision;
+
+ extern "C" {
+ LIBARDOUR_API const char* get_ardour_revision();
+ }
}
#endif
diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h
index 83605d7413..6dbdda496c 100644
--- a/libs/ardour/ardour/route.h
+++ b/libs/ardour/ardour/route.h
@@ -43,6 +43,7 @@
#include "ardour/ardour.h"
#include "ardour/instrument_info.h"
#include "ardour/io.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/mute_master.h"
#include "ardour/route_group_member.h"
@@ -53,6 +54,7 @@
namespace ARDOUR {
class Amp;
+class DelayLine;
class Delivery;
class IOProcessor;
class Panner;
@@ -67,7 +69,7 @@ class Pannable;
class CapturingProcessor;
class InternalSend;
-class Route : public SessionObject, public Automatable, public RouteGroupMember, public GraphNode, public boost::enable_shared_from_this<Route>
+class LIBARDOUR_API Route : public SessionObject, public Automatable, public RouteGroupMember, public GraphNode, public boost::enable_shared_from_this<Route>
{
public:
@@ -189,6 +191,7 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember,
PeakMeter& peak_meter() { return *_meter.get(); }
const PeakMeter& peak_meter() const { return *_meter.get(); }
boost::shared_ptr<PeakMeter> shared_peak_meter() const { return _meter; }
+ boost::shared_ptr<DelayLine> delay_line() const { return _delayline; }
void flush_processors ();
@@ -284,6 +287,21 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember,
PBD::Signal1<void,void*> mute_changed;
PBD::Signal0<void> mute_points_changed;
+ /** track numbers - assigned by session
+ * nubers > 0 indicate tracks (audio+midi)
+ * nubers < 0 indicate busses
+ * zero is reserved for unnumbered special busses.
+ * */
+ PBD::Signal0<void> track_number_changed;
+ int64_t track_number() const { return _track_number; }
+
+ void set_track_number(int64_t tn) {
+ if (tn == _track_number) { return; }
+ _track_number = tn;
+ track_number_changed();
+ PropertyChanged (ARDOUR::Properties::name);
+ }
+
/** the processors have changed; the parameter indicates what changed */
PBD::Signal1<void,RouteProcessorChange> processors_changed;
PBD::Signal1<void,void*> record_enable_changed;
@@ -469,11 +487,20 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember,
pframes_t nframes, int declick,
bool gain_automation_ok);
+ virtual void bounce_process (BufferSet& bufs,
+ framepos_t start_frame, framecnt_t nframes,
+ boost::shared_ptr<Processor> endpoint, bool include_endpoint,
+ bool for_export, bool for_freeze);
+
+ framecnt_t bounce_get_latency (boost::shared_ptr<Processor> endpoint, bool include_endpoint, bool for_export, bool for_freeze) const;
+ ChanCount bounce_get_output_streams (ChanCount &cc, boost::shared_ptr<Processor> endpoint, bool include_endpoint, bool for_export, bool for_freeze) const;
+
boost::shared_ptr<IO> _input;
boost::shared_ptr<IO> _output;
bool _active;
framecnt_t _signal_latency;
+ framecnt_t _signal_latency_at_amp_position;
framecnt_t _initial_delay;
framecnt_t _roll_delay;
@@ -538,6 +565,7 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember,
boost::shared_ptr<Amp> _amp;
boost::shared_ptr<PeakMeter> _meter;
+ boost::shared_ptr<DelayLine> _delayline;
boost::shared_ptr<Processor> the_instrument_unlocked() const;
@@ -549,6 +577,8 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember,
bool _has_order_key;
uint32_t _remote_control_id;
+ int64_t _track_number;
+
void input_change_handler (IOChange, void *src);
void output_change_handler (IOChange, void *src);
diff --git a/libs/ardour/ardour/route_graph.h b/libs/ardour/ardour/route_graph.h
index 0b0af6c7dd..77e74ceafd 100644
--- a/libs/ardour/ardour/route_graph.h
+++ b/libs/ardour/ardour/route_graph.h
@@ -37,7 +37,7 @@ typedef boost::shared_ptr<Route> GraphVertex;
*
* This may be a premature optimisation...
*/
-class GraphEdges
+class LIBARDOUR_API GraphEdges
{
public:
typedef std::map<GraphVertex, std::set<GraphVertex> > EdgeMap;
diff --git a/libs/ardour/ardour/route_group.h b/libs/ardour/ardour/route_group.h
index 2f62193d83..763430e1f1 100644
--- a/libs/ardour/ardour/route_group.h
+++ b/libs/ardour/ardour/route_group.h
@@ -29,24 +29,25 @@
#include "pbd/stateful.h"
#include "pbd/signals.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/session_object.h"
namespace ARDOUR {
namespace Properties {
- extern PBD::PropertyDescriptor<bool> relative;
- extern PBD::PropertyDescriptor<bool> active;
- extern PBD::PropertyDescriptor<bool> gain;
- extern PBD::PropertyDescriptor<bool> mute;
- extern PBD::PropertyDescriptor<bool> solo;
- extern PBD::PropertyDescriptor<bool> recenable;
- extern PBD::PropertyDescriptor<bool> select;
- extern PBD::PropertyDescriptor<bool> route_active;
- extern PBD::PropertyDescriptor<bool> color;
- extern PBD::PropertyDescriptor<bool> monitoring;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> relative;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> active;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> gain;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> mute;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> solo;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> recenable;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> select;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> route_active;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> color;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> monitoring;
/* we use this, but its declared in region.cc */
- extern PBD::PropertyDescriptor<bool> hidden;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<bool> hidden;
};
class Route;
@@ -54,7 +55,7 @@ class Track;
class AudioTrack;
class Session;
-class RouteGroup : public SessionObject
+class LIBARDOUR_API RouteGroup : public SessionObject
{
public:
static void make_property_quarks();
diff --git a/libs/ardour/ardour/route_group_member.h b/libs/ardour/ardour/route_group_member.h
index 2665c719e6..b0368cb240 100644
--- a/libs/ardour/ardour/route_group_member.h
+++ b/libs/ardour/ardour/route_group_member.h
@@ -26,7 +26,7 @@ namespace ARDOUR {
class RouteGroup;
-class RouteGroupMember
+class LIBARDOUR_API RouteGroupMember
{
public:
RouteGroupMember () : _route_group (0) {}
diff --git a/libs/ardour/backend_search_path.cc b/libs/ardour/ardour/route_sorters.h
index 9a0425094b..022d5a24c3 100644
--- a/libs/ardour/backend_search_path.cc
+++ b/libs/ardour/ardour/route_sorters.h
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2013 Paul Davis
+ Copyright (C) 2000-2014 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
@@ -17,29 +17,28 @@
*/
-#include <glibmm/miscutils.h>
+#ifndef __libardour_route_sorters_h__
+#define __libardour_route_sorters_h__
-#include "ardour/backend_search_path.h"
-#include "ardour/directory_names.h"
-#include "ardour/filesystem_paths.h"
-
-namespace {
- const char * const backend_env_variable_name = "ARDOUR_BACKEND_PATH";
-} // anonymous
-
-using namespace PBD;
+#include "ardour/route.h"
namespace ARDOUR {
-SearchPath
-backend_search_path ()
-{
- SearchPath spath(user_config_directory ());
- spath += ardour_dll_directory ();
- spath.add_subdirectory_to_paths(backend_dir_name);
-
- spath += SearchPath(Glib::getenv(backend_env_variable_name));
- return spath;
-}
-
-} // namespace ARDOUR
+struct SignalOrderRouteSorter {
+ bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
+ if (a->is_master() || a->is_monitor()) {
+ /* "a" is a special route (master, monitor, etc), and comes
+ * last in the mixer ordering
+ */
+ return false;
+ } else if (b->is_master() || b->is_monitor()) {
+ /* everything comes before b */
+ return true;
+ }
+ return a->order_key () < b->order_key ();
+ }
+};
+
+} // namespace
+
+#endif /* __libardour_route_sorters_h__ */
diff --git a/libs/ardour/ardour/runtime_functions.h b/libs/ardour/ardour/runtime_functions.h
index 8882d721d7..e1d6b99f61 100644
--- a/libs/ardour/ardour/runtime_functions.h
+++ b/libs/ardour/ardour/runtime_functions.h
@@ -20,6 +20,7 @@
#ifndef __ardour_runtime_functions_h__
#define __ardour_runtime_functions_h__
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
namespace ARDOUR {
@@ -30,11 +31,11 @@ namespace ARDOUR {
typedef void (*mix_buffers_with_gain_t) (ARDOUR::Sample *, const ARDOUR::Sample *, pframes_t, float);
typedef void (*mix_buffers_no_gain_t) (ARDOUR::Sample *, const ARDOUR::Sample *, pframes_t);
- extern compute_peak_t compute_peak;
- extern find_peaks_t find_peaks;
- extern apply_gain_to_buffer_t apply_gain_to_buffer;
- extern mix_buffers_with_gain_t mix_buffers_with_gain;
- extern mix_buffers_no_gain_t mix_buffers_no_gain;
+ LIBARDOUR_API extern compute_peak_t compute_peak;
+ LIBARDOUR_API extern find_peaks_t find_peaks;
+ LIBARDOUR_API extern apply_gain_to_buffer_t apply_gain_to_buffer;
+ LIBARDOUR_API extern mix_buffers_with_gain_t mix_buffers_with_gain;
+ LIBARDOUR_API extern mix_buffers_no_gain_t mix_buffers_no_gain;
}
#endif /* __ardour_runtime_functions_h__ */
diff --git a/libs/ardour/ardour/export_formats_search_path.h b/libs/ardour/ardour/scene_change.h
index 7b6fcea09b..1f856beedf 100644
--- a/libs/ardour/ardour/export_formats_search_path.h
+++ b/libs/ardour/ardour/scene_change.h
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2011 Paul Davis
+ Copyright (C) 2014 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
@@ -14,21 +14,30 @@
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_export_formats_search_path_h__
-#define __ardour_export_formats_search_path_h__
+#ifndef __libardour_scene_change_h__
+#define __libardour_scene_change_h__
+
+#include "pbd/stateful.h"
+
+#include "ardour/types.h"
-#include "pbd/search_path.h"
+namespace ARDOUR
+{
-namespace ARDOUR {
+class SceneChange : public PBD::Stateful
+{
+ public:
+ SceneChange () {};
+ virtual ~SceneChange () {};
- /**
- * return a SearchPath containing directories in which to look for
- * export_formats.
- */
- PBD::SearchPath export_formats_search_path ();
+ static boost::shared_ptr<SceneChange> factory (const XMLNode&, int version);
+ static std::string xml_node_name;
+};
-} // namespace ARDOUR
+} /* namespace */
+
-#endif /* __ardour_export_formats_search_path_h__ */
+#endif /* __libardour_scene_change_h__ */
diff --git a/libs/ardour/control_protocol_search_path.cc b/libs/ardour/ardour/scene_changer.h
index 254cd03fe9..e171a23094 100644
--- a/libs/ardour/control_protocol_search_path.cc
+++ b/libs/ardour/ardour/scene_changer.h
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2007 Tim Mayberry
+ Copyright (C) 2014 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
@@ -17,31 +17,41 @@
*/
-#include <iostream>
+#ifndef __libardour_scene_changer_h__
+#define __libardour_scene_changer_h__
-#include <glibmm/miscutils.h>
+#include <map>
-#include "ardour/control_protocol_search_path.h"
-#include "ardour/directory_names.h"
-#include "ardour/filesystem_paths.h"
+#include "pbd/signals.h"
-namespace {
- const char * const surfaces_env_variable_name = "ARDOUR_SURFACES_PATH";
-} // anonymous
+#include "ardour/location.h"
+#include "ardour/midi_scene_change.h"
+#include "ardour/session_handle.h"
+#include "ardour/types.h"
-using namespace PBD;
+namespace MIDI
+{
+class Parser;
+class Port;
+}
+
+namespace ARDOUR
+{
-namespace ARDOUR {
+class Session;
+class AsyncMidiPort;
-SearchPath
-control_protocol_search_path ()
+class SceneChanger : public SessionHandleRef
{
- SearchPath spath(user_config_directory ());
- spath += ardour_dll_directory ();
- spath.add_subdirectory_to_paths (surfaces_dir_name);
+ public:
+ SceneChanger (Session& s) : SessionHandleRef (s) {}
+ virtual ~SceneChanger () {};
+
+ virtual void run (framepos_t start, framepos_t end) = 0;
+ virtual void locate (framepos_t where) = 0;
+};
+
+} /* namespace */
- spath += SearchPath(Glib::getenv(surfaces_env_variable_name));
- return spath;
-}
-} // namespace ARDOUR
+#endif /* __libardour_scene_change_h__ */
diff --git a/libs/ardour/ardour/search_paths.h b/libs/ardour/ardour/search_paths.h
new file mode 100644
index 0000000000..1815bc077c
--- /dev/null
+++ b/libs/ardour/ardour/search_paths.h
@@ -0,0 +1,112 @@
+/*
+ Copyright (C) 2011 Tim Mayberry
+ Copyright (C) 2013 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 __libardour_search_paths_h__
+#define __libardour_search_paths_h__
+
+#include "ardour/libardour_visibility.h"
+
+#include "pbd/search_path.h"
+
+namespace ARDOUR {
+
+ LIBARDOUR_API const char *vst_search_path ();
+
+ /**
+ * return a SearchPath containing directories in which to look for
+ * backend plugins.
+ *
+ * If ARDOUR_BACKEND_PATH is defined then the SearchPath returned
+ * will contain only those directories specified in it, otherwise it will
+ * contain the user and system directories which may contain audio/MIDI
+ * backends.
+ */
+ LIBARDOUR_API PBD::Searchpath backend_search_path ();
+
+ /**
+ * return a Searchpath containing directories in which to look for
+ * control surface plugins.
+ *
+ * If ARDOUR_SURFACES_PATH is defined then the Searchpath returned
+ * will contain only those directories specified in it, otherwise it will
+ * contain the user and system directories which may contain control
+ * surface plugins.
+ */
+ LIBARDOUR_API PBD::Searchpath control_protocol_search_path ();
+
+ /**
+ * return a Searchpath containing directories in which to look for
+ * export_formats.
+ */
+ LIBARDOUR_API PBD::Searchpath export_formats_search_path ();
+
+ /**
+ * return a Searchpath containing directories in which to look for
+ * LADSPA plugins.
+ *
+ * If LADSPA_PATH is defined then the Searchpath returned
+ * will contain the directories specified in it as well as the
+ * user and system directories.
+ */
+ LIBARDOUR_API PBD::Searchpath ladspa_search_path ();
+
+ /**
+ * return a Searchpath containing directories in which to look for
+ * lv2 plugins.
+ */
+ LIBARDOUR_API PBD::Searchpath lv2_bundled_search_path ();
+
+ /**
+ * return a Searchpath containing directories in which to look for
+ * MIDI patch files ("*.midnam") aka MIDNAM files
+ *
+ * If ARDOUR_MIDI_PATCH_PATH is defined then the Searchpath returned
+ * will contain only those directories specified in it, otherwise it will
+ * contain the user and system directories which may contain control
+ * surface plugins.
+ */
+ LIBARDOUR_API PBD::Searchpath midi_patch_search_path ();
+
+ /**
+ * return a Searchpath containing directories in which to look for
+ * panner plugins.
+ *
+ * If ARDOUR_PANNER_PATH is defined then the Searchpath returned
+ * will contain only those directories specified in it, otherwise it will
+ * contain the user and system directories which may contain control
+ * surface plugins.
+ */
+ LIBARDOUR_API PBD::Searchpath panner_search_path ();
+
+ /**
+ * return a Searchpath containing directories in which to look for
+ * route templates.
+ */
+ LIBARDOUR_API PBD::Searchpath route_template_search_path ();
+
+ /**
+ * return a Searchpath containing directories in which to look for
+ * other templates.
+ */
+ LIBARDOUR_API PBD::Searchpath template_search_path ();
+
+} // namespace ARDOUR
+
+#endif /* __libardour_search_paths_h__ */
diff --git a/libs/ardour/ardour/send.h b/libs/ardour/ardour/send.h
index 6e2775286d..17343bff96 100644
--- a/libs/ardour/ardour/send.h
+++ b/libs/ardour/ardour/send.h
@@ -26,13 +26,14 @@
#include "ardour/ardour.h"
#include "ardour/delivery.h"
+#include "ardour/delayline.h"
namespace ARDOUR {
class PeakMeter;
class Amp;
-class Send : public Delivery
+class LIBARDOUR_API Send : public Delivery
{
public:
Send (Session&, boost::shared_ptr<Pannable> pannable, boost::shared_ptr<MuteMaster>, Delivery::Role r = Delivery::Send, bool ignore_bitslot = false);
@@ -59,6 +60,12 @@ class Send : public Delivery
bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
bool configure_io (ChanCount in, ChanCount out);
+ /* latency compensation */
+ void set_delay_in (framecnt_t);
+ void set_delay_out (framecnt_t);
+ framecnt_t get_delay_in () const { return _delay_in; }
+ framecnt_t get_delay_out () const { return _delay_out; }
+
void activate ();
void deactivate ();
@@ -73,6 +80,7 @@ class Send : public Delivery
bool _metering;
boost::shared_ptr<Amp> _amp;
boost::shared_ptr<PeakMeter> _meter;
+ boost::shared_ptr<DelayLine> _delayline;
private:
/* disallow copy construction */
@@ -82,6 +90,9 @@ class Send : public Delivery
int set_state_2X (XMLNode const &, int);
uint32_t _bitslot;
+
+ framecnt_t _delay_in;
+ framecnt_t _delay_out;
};
} // namespace ARDOUR
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index b93f932cc0..03eccd40a3 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -129,6 +129,7 @@ class Route;
class RouteGroup;
class SMFSource;
class Send;
+class SceneChanger;
class SessionDirectory;
class SessionMetadata;
class SessionPlaylists;
@@ -141,7 +142,7 @@ class WindowsVSTPlugin;
extern void setup_enum_writer ();
-class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionList, public SessionEventManager
+class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionList, public SessionEventManager
{
public:
enum RecordState {
@@ -236,7 +237,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
return _bundles.reader ();
}
- struct RoutePublicOrderSorter {
+ struct LIBARDOUR_API RoutePublicOrderSorter {
bool operator() (boost::shared_ptr<Route>, boost::shared_ptr<Route> b);
};
@@ -259,6 +260,10 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
bool route_name_unique (std::string) const;
bool route_name_internal (std::string) const;
+ uint32_t track_number_decimals () const {
+ return _track_number_decimals;
+ }
+
bool get_record_enabled() const {
return (record_status () >= Enabled);
}
@@ -396,13 +401,14 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
int rename (const std::string&);
bool get_nsm_state () const { return _under_nsm_control; }
void set_nsm_state (bool state) { _under_nsm_control = state; }
+ bool save_default_options ();
PBD::Signal1<void,std::string> StateSaved;
PBD::Signal0<void> StateReady;
PBD::Signal0<void> SaveSession;
- std::vector<std::string*>* possible_states() const;
- static std::vector<std::string*>* possible_states (std::string path);
+ std::vector<std::string> possible_states() const;
+ static std::vector<std::string> possible_states (std::string path);
XMLNode& get_state();
int set_state(const XMLNode& node, int version); // not idempotent
@@ -424,6 +430,23 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
StateOfTheState state_of_the_state() const { return _state_of_the_state; }
+ class StateProtector {
+ public:
+ StateProtector (Session* s) : _session (s) {
+ g_atomic_int_inc (&s->_suspend_save);
+ }
+ ~StateProtector () {
+ if (g_atomic_int_dec_and_test (&_session->_suspend_save)) {
+ while (_session->_save_queued) {
+ _session->_save_queued = false;
+ _session->save_state ("");
+ }
+ }
+ }
+ private:
+ Session * _session;
+ };
+
void add_route_group (RouteGroup *);
void remove_route_group (RouteGroup&);
void reorder_route_groups (std::list<RouteGroup*>);
@@ -605,7 +628,8 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
boost::shared_ptr<Region> write_one_track (AudioTrack&, framepos_t start, framepos_t end,
bool overwrite, std::vector<boost::shared_ptr<Source> >&, InterThreadInfo& wot,
- boost::shared_ptr<Processor> endpoint, bool include_endpoint, bool for_export);
+ boost::shared_ptr<Processor> endpoint,
+ bool include_endpoint, bool for_export, bool for_freeze);
int freeze_all (InterThreadInfo&);
/* session-wide solo/mute/rec-enable */
@@ -753,6 +777,10 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
/* VST support */
+ static int vst_current_loading_id;
+ static const char* vst_can_do_strings[];
+ static const int vst_can_do_string_count;
+
static intptr_t vst_callback (
AEffect* effect,
int32_t opcode,
@@ -784,6 +812,10 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
return _exporting;
}
+ bool bounce_processing() const {
+ return _bounce_processing_active;
+ }
+
/* this is a private enum, but setup_enum_writer() needs it,
and i can't find a way to give that function
friend access. sigh.
@@ -827,7 +859,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
void request_resume_timecode_transmission ();
bool timecode_transmission_suspended () const;
- std::string source_search_path(DataType) const;
+ std::vector<std::string> source_search_path(DataType) const;
void ensure_search_path_includes (const std::string& path, DataType type);
std::list<std::string> unknown_processors () const;
@@ -862,23 +894,31 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
*/
static PBD::Signal2<void,std::string,std::string> VersionMismatch;
+ SceneChanger* scene_changer() const { return _scene_changer; }
+
boost::shared_ptr<Port> ltc_input_port() const;
boost::shared_ptr<Port> ltc_output_port() const;
boost::shared_ptr<IO> ltc_input_io() { return _ltc_input; }
boost::shared_ptr<IO> ltc_output_io() { return _ltc_output; }
- MIDI::Port* midi_input_port () const;
- MIDI::Port* midi_output_port () const;
- MIDI::Port* mmc_output_port () const;
- MIDI::Port* mmc_input_port () const;
+ MIDI::Port* midi_input_port () const;
+ MIDI::Port* midi_output_port () const;
+ MIDI::Port* mmc_output_port () const;
+ MIDI::Port* mmc_input_port () const;
- boost::shared_ptr<MidiPort> midi_clock_output_port () const;
- boost::shared_ptr<MidiPort> midi_clock_input_port () const;
- boost::shared_ptr<MidiPort> mtc_output_port () const;
- boost::shared_ptr<MidiPort> mtc_input_port () const;
+ MIDI::Port* scene_input_port () const;
+ MIDI::Port* scene_output_port () const;
- MIDI::MachineControl& mmc() { return *_mmc; }
+ boost::shared_ptr<MidiPort> scene_in () const;
+ boost::shared_ptr<MidiPort> scene_out () const;
+
+ boost::shared_ptr<MidiPort> midi_clock_output_port () const;
+ boost::shared_ptr<MidiPort> midi_clock_input_port () const;
+ boost::shared_ptr<MidiPort> mtc_output_port () const;
+ boost::shared_ptr<MidiPort> mtc_input_port () const;
+
+ MIDI::MachineControl& mmc() { return *_mmc; }
protected:
friend class AudioEngine;
@@ -913,6 +953,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
mutable gint processing_prohibited;
process_function_type process_function;
process_function_type last_process_function;
+ bool _bounce_processing_active;
bool waiting_for_sync_offset;
framecnt_t _base_frame_rate;
framecnt_t _current_frame_rate; //this includes video pullup offset
@@ -967,13 +1008,15 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
void process_without_events (pframes_t);
void process_with_events (pframes_t);
void process_audition (pframes_t);
- int process_export (pframes_t);
+ int process_export (pframes_t);
int process_export_fw (pframes_t);
void block_processing() { g_atomic_int_set (&processing_prohibited, 1); }
void unblock_processing() { g_atomic_int_set (&processing_prohibited, 0); }
bool processing_blocked() const { return g_atomic_int_get (&processing_prohibited); }
+ static const framecnt_t bounce_chunk_size;
+
/* slave tracking */
static const int delta_accumulator_size = 25;
@@ -1072,6 +1115,10 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
bool state_was_pending;
StateOfTheState _state_of_the_state;
+ friend class StateProtector;
+ gint _suspend_save; /* atomic */
+ volatile bool _save_queued;
+
void auto_save();
int load_options (const XMLNode&);
int load_state (std::string snapshot_name);
@@ -1256,7 +1303,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
int start_midi_thread ();
- void set_play_loop (bool yn);
+ void set_play_loop (bool yn, double speed);
void unset_play_loop ();
void overwrite_some_buffers (Track *);
void flush_all_inserts ();
@@ -1319,6 +1366,11 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
ChanCount input_start = ChanCount (), ChanCount output_start = ChanCount ());
void midi_output_change_handler (IOChange change, void* /*src*/, boost::weak_ptr<Route> midi_track);
+ /* track numbering */
+
+ void reassign_track_numbers ();
+ uint32_t _track_number_decimals;
+
/* mixer stuff */
bool solo_update_disabled;
@@ -1601,18 +1653,22 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
void reconnect_ltc_input ();
void reconnect_ltc_output ();
- /* persistent, non-track related MIDI ports */
- MidiPortManager* _midi_ports;
- MIDI::MachineControl* _mmc;
-
- void setup_ltc ();
- void setup_click ();
- void setup_click_state (const XMLNode*);
- void setup_bundles ();
-
- static int get_session_info_from_path (XMLTree& state_tree, const std::string& xmlpath);
+ /* Scene Changing */
+ SceneChanger* _scene_changer;
+
+ /* persistent, non-track related MIDI ports */
+ MidiPortManager* _midi_ports;
+ MIDI::MachineControl* _mmc;
+
+ void setup_ltc ();
+ void setup_click ();
+ void setup_click_state (const XMLNode*);
+ void setup_bundles ();
+
+ static int get_session_info_from_path (XMLTree& state_tree, const std::string& xmlpath);
};
+
} // namespace ARDOUR
#endif /* __ardour_session_h__ */
diff --git a/libs/ardour/ardour/session_configuration.h b/libs/ardour/ardour/session_configuration.h
index 46d6defa7d..c0af223943 100644
--- a/libs/ardour/ardour/session_configuration.h
+++ b/libs/ardour/ardour/session_configuration.h
@@ -24,7 +24,7 @@
namespace ARDOUR {
-class SessionConfiguration : public Configuration
+class LIBARDOUR_API SessionConfiguration : public Configuration
{
public:
SessionConfiguration ();
@@ -35,6 +35,9 @@ public:
XMLNode& get_variables ();
void set_variables (XMLNode const &);
+ bool load_state ();
+ bool save_state ();
+
/* define accessor methods */
#undef CONFIG_VARIABLE
diff --git a/libs/ardour/ardour/session_configuration_vars.h b/libs/ardour/ardour/session_configuration_vars.h
index 6349692e77..ec11fc545d 100644
--- a/libs/ardour/ardour/session_configuration_vars.h
+++ b/libs/ardour/ardour/session_configuration_vars.h
@@ -25,7 +25,6 @@
the value of the variable.
*****************************************************/
-CONFIG_VARIABLE (CrossfadeChoice, xfade_choice, "xfade-choice", ConstantPowerMinus3dB)
CONFIG_VARIABLE (uint32_t, destructive_xfade_msecs, "destructive-xfade-msecs", 2)
CONFIG_VARIABLE (bool, use_region_fades, "use-region-fades", true)
CONFIG_VARIABLE (bool, show_region_fades, "show-region-fades", true)
@@ -41,6 +40,9 @@ CONFIG_VARIABLE (Timecode::TimecodeFormat, timecode_format, "timecode-format", T
CONFIG_VARIABLE_SPECIAL(std::string, raid_path, "raid-path", "", PBD::path_expand)
CONFIG_VARIABLE_SPECIAL(std::string, audio_search_path, "audio-search-path", "", PBD::search_path_expand)
CONFIG_VARIABLE_SPECIAL(std::string, midi_search_path, "midi-search-path", "", PBD::search_path_expand)
+CONFIG_VARIABLE (bool, track_name_number, "track-name-number", false)
+CONFIG_VARIABLE (bool, track_name_take, "track-name-take", false)
+CONFIG_VARIABLE (std::string, take_name, "take-name", "Take1")
CONFIG_VARIABLE (bool, jack_time_master, "jack-time-master", true)
CONFIG_VARIABLE (bool, use_video_sync, "use-video-sync", false)
CONFIG_VARIABLE (float, video_pullup, "video-pullup", 0.0f)
diff --git a/libs/ardour/ardour/session_directory.h b/libs/ardour/ardour/session_directory.h
index a4c372d6ed..685f0870dd 100644
--- a/libs/ardour/ardour/session_directory.h
+++ b/libs/ardour/ardour/session_directory.h
@@ -22,9 +22,11 @@
#include <string>
#include <vector>
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
-class SessionDirectory
+class LIBARDOUR_API SessionDirectory
{
public:
diff --git a/libs/ardour/ardour/session_event.h b/libs/ardour/ardour/session_event.h
index ccec43d909..1283f32004 100644
--- a/libs/ardour/ardour/session_event.h
+++ b/libs/ardour/ardour/session_event.h
@@ -28,6 +28,7 @@
#include "pbd/ringbuffer.h"
#include "pbd/event_loop.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
namespace ARDOUR {
@@ -35,7 +36,7 @@ namespace ARDOUR {
class Slave;
class Region;
-class SessionEvent {
+class LIBARDOUR_API SessionEvent {
public:
enum Type {
SetTransportSpeed,
@@ -108,7 +109,7 @@ public:
boost::shared_ptr<Region> region;
- SessionEvent (Type t, Action a, framepos_t when, framepos_t where, double spd, bool yn = false, bool yn2 = false, bool yn3 = false)
+ SessionEvent (Type t, Action a, framepos_t when, framepos_t where, double spd, bool yn = false, bool yn2 = false, bool yn3 = false)
: type (t)
, action (a)
, action_frame (when)
diff --git a/libs/ardour/ardour/session_handle.h b/libs/ardour/ardour/session_handle.h
index 0331970e5c..330f1805cd 100644
--- a/libs/ardour/ardour/session_handle.h
+++ b/libs/ardour/ardour/session_handle.h
@@ -22,10 +22,12 @@
#include "pbd/signals.h"
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
class Session;
-class SessionHandleRef : public PBD::ScopedConnectionList
+class LIBARDOUR_API SessionHandleRef : public PBD::ScopedConnectionList
{
public:
SessionHandleRef (ARDOUR::Session& s);
@@ -37,7 +39,7 @@ class SessionHandleRef : public PBD::ScopedConnectionList
virtual void insanity_check ();
};
-class SessionHandlePtr
+class LIBARDOUR_API SessionHandlePtr
{
public:
SessionHandlePtr (ARDOUR::Session* s);
diff --git a/libs/ardour/ardour/session_metadata.h b/libs/ardour/ardour/session_metadata.h
index c4341dbc61..b163e98f65 100644
--- a/libs/ardour/ardour/session_metadata.h
+++ b/libs/ardour/ardour/session_metadata.h
@@ -28,13 +28,15 @@
#include "pbd/statefuldestructible.h"
#include "pbd/xml++.h"
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
/** Represents metadata associated to a Session
* Metadata can be accessed and edited via this class.
* Exported files can also be tagged with this data.
*/
-class SessionMetadata : public PBD::StatefulDestructible
+class LIBARDOUR_API SessionMetadata : public PBD::StatefulDestructible
{
public:
//singleton instance:
diff --git a/libs/ardour/ardour/session_object.h b/libs/ardour/ardour/session_object.h
index eacb0c49e9..ac74f07b77 100644
--- a/libs/ardour/ardour/session_object.h
+++ b/libs/ardour/ardour/session_object.h
@@ -31,7 +31,7 @@
namespace ARDOUR {
namespace Properties {
- extern PBD::PropertyDescriptor<std::string> name;
+ LIBARDOUR_API extern PBD::PropertyDescriptor<std::string> name;
}
class Session;
@@ -40,7 +40,7 @@ class Session;
expected to be destroyed before the session calls drop_references().
*/
-class SessionObject : public SessionHandleRef, public PBD::StatefulDestructible
+class LIBARDOUR_API SessionObject : public SessionHandleRef, public PBD::StatefulDestructible
{
public:
static void make_property_quarks ();
diff --git a/libs/ardour/ardour/session_playlists.h b/libs/ardour/ardour/session_playlists.h
index 83dc8ee58c..e7ad1624dd 100644
--- a/libs/ardour/ardour/session_playlists.h
+++ b/libs/ardour/ardour/session_playlists.h
@@ -44,7 +44,7 @@ class Session;
class Crossfade;
class Track;
-class SessionPlaylists : public PBD::ScopedConnectionList
+class LIBARDOUR_API SessionPlaylists : public PBD::ScopedConnectionList
{
public:
~SessionPlaylists ();
diff --git a/libs/ardour/ardour/session_state_utils.h b/libs/ardour/ardour/session_state_utils.h
index 166b738d05..f35bbd0778 100644
--- a/libs/ardour/ardour/session_state_utils.h
+++ b/libs/ardour/ardour/session_state_utils.h
@@ -22,6 +22,8 @@
#include <vector>
#include <string>
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
/**
@@ -32,7 +34,7 @@ namespace ARDOUR {
*
* @return true if successful, false otherwise.
*/
-bool create_backup_file (const std::string & file_path);
+LIBARDOUR_API bool create_backup_file (const std::string & file_path);
/**
* Get the absolute paths to all state files in the directory
@@ -41,8 +43,8 @@ bool create_backup_file (const std::string & file_path);
* @param directory_path The absolute path to a directory.
* @param result vector to contain resulting state files.
*/
-void get_state_files_in_directory (const std::string& directory_path,
- std::vector<std::string>& result);
+LIBARDOUR_API void get_state_files_in_directory (const std::string& directory_path,
+ std::vector<std::string>& result);
/**
* Given a vector of paths to files, return a vector containing
@@ -52,7 +54,7 @@ void get_state_files_in_directory (const std::string& directory_path,
* @return a vector containing a list of file names without any
* filename extension.
*/
-std::vector<std::string> get_file_names_no_extension (const std::vector<std::string> & file_paths);
+LIBARDOUR_API std::vector<std::string> get_file_names_no_extension (const std::vector<std::string> & file_paths);
} // namespace ARDOUR
diff --git a/libs/ardour/ardour/session_utils.h b/libs/ardour/ardour/session_utils.h
index ab24e976b2..bd9cc92267 100644
--- a/libs/ardour/ardour/session_utils.h
+++ b/libs/ardour/ardour/session_utils.h
@@ -23,9 +23,11 @@
#include <string>
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
-int find_session (std::string str, std::string& path, std::string& snapshot, bool& isnew);
+ LIBARDOUR_API extern int find_session (std::string str, std::string& path, std::string& snapshot, bool& isnew);
};
diff --git a/libs/ardour/ardour/silentfilesource.h b/libs/ardour/ardour/silentfilesource.h
index 5cdade3751..cf6462247a 100644
--- a/libs/ardour/ardour/silentfilesource.h
+++ b/libs/ardour/ardour/silentfilesource.h
@@ -25,13 +25,14 @@
namespace ARDOUR {
-class SilentFileSource : public AudioFileSource {
+class LIBARDOUR_API SilentFileSource : public AudioFileSource {
public:
int update_header (framepos_t /*when*/, struct tm&, time_t) { return 0; }
int flush_header () { return 0; }
float sample_rate () const { return _sample_rate; }
void set_length (framecnt_t len) { _length = len; }
+ void flush () {}
bool destructive() const { return false; }
bool can_be_analysed() const { return false; }
@@ -59,7 +60,7 @@ protected:
void set_header_timeline_position () {}
int read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t /*start*/, framecnt_t /*cnt*/,
- double /*samples_per_unit*/, framecnt_t /*fpp*/) const {
+ double /*frames_per_pixel*/, framecnt_t /*fpp*/) const {
memset (peaks, 0, sizeof (PeakData) * npeaks);
return 0;
}
diff --git a/libs/ardour/ardour/slave.h b/libs/ardour/ardour/slave.h
index 364929eaab..6df10c3f9a 100644
--- a/libs/ardour/ardour/slave.h
+++ b/libs/ardour/ardour/slave.h
@@ -24,13 +24,13 @@
#include <glibmm/threads.h>
-#include <jack/jack.h>
#include <ltc.h>
#include "pbd/signals.h"
#include "timecode/time.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "midi++/parser.h"
#include "midi++/types.h"
@@ -59,7 +59,7 @@ class MidiPort;
* Therefore it is rather that class, that makes ARDOUR a slave by connecting it
* to its external time master.
*/
-class Slave {
+class LIBARDOUR_API Slave {
public:
Slave() { }
virtual ~Slave() {}
@@ -180,7 +180,7 @@ class Slave {
};
/// We need this wrapper for testability, it's just too hard to mock up a session class
-class ISlaveSessionProxy {
+class LIBARDOUR_API ISlaveSessionProxy {
public:
virtual ~ISlaveSessionProxy() {}
virtual TempoMap& tempo_map() const { return *((TempoMap *) 0); }
@@ -200,7 +200,7 @@ class ISlaveSessionProxy {
/// The Session Proxy for use in real Ardour
-class SlaveSessionProxy : public ISlaveSessionProxy {
+class LIBARDOUR_API SlaveSessionProxy : public ISlaveSessionProxy {
Session& session;
public:
@@ -219,7 +219,7 @@ class SlaveSessionProxy : public ISlaveSessionProxy {
void request_transport_speed (double speed);
};
-struct SafeTime {
+struct LIBARDOUR_API SafeTime {
volatile int guard1;
framepos_t position;
framepos_t timestamp;
@@ -235,7 +235,7 @@ struct SafeTime {
}
};
-class TimecodeSlave : public Slave {
+class LIBARDOUR_API TimecodeSlave : public Slave {
public:
TimecodeSlave () {}
@@ -252,7 +252,7 @@ class TimecodeSlave : public Slave {
bool timecode_negative_offset;
};
-class MTC_Slave : public TimecodeSlave {
+class LIBARDOUR_API MTC_Slave : public TimecodeSlave {
public:
MTC_Slave (Session&, MidiPort&);
~MTC_Slave ();
@@ -336,7 +336,7 @@ class MTC_Slave : public TimecodeSlave {
void parameter_changed(std::string const & p);
};
-class LTC_Slave : public TimecodeSlave {
+class LIBARDOUR_API LTC_Slave : public TimecodeSlave {
public:
LTC_Slave (Session&);
~LTC_Slave ();
@@ -404,7 +404,7 @@ public:
double b, c; ///< DLL filter coefficients
};
-class MIDIClock_Slave : public Slave {
+class LIBARDOUR_API MIDIClock_Slave : public Slave {
public:
MIDIClock_Slave (Session&, MidiPort&, int ppqn = 24);
@@ -490,7 +490,7 @@ class MIDIClock_Slave : public Slave {
bool _starting;
};
-class Engine_Slave : public Slave
+class LIBARDOUR_API Engine_Slave : public Slave
{
public:
Engine_Slave (AudioEngine&);
diff --git a/libs/ardour/ardour/smf_source.h b/libs/ardour/ardour/smf_source.h
index f359100451..84c45f9b3c 100644
--- a/libs/ardour/ardour/smf_source.h
+++ b/libs/ardour/ardour/smf_source.h
@@ -34,7 +34,7 @@ namespace ARDOUR {
template<typename T> class MidiRingBuffer;
/** Standard Midi File (Type 0) Source */
-class SMFSource : public MidiSource, public FileSource, public Evoral::SMF {
+class LIBARDOUR_API SMFSource : public MidiSource, public FileSource, public Evoral::SMF {
public:
/** Constructor for new internal-to-session files */
SMFSource (Session& session, const std::string& path, Source::Flag flags);
diff --git a/libs/ardour/ardour/sndfileimportable.h b/libs/ardour/ardour/sndfileimportable.h
index 8612e264c4..10c429c545 100644
--- a/libs/ardour/ardour/sndfileimportable.h
+++ b/libs/ardour/ardour/sndfileimportable.h
@@ -22,12 +22,13 @@
#include <boost/shared_ptr.hpp>
#include <sndfile.h>
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/importable_source.h"
namespace ARDOUR {
-class SndFileImportableSource : public ImportableSource {
+class LIBARDOUR_API SndFileImportableSource : public ImportableSource {
public:
SndFileImportableSource (const std::string& path);
virtual ~SndFileImportableSource();
diff --git a/libs/ardour/ardour/sndfilesource.h b/libs/ardour/ardour/sndfilesource.h
index 9604d3f232..831f8db5f7 100644
--- a/libs/ardour/ardour/sndfilesource.h
+++ b/libs/ardour/ardour/sndfilesource.h
@@ -28,7 +28,7 @@
namespace ARDOUR {
-class SndFileSource : public AudioFileSource {
+class LIBARDOUR_API SndFileSource : public AudioFileSource {
public:
/** Constructor to be called for existing external-to-session files */
SndFileSource (Session&, const std::string& path, int chn, Flag flags);
@@ -55,6 +55,7 @@ class SndFileSource : public AudioFileSource {
float sample_rate () const;
int update_header (framepos_t when, struct tm&, time_t);
int flush_header ();
+ void flush ();
framepos_t natural_position () const;
diff --git a/libs/ardour/ardour/soundcloud_upload.h b/libs/ardour/ardour/soundcloud_upload.h
new file mode 100644
index 0000000000..c1074f016b
--- /dev/null
+++ b/libs/ardour/ardour/soundcloud_upload.h
@@ -0,0 +1,55 @@
+/* soundcloud_upload.h ******************************************************
+
+ Adapted for Ardour by Ben Loftis, March 2012
+
+*****************************************************************************/
+
+#ifndef __ardour_soundcloud_upload_h__
+#define __ardour_soundcloud_upload_h__
+
+#include <string>
+#include <fstream>
+#include <iostream>
+#include <stdio.h>
+#include <cstring>
+#include <string>
+#include <sstream>
+#include <vector>
+
+#include "curl/curl.h"
+#include "ardour/session_handle.h"
+#include "ardour/export_handler.h"
+#include "pbd/signals.h"
+
+//--- struct to store XML file
+struct MemoryStruct {
+ char *memory;
+ size_t size;
+};
+
+
+class SoundcloudUploader
+{
+public:
+ SoundcloudUploader();
+ ~SoundcloudUploader();
+
+ std::string Get_Auth_Token(std::string username, std::string password);
+ std::string Upload (std::string file_path, std::string title, std::string token, bool ispublic, bool downloadable, ARDOUR::ExportHandler *caller);
+ static int progress_callback(void *caller, double dltotal, double dlnow, double ultotal, double ulnow);
+
+
+private:
+
+ void setcUrlOptions();
+
+ CURL *curl_handle;
+ CURLM *multi_handle;
+ char errorBuffer[CURL_ERROR_SIZE]; // storage for cUrl error message
+
+ std::string title;
+ ARDOUR::ExportHandler *caller;
+
+};
+
+#endif /* __ardour_soundcloud_upload_h__ */
diff --git a/libs/ardour/ardour/soundseq.h b/libs/ardour/ardour/soundseq.h
index ff8e96ad8f..02425a71cf 100644
--- a/libs/ardour/ardour/soundseq.h
+++ b/libs/ardour/ardour/soundseq.h
@@ -26,21 +26,21 @@ namespace ARDOUR {
typedef gint16 peak_datum;
-struct peak_data_t {
+struct LIBARDOUR_API peak_data_t {
peak_datum min;
peak_datum max;
};
const uint32_t frames_per_peak = 2048;
-class Sound : public EDL::Piece {
+class LIBARDOUR_API Sound : public EDL::Piece {
public:
int peak (peak_data_t& pk, uint32_t start, uint32_t cnt);
int read_peaks (peak_data_t *, uint32_t npeaks, uint32_t start, uint32_t cnt);
int build_peak (uint32_t first_frame, uint32_t cnt);
};
-class SoundPlaylist : public EDL::Playlist {
+class LIBARDOUR_API SoundPlaylist : public EDL::Playlist {
public:
int read_peaks (peak_data_t *, uint32_t npeaks, uint32_t start, uint32_t cnt);
};
diff --git a/libs/ardour/ardour/source.h b/libs/ardour/ardour/source.h
index 5e851702d4..78b3cfaa21 100644
--- a/libs/ardour/ardour/source.h
+++ b/libs/ardour/ardour/source.h
@@ -36,7 +36,7 @@ namespace ARDOUR {
class Session;
-class Source : public SessionObject
+class LIBARDOUR_API Source : public SessionObject
{
public:
enum Flag {
diff --git a/libs/ardour/ardour/source_factory.h b/libs/ardour/ardour/source_factory.h
index ce0f86bb6b..614fdce7b1 100644
--- a/libs/ardour/ardour/source_factory.h
+++ b/libs/ardour/ardour/source_factory.h
@@ -36,7 +36,7 @@ class Session;
class AudioSource;
class Playlist;
-class SourceFactory {
+class LIBARDOUR_API SourceFactory {
public:
static void init ();
diff --git a/libs/ardour/ardour/speaker.h b/libs/ardour/ardour/speaker.h
index 3deeb8b0d9..c643eb5d02 100644
--- a/libs/ardour/ardour/speaker.h
+++ b/libs/ardour/ardour/speaker.h
@@ -22,9 +22,11 @@
#include "pbd/cartesian.h"
#include "pbd/signals.h"
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
-class Speaker {
+class LIBARDOUR_API Speaker {
public:
Speaker (int, const PBD::AngularVector& position);
Speaker (const Speaker &);
diff --git a/libs/ardour/ardour/speakers.h b/libs/ardour/ardour/speakers.h
index dbe4ef180e..cde2c40dbb 100644
--- a/libs/ardour/ardour/speakers.h
+++ b/libs/ardour/ardour/speakers.h
@@ -31,7 +31,7 @@ class XMLNode;
namespace ARDOUR {
-class Speakers : public PBD::Stateful {
+class LIBARDOUR_API Speakers : public PBD::Stateful {
public:
Speakers ();
Speakers (const Speakers&);
diff --git a/libs/ardour/ardour/spline.h b/libs/ardour/ardour/spline.h
index 6a12e96d52..475441fd44 100644
--- a/libs/ardour/ardour/spline.h
+++ b/libs/ardour/ardour/spline.h
@@ -28,7 +28,7 @@ extern "C" {
typedef struct _spline Spline;
typedef struct _spline_point SplinePoint;
-struct _spline_point
+struct LIBARDOUR_API _spline_point
{
float x;
float y;
@@ -45,7 +45,7 @@ void spline_fill (Spline *, float x0, float x1, float *vec, uint32_t veclen);
float spline_get_max_x (Spline *);
float spline_get_min_x (Spline *);
-struct _spline
+struct LIBARDOUR_API _spline
{
float *deriv2;
float *x;
diff --git a/libs/ardour/ardour/srcfilesource.h b/libs/ardour/ardour/srcfilesource.h
index 0b0865acc6..78564c8b88 100644
--- a/libs/ardour/ardour/srcfilesource.h
+++ b/libs/ardour/ardour/srcfilesource.h
@@ -23,18 +23,21 @@
#include <cstring>
#include <samplerate.h>
+
+#include "ardour/libardour_visibility.h"
#include "ardour/audiofilesource.h"
#include "ardour/session.h"
namespace ARDOUR {
-class SrcFileSource : public AudioFileSource {
+class LIBARDOUR_API SrcFileSource : public AudioFileSource {
public:
SrcFileSource (Session&, boost::shared_ptr<AudioFileSource>, SrcQuality srcq = SrcQuality(SrcQuick));
~SrcFileSource ();
- int update_header (framepos_t /*when*/, struct tm&, time_t) { return 0; }
- int flush_header () { return 0; }
+ int update_header (framepos_t /*when*/, struct tm&, time_t) { return 0; }
+ int flush_header () { return 0; }
+ void flush () { }
void set_header_timeline_position () {};
void set_length (framecnt_t /*len*/) {};
diff --git a/libs/ardour/ardour/stretch.h b/libs/ardour/ardour/stretch.h
index 066ed7861a..edca5fc44b 100644
--- a/libs/ardour/ardour/stretch.h
+++ b/libs/ardour/ardour/stretch.h
@@ -33,7 +33,7 @@
namespace ARDOUR {
-class RBStretch : public RBEffect {
+class LIBARDOUR_API RBStretch : public RBEffect {
public:
RBStretch (ARDOUR::Session&, TimeFXRequest&);
~RBStretch() {}
@@ -47,7 +47,7 @@ class RBStretch : public RBEffect {
namespace ARDOUR {
-class STStretch : public Filter {
+class LIBARDOUR_API STStretch : public Filter {
public:
STStretch (ARDOUR::Session&, TimeFXRequest&);
~STStretch ();
diff --git a/libs/ardour/ardour/strip_silence.h b/libs/ardour/ardour/strip_silence.h
index eed4320173..59f4ea0a57 100644
--- a/libs/ardour/ardour/strip_silence.h
+++ b/libs/ardour/ardour/strip_silence.h
@@ -22,7 +22,7 @@
namespace ARDOUR {
/// A filter to strip silence from regions
-class StripSilence : public Filter
+class LIBARDOUR_API StripSilence : public Filter
{
public:
StripSilence (Session &, const AudioIntervalMap&, framecnt_t fade_length);
diff --git a/libs/ardour/midi_patch_search_path.cc b/libs/ardour/ardour/system_exec.h
index ccad1de466..ae865c7bff 100644
--- a/libs/ardour/midi_patch_search_path.cc
+++ b/libs/ardour/ardour/system_exec.h
@@ -1,5 +1,6 @@
/*
- Copyright (C) 2007 Tim Mayberry
+ Copyright (C) 2010 Paul Davis
+ Copyright (C) 2010-2014 Robin Gareus <robin@gareus.org>
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
@@ -16,35 +17,35 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#ifndef _ardour_system_exec_h_
+#define _ardour_system_exec_h_
-#include <glibmm/miscutils.h>
-
-#include "ardour/midi_patch_search_path.h"
-#include "ardour/directory_names.h"
-#include "ardour/filesystem_paths.h"
-
-namespace {
- const char * const midi_patch_env_variable_name = "ARDOUR_MIDI_PATCH_PATH";
-} // anonymous
-
-using namespace PBD;
+#include "ardour/libardour_visibility.h"
+#include "pbd/system_exec.h"
namespace ARDOUR {
-SearchPath
-midi_patch_search_path ()
+class LIBARDOUR_API SystemExec
+ : public PBD::SystemExec
{
- SearchPath spath (ardour_data_search_path());
- spath.add_subdirectory_to_paths(midi_patch_dir_name);
- bool midi_patch_path_defined = false;
- SearchPath spath_env (Glib::getenv(midi_patch_env_variable_name, midi_patch_path_defined));
+public:
+ SystemExec (std::string c, std::string a = "");
+ SystemExec (std::string c, char ** a);
+ SystemExec (std::string c, const std::map<char, std::string> subs);
+ ~SystemExec ();
- if (midi_patch_path_defined) {
- spath += spath_env;
+ int start (int stderr_mode = 1) {
+ return PBD::SystemExec::start(stderr_mode, _vfork_exec_wrapper);
}
- return spath;
-}
+private:
+ static char * _vfork_exec_wrapper;
+
+}; /* end class */
+
+}; /* end namespace */
+
+#endif /* _libpbd_system_exec_h_ */
+
-} // namespace ARDOUR
diff --git a/libs/ardour/ardour/tape_file_matcher.h b/libs/ardour/ardour/tape_file_matcher.h
index 6c8392f46f..623bd406a8 100644
--- a/libs/ardour/ardour/tape_file_matcher.h
+++ b/libs/ardour/ardour/tape_file_matcher.h
@@ -23,9 +23,11 @@
#include <regex.h>
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
-class TapeFileMatcher
+class LIBARDOUR_API TapeFileMatcher
{
public:
diff --git a/libs/ardour/ardour/template_utils.h b/libs/ardour/ardour/template_utils.h
index e01a62bbd1..dc56c53c44 100644
--- a/libs/ardour/ardour/template_utils.h
+++ b/libs/ardour/ardour/template_utils.h
@@ -24,23 +24,25 @@
#include <string>
#include <vector>
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
- std::string system_template_directory ();
- std::string system_route_template_directory ();
+ LIBARDOUR_API std::string system_template_directory ();
+ LIBARDOUR_API std::string system_route_template_directory ();
- std::string user_template_directory ();
- std::string user_route_template_directory ();
+ LIBARDOUR_API std::string user_template_directory ();
+ LIBARDOUR_API std::string user_route_template_directory ();
- struct TemplateInfo {
+ struct LIBARDOUR_API TemplateInfo {
std::string name;
std::string path;
};
- void find_route_templates (std::vector<TemplateInfo>& template_names);
- void find_session_templates (std::vector<TemplateInfo>& template_names);
+ LIBARDOUR_API void find_route_templates (std::vector<TemplateInfo>& template_names);
+ LIBARDOUR_API void find_session_templates (std::vector<TemplateInfo>& template_names);
- std::string session_template_dir_to_file (std::string const &);
+ LIBARDOUR_API std::string session_template_dir_to_file (std::string const &);
} // namespace ARDOUR
diff --git a/libs/ardour/ardour/tempo.h b/libs/ardour/ardour/tempo.h
index bedc825288..8fa5ed45a0 100644
--- a/libs/ardour/ardour/tempo.h
+++ b/libs/ardour/ardour/tempo.h
@@ -45,7 +45,7 @@ class Meter;
class TempoMap;
/** Tempo, the speed at which musical time progresses (BPM). */
-class Tempo {
+class LIBARDOUR_API Tempo {
public:
Tempo (double bpm, double type=4.0) // defaulting to quarter note
: _beats_per_minute (bpm), _note_type(type) {}
@@ -62,7 +62,7 @@ class Tempo {
};
/** Meter, or time signature (beats per bar, and which note type is a beat). */
-class Meter {
+class LIBARDOUR_API Meter {
public:
Meter (double dpb, double bt)
: _divisions_per_bar (dpb), _note_type (bt) {}
@@ -87,7 +87,7 @@ class Meter {
};
/** A section of timeline with a certain Tempo or Meter. */
-class MetricSection {
+class LIBARDOUR_API MetricSection {
public:
MetricSection (const Timecode::BBT_Time& start)
: _start (start), _frame (0), _movable (true) {}
@@ -123,7 +123,7 @@ class MetricSection {
};
/** A section of timeline with a certain Meter. */
-class MeterSection : public MetricSection, public Meter {
+class LIBARDOUR_API MeterSection : public MetricSection, public Meter {
public:
MeterSection (const Timecode::BBT_Time& start, double bpb, double note_type)
: MetricSection (start), Meter (bpb, note_type) {}
@@ -137,7 +137,7 @@ class MeterSection : public MetricSection, public Meter {
};
/** A section of timeline with a certain Tempo. */
-class TempoSection : public MetricSection, public Tempo {
+class LIBARDOUR_API TempoSection : public MetricSection, public Tempo {
public:
TempoSection (const Timecode::BBT_Time& start, double qpm, double note_type)
: MetricSection (start), Tempo (qpm, note_type), _bar_offset (-1.0) {}
@@ -170,7 +170,7 @@ typedef std::list<MetricSection*> Metrics;
/** Helper class to keep track of the Meter *AND* Tempo in effect
at a given point in time.
*/
-class TempoMetric {
+class LIBARDOUR_API TempoMetric {
public:
TempoMetric (const Meter& m, const Tempo& t)
: _meter (&m), _tempo (&t), _frame (0) {}
@@ -205,7 +205,7 @@ class TempoMetric {
Timecode::BBT_Time _start;
};
-class TempoMap : public PBD::StatefulDestructible
+class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible
{
public:
TempoMap (framecnt_t frame_rate);
diff --git a/libs/ardour/ardour/tempo_map_importer.h b/libs/ardour/ardour/tempo_map_importer.h
index 57c7402781..28a65218c7 100644
--- a/libs/ardour/ardour/tempo_map_importer.h
+++ b/libs/ardour/ardour/tempo_map_importer.h
@@ -32,14 +32,14 @@ namespace ARDOUR {
class Session;
-class TempoMapImportHandler : public ElementImportHandler
+class LIBARDOUR_API TempoMapImportHandler : public ElementImportHandler
{
public:
TempoMapImportHandler (XMLTree const & source, Session & session);
std::string get_info () const;
};
-class TempoMapImporter : public ElementImporter
+class LIBARDOUR_API TempoMapImporter : public ElementImporter
{
private:
typedef boost::shared_ptr<XMLNode> XMLNodePtr;
diff --git a/libs/ardour/ardour/thread_buffers.h b/libs/ardour/ardour/thread_buffers.h
index 9d92454887..bf686fd57e 100644
--- a/libs/ardour/ardour/thread_buffers.h
+++ b/libs/ardour/ardour/thread_buffers.h
@@ -23,18 +23,19 @@
#include <glibmm/threads.h>
#include "ardour/chan_count.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
namespace ARDOUR {
class BufferSet;
-class ThreadBuffers {
+class LIBARDOUR_API ThreadBuffers {
public:
ThreadBuffers ();
~ThreadBuffers ();
- void ensure_buffers (ChanCount howmany = ChanCount::ZERO);
+ void ensure_buffers (ChanCount howmany = ChanCount::ZERO, size_t custom = 0);
BufferSet* silent_buffers;
BufferSet* scratch_buffers;
diff --git a/libs/ardour/ardour/ticker.h b/libs/ardour/ardour/ticker.h
index 7f0d1987fc..0e5c3c80f4 100644
--- a/libs/ardour/ardour/ticker.h
+++ b/libs/ardour/ardour/ticker.h
@@ -23,6 +23,7 @@
#include "pbd/signals.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/types.h"
#include "ardour/session_handle.h"
@@ -35,7 +36,7 @@ namespace ARDOUR {
class Session;
class MidiPort;
-class MidiClockTicker : public SessionHandlePtr, boost::noncopyable
+class LIBARDOUR_API MidiClockTicker : public SessionHandlePtr, boost::noncopyable
{
public:
MidiClockTicker ();
diff --git a/libs/ardour/ardour/track.h b/libs/ardour/ardour/track.h
index c763b440af..d33e24e4e6 100644
--- a/libs/ardour/ardour/track.h
+++ b/libs/ardour/ardour/track.h
@@ -35,7 +35,7 @@ class Region;
class Diskstream;
class IO;
-class Track : public Route, public PublicDiskstream
+class LIBARDOUR_API Track : public Route, public PublicDiskstream
{
public:
Track (Session&, std::string name, Route::Flag f = Route::Flag (0), TrackMode m = Normal, DataType default_type = DataType::AUDIO);
@@ -44,6 +44,7 @@ class Track : public Route, public PublicDiskstream
int init ();
bool set_name (const std::string& str);
+ void resync_track_name ();
TrackMode mode () const { return _mode; }
virtual int set_mode (TrackMode /*m*/) { return false; }
@@ -96,7 +97,7 @@ class Track : public Route, public PublicDiskstream
virtual boost::shared_ptr<Region> bounce_range (framepos_t start, framepos_t end, InterThreadInfo&,
boost::shared_ptr<Processor> endpoint, bool include_endpoint) = 0;
virtual int export_stuff (BufferSet& bufs, framepos_t start_frame, framecnt_t nframes,
- boost::shared_ptr<Processor> endpoint, bool include_endpoint, bool for_export) = 0;
+ boost::shared_ptr<Processor> endpoint, bool include_endpoint, bool for_export, bool for_freeze) = 0;
XMLNode& get_state();
XMLNode& get_template();
@@ -228,6 +229,9 @@ private:
void diskstream_record_enable_changed ();
void diskstream_speed_changed ();
void diskstream_alignment_style_changed ();
+ void parameter_changed (std::string const & p);
+
+ std::string _diskstream_name;
};
}; /* namespace ARDOUR*/
diff --git a/libs/ardour/ardour/transient_detector.h b/libs/ardour/ardour/transient_detector.h
index 322e4cbc75..0e07c5851a 100644
--- a/libs/ardour/ardour/transient_detector.h
+++ b/libs/ardour/ardour/transient_detector.h
@@ -28,7 +28,7 @@ class AudioSource;
class Readable;
class Session;
-class TransientDetector : public AudioAnalyser
+class LIBARDOUR_API TransientDetector : public AudioAnalyser
{
public:
TransientDetector (float sample_rate);
diff --git a/libs/ardour/ardour/trimmable.h b/libs/ardour/ardour/trimmable.h
index 071e3d151a..07e2c809a3 100644
--- a/libs/ardour/ardour/trimmable.h
+++ b/libs/ardour/ardour/trimmable.h
@@ -22,7 +22,7 @@
namespace ARDOUR {
-class Trimmable {
+class LIBARDOUR_API Trimmable {
public:
Trimmable() {}
virtual ~Trimmable() {}
diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h
index 50a96030b1..df7c40a669 100644
--- a/libs/ardour/ardour/types.h
+++ b/libs/ardour/ardour/types.h
@@ -38,6 +38,7 @@
#include "evoral/Range.hpp"
#include "ardour/chan_count.h"
+#include "ardour/plugin_types.h"
#include <map>
@@ -418,17 +419,6 @@ namespace ARDOUR {
MixerOrdered
};
- enum CrossfadeModel {
- FullCrossfade,
- ShortCrossfade
- };
-
- enum CrossfadeChoice {
- RegionFades,
- ConstantPowerMinus3dB,
- ConstantPowerMinus6dB,
- };
-
enum ListenPosition {
AfterFaderListen,
PreFaderListen
@@ -469,14 +459,6 @@ namespace ARDOUR {
PeakDatum max;
};
- enum PluginType {
- AudioUnit,
- LADSPA,
- LV2,
- Windows_VST,
- LXVST,
- };
-
enum RunContext {
ButlerContext = 0,
TransportContext,
@@ -629,8 +611,6 @@ std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf);
std::istream& operator>>(std::istream& o, ARDOUR::RemoteModel& sf);
std::istream& operator>>(std::istream& o, ARDOUR::ListenPosition& sf);
std::istream& operator>>(std::istream& o, ARDOUR::InsertMergePolicy& sf);
-std::istream& operator>>(std::istream& o, ARDOUR::CrossfadeModel& sf);
-std::istream& operator>>(std::istream& o, ARDOUR::CrossfadeChoice& sf);
std::istream& operator>>(std::istream& o, ARDOUR::SyncSource& sf);
std::istream& operator>>(std::istream& o, ARDOUR::ShuttleBehaviour& sf);
std::istream& operator>>(std::istream& o, ARDOUR::ShuttleUnits& sf);
@@ -639,6 +619,7 @@ std::istream& operator>>(std::istream& o, ARDOUR::DenormalModel& sf);
std::istream& operator>>(std::istream& o, ARDOUR::WaveformScale& sf);
std::istream& operator>>(std::istream& o, ARDOUR::WaveformShape& sf);
std::istream& operator>>(std::istream& o, ARDOUR::PositionLockStyle& sf);
+std::istream& operator>>(std::istream& o, ARDOUR::FadeShape& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::SampleFormat& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf);
@@ -652,8 +633,6 @@ std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::RemoteModel& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::ListenPosition& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::InsertMergePolicy& sf);
-std::ostream& operator<<(std::ostream& o, const ARDOUR::CrossfadeModel& sf);
-std::ostream& operator<<(std::ostream& o, const ARDOUR::CrossfadeChoice& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::SyncSource& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleBehaviour& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::ShuttleUnits& sf);
@@ -662,6 +641,7 @@ std::ostream& operator<<(std::ostream& o, const ARDOUR::DenormalModel& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformScale& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformShape& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::PositionLockStyle& sf);
+std::ostream& operator<<(std::ostream& o, const ARDOUR::FadeShape& sf);
static inline ARDOUR::framepos_t
session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed)
diff --git a/libs/ardour/ardour/unknown_processor.h b/libs/ardour/ardour/unknown_processor.h
index 61a5734df2..50234e8294 100644
--- a/libs/ardour/ardour/unknown_processor.h
+++ b/libs/ardour/ardour/unknown_processor.h
@@ -39,7 +39,7 @@ namespace ARDOUR {
* session on a machine without a particular plugin will not corrupt
* the session.
*/
-class UnknownProcessor : public Processor
+class LIBARDOUR_API UnknownProcessor : public Processor
{
public:
UnknownProcessor (Session &, XMLNode const &);
diff --git a/libs/ardour/ardour/uri_map.h b/libs/ardour/ardour/uri_map.h
index 18008f0df2..a948ea4002 100644
--- a/libs/ardour/ardour/uri_map.h
+++ b/libs/ardour/ardour/uri_map.h
@@ -28,6 +28,8 @@
#include "lv2/lv2plug.in/ns/ext/uri-map/uri-map.h"
#include "lv2/lv2plug.in/ns/ext/urid/urid.h"
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
/** Implementation of the LV2 uri-map and urid extensions.
@@ -35,7 +37,7 @@ namespace ARDOUR {
* This just uses a pair of std::map and is not so great in the space overhead
* department, but it's fast enough and not really performance critical anyway.
*/
-class URIMap : public boost::noncopyable {
+class LIBARDOUR_API URIMap : public boost::noncopyable {
public:
URIMap();
diff --git a/libs/ardour/ardour/user_bundle.h b/libs/ardour/ardour/user_bundle.h
index 5ecfe521f5..4ff435ef35 100644
--- a/libs/ardour/ardour/user_bundle.h
+++ b/libs/ardour/ardour/user_bundle.h
@@ -29,7 +29,7 @@ namespace ARDOUR {
class Session;
-class UserBundle : public Bundle, public PBD::Stateful {
+class LIBARDOUR_API UserBundle : public Bundle, public PBD::Stateful {
public:
UserBundle (std::string const &);
diff --git a/libs/ardour/ardour/utils.h b/libs/ardour/ardour/utils.h
index 4bf97fd2e5..4b71c1586e 100644
--- a/libs/ardour/ardour/utils.h
+++ b/libs/ardour/ardour/utils.h
@@ -32,18 +32,21 @@
#include <CoreFoundation/CoreFoundation.h>
#endif /* __APPLE__ */
+#include "ardour/libardour_visibility.h"
#include "ardour/ardour.h"
#include "ardour/data_type.h"
#include "ardour/dB.h"
class XMLNode;
-std::string legalize_for_path (const std::string& str);
-std::string legalize_for_universal_path (const std::string& str);
-std::string legalize_for_uri (const std::string& str);
-std::string legalize_for_path_2X (const std::string& str);
-XMLNode* find_named_node (const XMLNode& node, std::string name);
-std::string bool_as_string (bool);
+namespace ARDOUR {
+
+LIBARDOUR_API std::string legalize_for_path (const std::string& str);
+LIBARDOUR_API std::string legalize_for_universal_path (const std::string& str);
+LIBARDOUR_API std::string legalize_for_uri (const std::string& str);
+LIBARDOUR_API std::string legalize_for_path_2X (const std::string& str);
+LIBARDOUR_API XMLNode* find_named_node (const XMLNode& node, std::string name);
+LIBARDOUR_API std::string bool_as_string (bool);
static inline float f_max(float x, float a) {
x -= a;
@@ -54,23 +57,24 @@ static inline float f_max(float x, float a) {
return (x);
}
-std::string bump_name_once(const std::string& s, char delimiter);
+LIBARDOUR_API std::string bump_name_once(const std::string& s, char delimiter);
+LIBARDOUR_API std::string bump_name_number(const std::string& s);
-int cmp_nocase (const std::string& s, const std::string& s2);
-int cmp_nocase_utf8 (const std::string& s1, const std::string& s2);
+LIBARDOUR_API int cmp_nocase (const std::string& s, const std::string& s2);
+LIBARDOUR_API int cmp_nocase_utf8 (const std::string& s1, const std::string& s2);
-int touch_file(std::string path);
+LIBARDOUR_API int touch_file(std::string path);
-std::string region_name_from_path (std::string path, bool strip_channels, bool add_channel_suffix = false, uint32_t total = 0, uint32_t this_one = 0);
-bool path_is_paired (std::string path, std::string& pair_base);
+LIBARDOUR_API std::string region_name_from_path (std::string path, bool strip_channels, bool add_channel_suffix = false, uint32_t total = 0, uint32_t this_one = 0);
+LIBARDOUR_API bool path_is_paired (std::string path, std::string& pair_base);
-void compute_equal_power_fades (ARDOUR::framecnt_t nframes, float* in, float* out);
+LIBARDOUR_API void compute_equal_power_fades (ARDOUR::framecnt_t nframes, float* in, float* out);
-const char* sync_source_to_string (ARDOUR::SyncSource src, bool sh = false);
-ARDOUR::SyncSource string_to_sync_source (std::string str);
+LIBARDOUR_API const char* sync_source_to_string (ARDOUR::SyncSource src, bool sh = false);
+LIBARDOUR_API ARDOUR::SyncSource string_to_sync_source (std::string str);
-const char* edit_mode_to_string (ARDOUR::EditMode);
-ARDOUR::EditMode string_to_edit_mode (std::string);
+LIBARDOUR_API const char* edit_mode_to_string (ARDOUR::EditMode);
+LIBARDOUR_API ARDOUR::EditMode string_to_edit_mode (std::string);
#undef OLD_GAIN_MATH
#define OLD_GAIN_MATH
@@ -142,8 +146,8 @@ slider_position_to_gain (double pos)
}
#undef OLD_GAIN_MATH
-double gain_to_slider_position_with_max (double g, double max_gain = 2.0);
-double slider_position_to_gain_with_max (double g, double max_gain = 2.0);
+LIBARDOUR_API double gain_to_slider_position_with_max (double g, double max_gain = 2.0);
+LIBARDOUR_API double slider_position_to_gain_with_max (double g, double max_gain = 2.0);
/* I don't really like hard-coding these falloff rates here
* Probably should use a map of some kind that could be configured
@@ -160,18 +164,20 @@ double slider_position_to_gain_with_max (double g, double max_gain = 2.0);
#define METER_FALLOFF_FASTER 46.0f
#define METER_FALLOFF_FASTEST 70.0f
-float meter_falloff_to_float (ARDOUR::MeterFalloff);
-ARDOUR::MeterFalloff meter_falloff_from_float (float);
-float meter_falloff_to_db_per_sec (float);
+LIBARDOUR_API float meter_falloff_to_float (ARDOUR::MeterFalloff);
+LIBARDOUR_API ARDOUR::MeterFalloff meter_falloff_from_float (float);
+LIBARDOUR_API float meter_falloff_to_db_per_sec (float);
-const char* native_header_format_extension (ARDOUR::HeaderFormat, const ARDOUR::DataType& type);
-bool matching_unsuffixed_filename_exists_in (const std::string& dir, const std::string& name);
+LIBARDOUR_API const char* native_header_format_extension (ARDOUR::HeaderFormat, const ARDOUR::DataType& type);
+LIBARDOUR_API bool matching_unsuffixed_filename_exists_in (const std::string& dir, const std::string& name);
-uint32_t how_many_dsp_threads ();
+LIBARDOUR_API uint32_t how_many_dsp_threads ();
#if __APPLE__
-std::string CFStringRefToStdString(CFStringRef stringRef);
+LIBARDOUR_API std::string CFStringRefToStdString(CFStringRef stringRef);
#endif // __APPLE__
+} //namespave
+
#endif /* __ardour_utils_h__ */
diff --git a/libs/ardour/ardour/vestige/aeffectx.h b/libs/ardour/ardour/vestige/aeffectx.h
index 4007ecf5ef..5b7d69c411 100644
--- a/libs/ardour/ardour/vestige/aeffectx.h
+++ b/libs/ardour/ardour/vestige/aeffectx.h
@@ -101,16 +101,35 @@
#define effEditIdle 19
#define effEditTop 20
#define effProcessEvents 25
+// the next one from http://asseca.com/vst-24-specs/index.html
+#define effGetPlugCategory 35
#define effGetEffectName 45
#define effGetVendorString 47
#define effGetProductString 48
#define effGetVendorVersion 49
#define effCanDo 51 // currently unused
+/* from http://asseca.com/vst-24-specs/efIdle.html */
+#define effIdle 53
/* from http://asseca.com/vst-24-specs/efGetParameterProperties.html */
#define effGetParameterProperties 56
#define effGetVstVersion 58 // currently unused
+/* http://asseca.com/vst-24-specs/efShellGetNextPlugin.html */
+#define effShellGetNextPlugin 70
+/* The next two were gleaned from http://www.kvraudio.com/forum/printview.php?t=143587&start=0 */
+#define effStartProcess 71
+#define effStopProcess 72
+
+#define effBeginSetProgram 67
+#define effEndSetProgram 68
+
+#ifdef WORDS_BIGENDIAN
+// "VstP"
+#define kEffectMagic 0x50747356
+#else
+// "PtsV"
+#define kEffectMagic 0x56737450
+#endif
-#define kEffectMagic (CCONST( 'V', 's', 't', 'P' ))
#define kVstLangEnglish 1
#define kVstMidiType 1
@@ -174,21 +193,58 @@ struct _VstEvents
VstEvent * events[];
};
+/* constants from http://www.rawmaterialsoftware.com/juceforum/viewtopic.php?t=3740&sid=183f74631fee71a493316735e2b9f28b */
+
+enum Vestige2StringConstants
+{
+ VestigeMaxNameLen = 64,
+ VestigeMaxLabelLen = 64,
+ VestigeMaxShortLabelLen = 8,
+ VestigeMaxCategLabelLen = 24,
+ VestigeMaxFileNameLen = 100
+};
+
+
+/* constants from http://asseca.com/vst-24-specs/efGetPlugCategory.html */
+
+enum VstPlugCategory
+{
+ kPlugCategUnknown = 0,
+ kPlugCategEffect,
+ kPlugCategSynth,
+ kPlugCategAnalysis,
+ kPlugCategMastering,
+ kPlugCategSpacializer,
+ kPlugCategRoomFx,
+ kPlugSurroundFx,
+ kPlugCategRestoration,
+ kPlugCategOfflineProcess,
+ kPlugCategShell,
+ kPlugCategGenerator,
+ kPlugCategMaxCount
+};
+
typedef struct _VstEvents VstEvents;
/* this struct taken from http://asseca.com/vst-24-specs/efGetParameterProperties.html */
struct _VstParameterProperties
{
- float stepFloat;
- float smallStepFloat;
- float largeStepFloat;
- char label[64];
- int32_t flags;
- int32_t minInteger;
- int32_t maxInteger;
- int32_t stepInteger;
- int32_t largeStepInteger;
- char shortLabel[8];
+ float stepFloat; /* float step */
+ float smallStepFloat; /* small float step */
+ float largeStepFloat; /* large float step */
+ char label[VestigeMaxLabelLen]; /* parameter label */
+ int32_t flags; /* @see VstParameterFlags */
+ int32_t minInteger; /* integer minimum */
+ int32_t maxInteger; /* integer maximum */
+ int32_t stepInteger; /* integer step */
+ int32_t largeStepInteger; /* large integer step */
+ char shortLabel[VestigeMaxShortLabelLen]; /* short label, recommended: 6 + delimiter */
+ int16_t displayIndex; /* index where this parameter should be displayed (starting with 0) */
+ int16_t category; /* 0: no category, else group index + 1 */
+ int16_t numParametersInCategory; /* number of parameters in category */
+ int16_t reserved; /* zero */
+ char categoryLabel[VestigeMaxCategLabelLen]; /* category label, e.g. "Osc 1" */
+ char future[16]; /* reserved for future use */
};
typedef struct _VstParameterProperties VstParameterProperties;
diff --git a/libs/ardour/ardour/visibility.h b/libs/ardour/ardour/visibility.h
deleted file mode 100644
index 09287b877d..0000000000
--- a/libs/ardour/ardour/visibility.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- Copyright (C) 2013 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 __libardour_visibility_h__
-#define __libardour_visibility_h__
-
-/* _WIN32 is defined by most compilers targetting Windows, but within the
- * ardour source tree, we also define COMPILER_MSVC or COMPILER_MINGW depending
- * on how a Windows build is built.
- */
-
-#if defined _WIN32 || defined __CYGWIN__ || defined(COMPILER_MSVC) || defined(COMPILER_MINGW)
- #define LIBARDOUR_HELPER_DLL_IMPORT __declspec(dllimport)
- #define LIBARDOUR_HELPER_DLL_EXPORT __declspec(dllexport)
- #define LIBARDOUR_HELPER_DLL_LOCAL
-#else
- #if __GNUC__ >= 4
- #define LIBARDOUR_HELPER_DLL_IMPORT __attribute__ ((visibility ("default")))
- #define LIBARDOUR_HELPER_DLL_EXPORT __attribute__ ((visibility ("default")))
- #define LIBARDOUR_HELPER_DLL_LOCAL __attribute__ ((visibility ("hidden")))
- #else
- #define LIBARDOUR_HELPER_DLL_IMPORT
- #define LIBARDOUR_HELPER_DLL_EXPORT
- #define LIBARDOUR_HELPER_DLL_LOCAL
- #endif
-#endif
-
-#endif /* __libardour_visibility_h__ */
diff --git a/libs/ardour/ardour/vst_info_file.h b/libs/ardour/ardour/vst_info_file.h
new file mode 100644
index 0000000000..5e613801a6
--- /dev/null
+++ b/libs/ardour/ardour/vst_info_file.h
@@ -0,0 +1,55 @@
+/*
+ Copyright (C) 2012-2014 Paul Davis
+ Author: Robin Gareus <robin@gareus.org>
+
+ 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 __vst_info_file_h__
+#define __vst_info_file_h__
+
+#include "ardour/libardour_visibility.h"
+#include "ardour/vst_types.h"
+#include <vector>
+
+#ifndef VST_SCANNER_APP
+namespace ARDOUR {
+#endif
+
+enum VSTScanMode {
+ VST_SCAN_CACHE_ONLY,
+ VST_SCAN_USE_APP,
+ VST_SCAN_INTERNAL
+};
+
+LIBARDOUR_API extern std::string get_personal_vst_info_cache_dir ();
+LIBARDOUR_API extern std::string get_personal_vst_blacklist_dir ();
+LIBARDOUR_API extern void vstfx_free_info_list (std::vector<VSTInfo *> *infos);
+
+#ifdef LXVST_SUPPORT
+LIBARDOUR_API extern std::vector<VSTInfo*> * vstfx_get_info_lx (char *, enum VSTScanMode mode = VST_SCAN_USE_APP);
+#endif
+
+#ifdef WINDOWS_VST_SUPPORT
+LIBARDOUR_API extern std::vector<VSTInfo*> * vstfx_get_info_fst (char *, enum VSTScanMode mode = VST_SCAN_USE_APP);
+#endif
+
+#ifndef VST_SCANNER_APP
+} // namespace
+#endif
+
+#endif /* __vstfx_h__ */
+
diff --git a/libs/ardour/ardour/vst_plugin.h b/libs/ardour/ardour/vst_plugin.h
index 7ca973cbb7..3450e2a480 100644
--- a/libs/ardour/ardour/vst_plugin.h
+++ b/libs/ardour/ardour/vst_plugin.h
@@ -32,7 +32,7 @@ typedef struct _VSTState VSTState;
namespace ARDOUR {
/** Parent class for VST plugins of both Windows and Linux varieties */
-class VSTPlugin : public Plugin
+class LIBARDOUR_API VSTPlugin : public Plugin
{
public:
VSTPlugin (AudioEngine &, Session &, VSTHandle *);
@@ -73,6 +73,7 @@ public:
AEffect * plugin () const { return _plugin; }
VSTState * state () const { return _state; }
+ MidiBuffer * midi_buffer () const { return _midi_out_buf; }
int set_state (XMLNode const &, int);
@@ -94,6 +95,8 @@ protected:
VSTHandle* _handle;
VSTState* _state;
AEffect* _plugin;
+
+ MidiBuffer* _midi_out_buf;
};
}
diff --git a/libs/ardour/ardour/vst_types.h b/libs/ardour/ardour/vst_types.h
index d185d62606..35b52435ab 100644
--- a/libs/ardour/ardour/vst_types.h
+++ b/libs/ardour/ardour/vst_types.h
@@ -20,9 +20,11 @@
#ifndef __ardour_vst_types_h__
#define __ardour_vst_types_h__
+#include <pthread.h>
+#include "ardour/libardour_visibility.h"
#include "ardour/vestige/aeffectx.h"
-struct _VSTKey
+struct LIBARDOUR_API _VSTKey
{
/** virtual-key code, or 0 if this _VSTFXKey is a `character' key */
int special;
@@ -32,7 +34,7 @@ struct _VSTKey
typedef struct _VSTKey VSTKey;
-struct _VSTInfo
+struct LIBARDOUR_API _VSTInfo
{
char *name;
char *creator;
@@ -56,11 +58,11 @@ typedef struct _VSTInfo VSTInfo;
typedef AEffect * (* main_entry_t) (audioMasterCallback);
-struct _VSTHandle
+struct LIBARDOUR_API _VSTHandle
{
void* dll;
char* name;
- char* nameptr;
+ char* path;
main_entry_t main_entry;
@@ -69,7 +71,7 @@ struct _VSTHandle
typedef struct _VSTHandle VSTHandle;
-struct _VSTState
+struct LIBARDOUR_API _VSTState
{
AEffect* plugin;
@@ -89,13 +91,17 @@ struct _VSTState
void (* eventProc) (void * event);
VSTHandle* handle;
-
- int width;
- int height;
- int wantIdle;
- int destroy;
- int vst_version;
- int has_editor;
+
+ int width;
+ int height;
+ int wantIdle;
+
+ int voffset;
+ int hoffset;
+ int gui_shown;
+ int destroy;
+ int vst_version;
+ int has_editor;
int program_set_without_editor;
diff --git a/libs/ardour/ardour/vumeterdsp.h b/libs/ardour/ardour/vumeterdsp.h
index 3169dca12e..1271276d68 100644
--- a/libs/ardour/ardour/vumeterdsp.h
+++ b/libs/ardour/ardour/vumeterdsp.h
@@ -20,8 +20,9 @@
#ifndef __VUMETERDSP_H
#define __VUMETERDSP_H
+#include "ardour/libardour_visibility.h"
-class Vumeterdsp
+class LIBARDOUR_API Vumeterdsp
{
public:
diff --git a/libs/ardour/ardour/windows_vst_plugin.h b/libs/ardour/ardour/windows_vst_plugin.h
index 83bc113a00..17b72ac8da 100644
--- a/libs/ardour/ardour/windows_vst_plugin.h
+++ b/libs/ardour/ardour/windows_vst_plugin.h
@@ -22,7 +22,7 @@
#include "ardour/vst_plugin.h"
-struct _VSTHandle;
+struct LIBARDOUR_API _VSTHandle;
typedef struct _VSTHandle VSTHandle;
namespace ARDOUR {
@@ -30,17 +30,17 @@ namespace ARDOUR {
class AudioEngine;
class Session;
-class WindowsVSTPlugin : public VSTPlugin
+class LIBARDOUR_API WindowsVSTPlugin : public VSTPlugin
{
public:
- WindowsVSTPlugin (AudioEngine &, Session &, VSTHandle *);
+ WindowsVSTPlugin (AudioEngine &, Session &, VSTHandle *, int unique_id);
WindowsVSTPlugin (const WindowsVSTPlugin &);
~WindowsVSTPlugin ();
std::string state_node_name () const { return "windows-vst"; }
};
-class WindowsVSTPluginInfo : public PluginInfo
+class LIBARDOUR_API WindowsVSTPluginInfo : public PluginInfo
{
public:
WindowsVSTPluginInfo ();
diff --git a/libs/ardour/ardour/worker.h b/libs/ardour/ardour/worker.h
index 4f3ff54bc1..c9ff2f2d7f 100644
--- a/libs/ardour/ardour/worker.h
+++ b/libs/ardour/ardour/worker.h
@@ -27,12 +27,14 @@
#include "pbd/ringbuffer.h"
#include "pbd/semaphore.h"
+#include "ardour/libardour_visibility.h"
+
namespace ARDOUR {
/**
An object that needs to schedule non-RT work in the audio thread.
*/
-class Workee {
+class LIBARDOUR_API Workee {
public:
virtual ~Workee() {}
@@ -50,7 +52,7 @@ public:
/**
A worker thread for non-realtime tasks scheduled in the audio thread.
*/
-class Worker
+class LIBARDOUR_API Worker
{
public:
Worker(Workee* workee, uint32_t ring_size);
diff --git a/libs/ardour/async_midi_port.cc b/libs/ardour/async_midi_port.cc
index 5bc8e22833..ce32fe2ccc 100644
--- a/libs/ardour/async_midi_port.cc
+++ b/libs/ardour/async_midi_port.cc
@@ -19,6 +19,9 @@
*/
#include <iostream>
+#include <vector>
+
+#include <glibmm/timer.h>
#include "pbd/error.h"
#include "pbd/stacktrace.h"
@@ -35,7 +38,7 @@ using namespace std;
using namespace PBD;
namespace Evoral {
- template class EventRingBuffer<timestamp_t>;
+ template class EventRingBuffer<MIDI::timestamp_t>;
}
pthread_t AsyncMIDIPort::_process_thread;
@@ -47,9 +50,12 @@ AsyncMIDIPort::AsyncMIDIPort (string const & name, PortFlags flags)
, MIDI::Port (name, MIDI::Port::Flags (0))
, _currently_in_cycle (false)
, _last_write_timestamp (0)
+ , have_timer (false)
, output_fifo (512)
, input_fifo (1024)
+#ifndef PLATFORM_WINDOWS
, xthread (true)
+#endif
{
}
@@ -58,7 +64,14 @@ AsyncMIDIPort::~AsyncMIDIPort ()
}
void
-AsyncMIDIPort::flush_output_fifo (pframes_t nframes)
+AsyncMIDIPort::set_timer (boost::function<MIDI::framecnt_t (void)>& f)
+{
+ timer = f;
+ have_timer = true;
+}
+
+void
+AsyncMIDIPort::flush_output_fifo (MIDI::pframes_t nframes)
{
RingBuffer< Evoral::Event<double> >::rw_vector vec = { { 0, 0 }, { 0, 0 } };
size_t written;
@@ -89,7 +102,7 @@ AsyncMIDIPort::flush_output_fifo (pframes_t nframes)
}
void
-AsyncMIDIPort::cycle_start (pframes_t nframes)
+AsyncMIDIPort::cycle_start (MIDI::pframes_t nframes)
{
_currently_in_cycle = true;
MidiPort::cycle_start (nframes);
@@ -108,21 +121,31 @@ AsyncMIDIPort::cycle_start (pframes_t nframes)
if (ARDOUR::Port::receives_input()) {
MidiBuffer& mb (get_midi_buffer (nframes));
- pframes_t when = AudioEngine::instance()->sample_time_at_cycle_start();
+ framecnt_t when;
+
+ if (have_timer) {
+ when = timer ();
+ } else {
+ when = AudioEngine::instance()->sample_time_at_cycle_start();
+ }
for (MidiBuffer::iterator b = mb.begin(); b != mb.end(); ++b) {
+ if (!have_timer) {
+ when += (*b).time();
+ }
input_fifo.write (when, (Evoral::EventType) 0, (*b).size(), (*b).buffer());
}
-
+
+#ifndef PLATFORM_WINDOWS
if (!mb.empty()) {
xthread.wakeup ();
}
+#endif
}
-
}
void
-AsyncMIDIPort::cycle_end (pframes_t nframes)
+AsyncMIDIPort::cycle_end (MIDI::pframes_t nframes)
{
if (ARDOUR::Port::sends_output()) {
/* move any additional data from output FIFO into the port
@@ -161,12 +184,12 @@ AsyncMIDIPort::drain (int check_interval_usecs)
if (vec.len[0] + vec.len[1] >= output_fifo.bufsize() - 1) {
break;
}
- usleep (check_interval_usecs);
+ Glib::usleep (check_interval_usecs);
}
}
int
-AsyncMIDIPort::write (const byte * msg, size_t msglen, timestamp_t timestamp)
+AsyncMIDIPort::write (const MIDI::byte * msg, size_t msglen, MIDI::timestamp_t timestamp)
{
int ret = 0;
@@ -219,7 +242,7 @@ AsyncMIDIPort::write (const byte * msg, size_t msglen, timestamp_t timestamp)
}
if (timestamp >= _cycle_nframes) {
- std::cerr << "attempting to write MIDI event of " << msglen << " bytes at time "
+ std::cerr << "attempting to write MIDI event of " << msglen << " MIDI::bytes at time "
<< timestamp << " of " << _cycle_nframes
<< " (this will not work - needs a code fix)"
<< std::endl;
@@ -268,9 +291,9 @@ AsyncMIDIPort::read (MIDI::byte *, size_t)
timestamp_t time;
Evoral::EventType type;
uint32_t size;
- byte buffer[input_fifo.capacity()];
+ vector<MIDI::byte> buffer(input_fifo.capacity());
- while (input_fifo.read (&time, &type, &size, buffer)) {
+ while (input_fifo.read (&time, &type, &size, &buffer[0])) {
_parser->set_timestamp (time);
for (uint32_t i = 0; i < size; ++i) {
_parser->scanner (buffer[i]);
@@ -281,7 +304,7 @@ AsyncMIDIPort::read (MIDI::byte *, size_t)
}
void
-AsyncMIDIPort::parse (framecnt_t)
+AsyncMIDIPort::parse (MIDI::framecnt_t)
{
MIDI::byte buf[1];
diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc
index 7785284dac..0d2c664e48 100644
--- a/libs/ardour/audio_diskstream.cc
+++ b/libs/ardour/audio_diskstream.cc
@@ -27,8 +27,6 @@
#include <fcntl.h>
#include <cstdlib>
#include <ctime>
-#include <sys/stat.h>
-#include <sys/mman.h>
#include "pbd/error.h"
#include "pbd/xml++.h"
@@ -925,7 +923,7 @@ AudioDiskstream::internal_playback_seek (framecnt_t distance)
boost::shared_ptr<ChannelList> c = channels.reader();
for (chan = c->begin(); chan != c->end(); ++chan) {
- (*chan)->playback_buf->increment_read_ptr (std::llabs(distance));
+ (*chan)->playback_buf->increment_read_ptr (llabs(distance));
}
if (first_recordable_frame < max_framepos) {
@@ -1791,7 +1789,7 @@ AudioDiskstream::get_state ()
LocaleGuard lg (X_("POSIX"));
boost::shared_ptr<ChannelList> c = channels.reader();
- snprintf (buf, sizeof(buf), "%zd", c->size());
+ snprintf (buf, sizeof(buf), "%u", (unsigned int) c->size());
node.add_property ("channels", buf);
if (!capturing_sources.empty() && _session.get_record_enabled()) {
@@ -1910,7 +1908,7 @@ AudioDiskstream::use_new_write_source (uint32_t n)
try {
if ((chan->write_source = _session.create_audio_source_for_session (
- n_channels().n_audio(), name(), n, destructive())) == 0) {
+ n_channels().n_audio(), write_source_name(), n, destructive())) == 0) {
throw failed_constructor();
}
}
@@ -2453,6 +2451,9 @@ AudioDiskstream::ChannelInfo::~ChannelInfo ()
bool
AudioDiskstream::set_name (string const & name)
{
+ if (_name == name) {
+ return true;
+ }
Diskstream::set_name (name);
/* get a new write source so that its name reflects the new diskstream name */
@@ -2467,3 +2468,24 @@ AudioDiskstream::set_name (string const & name)
return true;
}
+
+bool
+AudioDiskstream::set_write_source_name (const std::string& str) {
+ if (_write_source_name == str) {
+ return true;
+ }
+
+ Diskstream::set_write_source_name (str);
+
+ if (_write_source_name == name()) {
+ return true;
+ }
+ boost::shared_ptr<ChannelList> c = channels.reader();
+ ChannelList::iterator i;
+ int n = 0;
+
+ for (n = 0, i = c->begin(); i != c->end(); ++i, ++n) {
+ use_new_write_source (n);
+ }
+ return true;
+}
diff --git a/libs/ardour/audio_library.cc b/libs/ardour/audio_library.cc
index c2b2f1bff7..35c0972847 100644
--- a/libs/ardour/audio_library.cc
+++ b/libs/ardour/audio_library.cc
@@ -17,11 +17,18 @@
*/
+#ifdef WAF_BUILD
+#include "libardour-config.h"
+#endif
+
#include <sstream>
#include <libxml/uri.h>
+#ifdef HAVE_LRDF
#include <lrdf.h>
+#endif
+
#include <glibmm/miscutils.h>
#include <glibmm/convert.h>
@@ -57,7 +64,9 @@ AudioLibrary::AudioLibrary ()
touch_file(sfdb_file_path);
+#ifdef HAVE_LRDF
lrdf_read_file(src.c_str());
+#endif
}
AudioLibrary::~AudioLibrary ()
@@ -67,14 +76,17 @@ AudioLibrary::~AudioLibrary ()
void
AudioLibrary::save_changes ()
{
+#ifdef HAVE_LRDF
if (lrdf_export_by_source(src.c_str(), src.substr(5).c_str())) {
PBD::warning << string_compose(_("Could not open %1. Audio Library not saved"), src) << endmsg;
}
+#endif
}
void
AudioLibrary::set_tags (string member, vector<string> tags)
{
+#ifdef HAVE_LRDF
sort (tags.begin(), tags.end());
tags.erase (unique(tags.begin(), tags.end()), tags.end());
@@ -85,21 +97,23 @@ AudioLibrary::set_tags (string member, vector<string> tags)
for (vector<string>::iterator i = tags.begin(); i != tags.end(); ++i) {
lrdf_add_triple (src.c_str(), file_uri.c_str(), TAG, (*i).c_str(), lrdf_literal);
}
+#endif
}
vector<string>
AudioLibrary::get_tags (string member)
{
vector<string> tags;
+#ifdef HAVE_LRDF
+ char * uri = strdup(Glib::filename_to_uri(member).c_str());
lrdf_statement pattern;
- pattern.subject = strdup(Glib::filename_to_uri(member).c_str());
+ pattern.subject = uri;
pattern.predicate = const_cast<char*>(TAG);
pattern.object = 0;
pattern.object_type = lrdf_literal;
lrdf_statement* matches = lrdf_matches (&pattern);
- free (pattern.subject);
lrdf_statement* current = matches;
while (current != 0) {
@@ -111,13 +125,15 @@ AudioLibrary::get_tags (string member)
lrdf_free_statements (matches);
sort (tags.begin(), tags.end());
-
+ free (uri);
+#endif
return tags;
}
void
AudioLibrary::search_members_and (vector<string>& members, const vector<string>& tags)
{
+#ifdef HAVE_LRDF
lrdf_statement **head;
lrdf_statement* pattern = 0;
lrdf_statement* old = 0;
@@ -153,4 +169,5 @@ AudioLibrary::search_members_and (vector<string>& members, const vector<string>&
pattern = pattern->next;
delete old;
}
+#endif
}
diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc
index f6874e6157..13d5c43dda 100644
--- a/libs/ardour/audio_track.cc
+++ b/libs/ardour/audio_track.cc
@@ -309,7 +309,7 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram
if (!lm.locked()) {
boost::shared_ptr<AudioDiskstream> diskstream = audio_diskstream();
framecnt_t playback_distance = diskstream->calculate_playback_distance(nframes);
- if (can_internal_playback_seek(std::llabs(playback_distance))) {
+ if (can_internal_playback_seek(llabs(playback_distance))) {
/* TODO should declick */
internal_playback_seek(playback_distance);
}
@@ -369,6 +369,13 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram
process_output_buffers (bufs, start_frame, end_frame, nframes, declick, (!diskstream->record_enabled() && _session.transport_rolling()));
+ for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
+ boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
+ if (d) {
+ d->flush_buffers (nframes);
+ }
+ }
+
need_butler = diskstream->commit (playback_distance);
return 0;
@@ -376,7 +383,7 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram
int
AudioTrack::export_stuff (BufferSet& buffers, framepos_t start, framecnt_t nframes,
- boost::shared_ptr<Processor> endpoint, bool include_endpoint, bool for_export)
+ boost::shared_ptr<Processor> endpoint, bool include_endpoint, bool for_export, bool for_freeze)
{
boost::scoped_array<gain_t> gain_buffer (new gain_t[nframes]);
boost::scoped_array<Sample> mix_buffer (new Sample[nframes]);
@@ -410,38 +417,7 @@ AudioTrack::export_stuff (BufferSet& buffers, framepos_t start, framecnt_t nfram
}
}
- // If no processing is required, there's no need to go any further.
-
- if (!endpoint && !include_endpoint) {
- return 0;
- }
-
- for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
-
- if (!include_endpoint && (*i) == endpoint) {
- break;
- }
-
- /* if we're not exporting, stop processing if we come across a routing processor.
- */
-
- if (!for_export && (*i)->does_routing()) {
- break;
- }
-
- /* even for export, don't run any processor that does routing.
-
- oh, and don't bother with the peak meter either.
- */
-
- if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
- (*i)->run (buffers, start, start+nframes, nframes, true);
- }
-
- if ((*i) == endpoint) {
- break;
- }
- }
+ bounce_process (buffers, start, nframes, endpoint, include_endpoint, for_export, for_freeze);
return 0;
}
@@ -514,7 +490,7 @@ AudioTrack::bounce_range (framepos_t start, framepos_t end, InterThreadInfo& itt
boost::shared_ptr<Processor> endpoint, bool include_endpoint)
{
vector<boost::shared_ptr<Source> > srcs;
- return _session.write_one_track (*this, start, end, false, srcs, itt, endpoint, include_endpoint, false);
+ return _session.write_one_track (*this, start, end, false, srcs, itt, endpoint, include_endpoint, false, false);
}
void
@@ -557,8 +533,8 @@ AudioTrack::freeze_me (InterThreadInfo& itt)
boost::shared_ptr<Region> res;
- if ((res = _session.write_one_track (*this, _session.current_start_frame(), _session.current_end_frame(), true, srcs, itt,
- main_outs(), false, false)) == 0) {
+ if ((res = _session.write_one_track (*this, _session.current_start_frame(), _session.current_end_frame(),
+ true, srcs, itt, main_outs(), false, false, true)) == 0) {
return;
}
@@ -569,7 +545,10 @@ AudioTrack::freeze_me (InterThreadInfo& itt)
for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
- if (!(*r)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*r)) {
+ if ((*r)->does_routing() && (*r)->active()) {
+ break;
+ }
+ if (!boost::dynamic_pointer_cast<PeakMeter>(*r)) {
FreezeRecordProcessorInfo* frii = new FreezeRecordProcessorInfo ((*r)->get_state(), (*r));
@@ -577,9 +556,10 @@ AudioTrack::freeze_me (InterThreadInfo& itt)
_freeze_record.processor_info.push_back (frii);
- /* now deactivate the processor */
-
- (*r)->deactivate ();
+ /* now deactivate the processor, */
+ if (!boost::dynamic_pointer_cast<Amp>(*r)) {
+ (*r)->deactivate ();
+ }
}
_session.set_dirty ();
diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc
index 538a905ca2..add2407f84 100644
--- a/libs/ardour/audio_unit.cc
+++ b/libs/ardour/audio_unit.cc
@@ -28,12 +28,13 @@
#include "pbd/xml++.h"
#include "pbd/convert.h"
#include "pbd/whitespace.h"
-#include "pbd/pathscanner.h"
+#include "pbd/file_utils.h"
#include "pbd/locale_guard.h"
#include <glibmm/threads.h>
#include <glibmm/fileutils.h>
#include <glibmm/miscutils.h>
+#include <glib/gstdio.h>
#include "ardour/ardour.h"
#include "ardour/audioengine.h"
@@ -2048,20 +2049,19 @@ AUPlugin::current_preset() const
void
AUPlugin::find_presets ()
{
- vector<string*>* preset_files;
- PathScanner scanner;
+ vector<string> preset_files;
user_preset_map.clear ();
- preset_files = scanner (preset_search_path, au_preset_filter, this, true, true, -1, true);
+ find_files_matching_filter (preset_files, preset_search_path, au_preset_filter, this, true, true, true);
- if (!preset_files) {
+ if (preset_files.empty()) {
return;
}
- for (vector<string*>::iterator x = preset_files->begin(); x != preset_files->end(); ++x) {
+ for (vector<string>::iterator x = preset_files.begin(); x != preset_files.end(); ++x) {
- string path = *(*x);
+ string path = *x;
string preset_name;
/* make an initial guess at the preset name using the path */
@@ -2078,11 +2078,8 @@ AUPlugin::find_presets ()
user_preset_map[preset_name] = path;
}
- delete *x;
}
- delete preset_files;
-
/* now fill the vector<string> with the names we have */
for (UserPresetMap::iterator i = user_preset_map.begin(); i != user_preset_map.end(); ++i) {
@@ -2277,6 +2274,7 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip
}
AUPluginInfo::get_names (temp, info->name, info->creator);
+ ARDOUR::PluginScanMessage(_("AU"), info->name, false);
info->type = ARDOUR::AudioUnit;
info->unique_id = stringify_descriptor (*info->descriptor);
@@ -2453,7 +2451,7 @@ AUPluginInfo::save_cached_info ()
if (!tree.write (path)) {
error << string_compose (_("could not save AU cache to %1"), path) << endmsg;
- unlink (path.c_str());
+ g_unlink (path.c_str());
}
}
diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc
index 82564ebaf2..6c9fd442fb 100644
--- a/libs/ardour/audioengine.cc
+++ b/libs/ardour/audioengine.cc
@@ -34,8 +34,6 @@
#include "pbd/stacktrace.h"
#include "pbd/unknown_type.h"
-#include <jack/weakjack.h>
-
#include "midi++/port.h"
#include "midi++/mmc.h"
@@ -43,13 +41,14 @@
#include "ardour/audio_port.h"
#include "ardour/audio_backend.h"
#include "ardour/audioengine.h"
-#include "ardour/backend_search_path.h"
+#include "ardour/search_paths.h"
#include "ardour/buffer.h"
#include "ardour/cycle_timer.h"
#include "ardour/internal_send.h"
#include "ardour/meter.h"
#include "ardour/midi_port.h"
#include "ardour/midiport_manager.h"
+#include "ardour/mididm.h"
#include "ardour/mtdm.h"
#include "ardour/port.h"
#include "ardour/process_thread.h"
@@ -75,7 +74,8 @@ AudioEngine::AudioEngine ()
, m_meter_thread (0)
, _main_thread (0)
, _mtdm (0)
- , _measuring_latency (false)
+ , _mididm (0)
+ , _measuring_latency (MeasureNone)
, _latency_input_port (0)
, _latency_output_port (0)
, _latency_flush_frames (0)
@@ -197,7 +197,7 @@ AudioEngine::process_callback (pframes_t nframes)
bool return_after_remove_check = false;
- if (_measuring_latency && _mtdm) {
+ if (_measuring_latency == MeasureAudio && _mtdm) {
/* run a normal cycle from the perspective of the PortManager
so that we get silence on all registered ports.
@@ -220,6 +220,28 @@ AudioEngine::process_callback (pframes_t nframes)
PortManager::cycle_end (nframes);
return_after_remove_check = true;
+ } else if (_measuring_latency == MeasureMIDI && _mididm) {
+ /* run a normal cycle from the perspective of the PortManager
+ so that we get silence on all registered ports.
+
+ we overwrite the silence on the two ports used for latency
+ measurement.
+ */
+
+ PortManager::cycle_start (nframes);
+ PortManager::silence (nframes);
+
+ if (_latency_input_port && _latency_output_port) {
+ PortEngine& pe (port_engine());
+
+ _mididm->process (nframes, pe,
+ pe.get_buffer (_latency_input_port, nframes),
+ pe.get_buffer (_latency_output_port, nframes));
+ }
+
+ PortManager::cycle_end (nframes);
+ return_after_remove_check = true;
+
} else if (_latency_flush_frames) {
/* wait for the appropriate duration for the MTDM signal to
@@ -474,28 +496,41 @@ AudioEngine::discover_backends ()
Glib::PatternSpec so_extension_pattern("*backend.so");
Glib::PatternSpec dylib_extension_pattern("*backend.dylib");
+
+#if defined(PLATFORM_WINDOWS) && defined(DEBUGGABLE_BACKENDS)
+ #if defined(DEBUG) || defined(_DEBUG)
+ Glib::PatternSpec dll_extension_pattern("*backendD.dll");
+ #else
+ Glib::PatternSpec dll_extension_pattern("*backendRDC.dll");
+ #endif
+#else
Glib::PatternSpec dll_extension_pattern("*backend.dll");
+#endif
- find_matching_files_in_search_path (backend_search_path (),
- so_extension_pattern, backend_modules);
+ find_files_matching_pattern (backend_modules, backend_search_path (),
+ so_extension_pattern);
- find_matching_files_in_search_path (backend_search_path (),
- dylib_extension_pattern, backend_modules);
+ find_files_matching_pattern (backend_modules, backend_search_path (),
+ dylib_extension_pattern);
- find_matching_files_in_search_path (backend_search_path (),
- dll_extension_pattern, backend_modules);
+ find_files_matching_pattern (backend_modules, backend_search_path (),
+ dll_extension_pattern);
- DEBUG_TRACE (DEBUG::Panning, string_compose (_("looking for backends in %1\n"), backend_search_path().to_string()));
+ DEBUG_TRACE (DEBUG::AudioEngine, string_compose ("looking for backends in %1\n", backend_search_path().to_string()));
for (vector<std::string>::iterator i = backend_modules.begin(); i != backend_modules.end(); ++i) {
AudioBackendInfo* info;
+ DEBUG_TRACE (DEBUG::AudioEngine, string_compose ("Checking possible backend in %1\n", *i));
+
if ((info = backend_discover (*i)) != 0) {
_backends.insert (make_pair (info->name, info));
}
}
+ DEBUG_TRACE (DEBUG::AudioEngine, string_compose ("Found %1 backends\n", _backends.size()));
+
return _backends.size();
}
@@ -553,7 +588,9 @@ AudioEngine::drop_backend ()
{
if (_backend) {
_backend->stop ();
+ _backend->drop_device();
_backend.reset ();
+ _running = false;
}
}
@@ -582,7 +619,7 @@ AudioEngine::set_backend (const std::string& name, const std::string& arg1, cons
if (b->second->instantiate (arg1, arg2)) {
throw failed_constructor ();
}
-
+
_backend = b->second->factory (*this);
} catch (exception& e) {
@@ -647,7 +684,7 @@ AudioEngine::stop (bool for_latency)
_running = false;
_processed_frames = 0;
- _measuring_latency = false;
+ _measuring_latency = MeasureNone;
_latency_output_port = 0;
_latency_input_port = 0;
_started_for_latency = false;
@@ -884,15 +921,6 @@ AudioEngine::set_buffer_size (uint32_t bufsiz)
}
int
-AudioEngine::set_sample_format (SampleFormat sf)
-{
- if (!_backend) {
- return -1;
- }
- return _backend->set_sample_format (sf);
-}
-
-int
AudioEngine::set_interleaved (bool yn)
{
if (!_backend) {
@@ -1013,26 +1041,18 @@ AudioEngine::halted_callback (const char* why)
bool
AudioEngine::setup_required () const
{
- /* If there is only a single backend and it claims to be configured
- * already there is no setup to be done.
- *
- * Primarily for a case where there is only a JACK backend and
- * JACK is already running.
- */
-
- if (_backends.size() == 1 && _backends.begin()->second->already_configured()) {
- return false;
+ if (_backend) {
+ if (_backend->info().already_configured())
+ return false;
+ } else {
+ if (_backends.size() == 1 && _backends.begin()->second->already_configured()) {
+ return false;
+ }
}
-
+
return true;
}
-MTDM*
-AudioEngine::mtdm()
-{
- return _mtdm;
-}
-
int
AudioEngine::prepare_for_latency_measurement ()
{
@@ -1050,7 +1070,7 @@ AudioEngine::prepare_for_latency_measurement ()
}
int
-AudioEngine::start_latency_detection ()
+AudioEngine::start_latency_detection (bool for_midi)
{
if (!running()) {
if (prepare_for_latency_measurement ()) {
@@ -1063,6 +1083,9 @@ AudioEngine::start_latency_detection ()
delete _mtdm;
_mtdm = 0;
+ delete _mididm;
+ _mididm = 0;
+
/* find the ports we will connect to */
PortEngine::PortHandle out = pe.get_port_by_name (_latency_output_name);
@@ -1074,27 +1097,61 @@ AudioEngine::start_latency_detection ()
}
/* create the ports we will use to read/write data */
-
- if ((_latency_output_port = pe.register_port ("latency_out", DataType::AUDIO, IsOutput)) == 0) {
- stop (true);
- return -1;
- }
- if (pe.connect (_latency_output_port, _latency_output_name)) {
- pe.unregister_port (_latency_output_port);
- stop (true);
- return -1;
- }
+ if (for_midi) {
+ if ((_latency_output_port = pe.register_port ("latency_out", DataType::MIDI, IsOutput)) == 0) {
+ stop (true);
+ return -1;
+ }
+ if (pe.connect (_latency_output_port, _latency_output_name)) {
+ pe.unregister_port (_latency_output_port);
+ stop (true);
+ return -1;
+ }
+
+ const string portname ("latency_in");
+ if ((_latency_input_port = pe.register_port (portname, DataType::MIDI, IsInput)) == 0) {
+ pe.unregister_port (_latency_input_port);
+ pe.unregister_port (_latency_output_port);
+ stop (true);
+ return -1;
+ }
+ if (pe.connect (_latency_input_name, make_port_name_non_relative (portname))) {
+ pe.unregister_port (_latency_input_port);
+ pe.unregister_port (_latency_output_port);
+ stop (true);
+ return -1;
+ }
+
+ _mididm = new MIDIDM (sample_rate());
+
+ } else {
+
+ if ((_latency_output_port = pe.register_port ("latency_out", DataType::AUDIO, IsOutput)) == 0) {
+ stop (true);
+ return -1;
+ }
+ if (pe.connect (_latency_output_port, _latency_output_name)) {
+ pe.unregister_port (_latency_output_port);
+ stop (true);
+ return -1;
+ }
+
+ const string portname ("latency_in");
+ if ((_latency_input_port = pe.register_port (portname, DataType::AUDIO, IsInput)) == 0) {
+ pe.unregister_port (_latency_input_port);
+ pe.unregister_port (_latency_output_port);
+ stop (true);
+ return -1;
+ }
+ if (pe.connect (_latency_input_name, make_port_name_non_relative (portname))) {
+ pe.unregister_port (_latency_input_port);
+ pe.unregister_port (_latency_output_port);
+ stop (true);
+ return -1;
+ }
+
+ _mtdm = new MTDM (sample_rate());
- const string portname ("latency_in");
- if ((_latency_input_port = pe.register_port (portname, DataType::AUDIO, IsInput)) == 0) {
- pe.unregister_port (_latency_output_port);
- stop (true);
- return -1;
- }
- if (pe.connect (_latency_input_name, make_port_name_non_relative (portname))) {
- pe.unregister_port (_latency_output_port);
- stop (true);
- return -1;
}
LatencyRange lr;
@@ -1105,10 +1162,8 @@ AudioEngine::start_latency_detection ()
_latency_signal_latency += lr.max;
/* all created and connected, lets go */
-
- _mtdm = new MTDM (sample_rate());
- _measuring_latency = true;
- _latency_flush_frames = samples_per_cycle();
+ _latency_flush_frames = samples_per_cycle();
+ _measuring_latency = for_midi ? MeasureMIDI : MeasureAudio;
return 0;
}
@@ -1116,7 +1171,7 @@ AudioEngine::start_latency_detection ()
void
AudioEngine::stop_latency_detection ()
{
- _measuring_latency = false;
+ _measuring_latency = MeasureNone;
if (_latency_output_port) {
port_engine().unregister_port (_latency_output_port);
diff --git a/libs/ardour/audiofilesource.cc b/libs/ardour/audiofilesource.cc
index 8c3bf00176..7d34b9d9a5 100644
--- a/libs/ardour/audiofilesource.cc
+++ b/libs/ardour/audiofilesource.cc
@@ -41,6 +41,7 @@
#include <sndfile.h>
+#include <glib/gstdio.h>
#include <glibmm/miscutils.h>
#include <glibmm/fileutils.h>
#include <glibmm/threads.h>
@@ -150,8 +151,8 @@ AudioFileSource::~AudioFileSource ()
{
DEBUG_TRACE (DEBUG::Destruction, string_compose ("AudioFileSource destructor %1, removable? %2\n", _path, removable()));
if (removable()) {
- unlink (_path.c_str());
- unlink (peakpath.c_str());
+ ::g_unlink (_path.c_str());
+ ::g_unlink (peakpath.c_str());
}
}
@@ -309,7 +310,7 @@ AudioFileSource::mark_streaming_write_completed ()
int
AudioFileSource::move_dependents_to_trash()
{
- return ::unlink (peakpath.c_str());
+ return ::g_unlink (peakpath.c_str());
}
void
diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc
index e9b0b1fc07..2eb09ae192 100644
--- a/libs/ardour/audioregion.cc
+++ b/libs/ardour/audioregion.cc
@@ -409,14 +409,22 @@ AudioRegion::set_envelope_active (bool yn)
}
}
+/** @param buf Buffer to put peak data in.
+ * @param npeaks Number of peaks to read (ie the number of PeakDatas in buf)
+ * @param offset Start position, as an offset from the start of this region's source.
+ * @param cnt Number of samples to read.
+ * @param chan_n Channel.
+ * @param frames_per_pixel Number of samples to use to generate one peak value.
+ */
+
ARDOUR::framecnt_t
-AudioRegion::read_peaks (PeakData *buf, framecnt_t npeaks, framecnt_t offset, framecnt_t cnt, uint32_t chan_n, double samples_per_unit) const
+AudioRegion::read_peaks (PeakData *buf, framecnt_t npeaks, framecnt_t offset, framecnt_t cnt, uint32_t chan_n, double frames_per_pixel) const
{
if (chan_n >= _sources.size()) {
return 0;
}
- if (audio_source(chan_n)->read_peaks (buf, npeaks, offset, cnt, samples_per_unit)) {
+ if (audio_source(chan_n)->read_peaks (buf, npeaks, offset, cnt, frames_per_pixel)) {
return 0;
} else {
if (_scale_amplitude != 1.0f) {
@@ -532,21 +540,21 @@ AudioRegion::read_at (Sample *buf, Sample *mixdown_buffer, float *gain_buffer,
/* see if some part of this read is within the fade out */
/* ................. >| REGION
- _length
-
- { } FADE
- fade_out_length
- ^
- _length - fade_out_length
- |--------------|
- ^internal_offset
- ^internal_offset + to_read
-
- we need the intersection of [internal_offset,internal_offset+to_read] with
- [_length - fade_out_length, _length]
-
- */
-
+ * _length
+ *
+ * { } FADE
+ * fade_out_length
+ * ^
+ * _length - fade_out_length
+ *
+ * |--------------|
+ * ^internal_offset
+ * ^internal_offset + to_read
+ *
+ * we need the intersection of [internal_offset,internal_offset+to_read] with
+ * [_length - fade_out_length, _length]
+ *
+ */
fade_interval_start = max (internal_offset, _length - framecnt_t (_fade_out->back()->when));
framecnt_t fade_interval_end = min(internal_offset + to_read, _length.val());
@@ -983,23 +991,25 @@ AudioRegion::set_fade_in (FadeShape shape, framecnt_t len)
_fade_in->clear ();
_inverse_fade_in->clear ();
+ const int num_steps = 32;
+
switch (shape) {
case FadeLinear:
- _fade_in->fast_simple_add (0.0, 0.0);
+ _fade_in->fast_simple_add (0.0, VERY_SMALL_SIGNAL);
_fade_in->fast_simple_add (len, 1.0);
reverse_curve (_inverse_fade_in.val(), _fade_in.val());
break;
case FadeFast:
- generate_db_fade (_fade_in.val(), len, 10, -60);
+ generate_db_fade (_fade_in.val(), len, num_steps, -60);
reverse_curve (c1, _fade_in.val());
_fade_in->copy_events (*c1);
generate_inverse_power_curve (_inverse_fade_in.val(), _fade_in.val());
break;
case FadeSlow:
- generate_db_fade (c1, len, 10, -1); // start off with a slow fade
- generate_db_fade (c2, len, 10, -80); // end with a fast fade
+ generate_db_fade (c1, len, num_steps, -1); // start off with a slow fade
+ generate_db_fade (c2, len, num_steps, -80); // end with a fast fade
merge_curves (_fade_in.val(), c1, c2);
reverse_curve (c3, _fade_in.val());
_fade_in->copy_events (*c3);
@@ -1007,9 +1017,10 @@ AudioRegion::set_fade_in (FadeShape shape, framecnt_t len)
break;
case FadeConstantPower:
- for (int i = 0; i < 9; ++i) {
- float dist = (float) i / 10.0f;
- _fade_in->fast_simple_add (len*dist, sin (dist*M_PI/2));
+ _fade_in->fast_simple_add (0.0, VERY_SMALL_SIGNAL);
+ for (int i = 1; i < num_steps; ++i) {
+ const float dist = i / (num_steps + 1.f);
+ _fade_in->fast_simple_add (len * dist, sin (dist * M_PI / 2.0));
}
_fade_in->fast_simple_add (len, 1.0);
reverse_curve (_inverse_fade_in.val(), _fade_in.val());
@@ -1018,16 +1029,12 @@ AudioRegion::set_fade_in (FadeShape shape, framecnt_t len)
case FadeSymmetric:
//start with a nearly linear cuve
_fade_in->fast_simple_add (0, 1);
- _fade_in->fast_simple_add (0.5*len, 0.6);
+ _fade_in->fast_simple_add (0.5 * len, 0.6);
//now generate a fade-out curve by successively applying a gain drop
- const float breakpoint = 0.7; //linear for first 70%
- const int num_steps = 9;
- for (int i = 2; i < num_steps; i++) {
- float coeff = (1.0-breakpoint);
- for (int j = 0; j < i; j++) {
- coeff *= 0.5; //6dB drop per step
- }
- _fade_in->fast_simple_add (len* (breakpoint+((1.0-breakpoint)*(double)i/(double)num_steps)), coeff);
+ const double breakpoint = 0.7; //linear for first 70%
+ for (int i = 2; i < 9; ++i) {
+ const float coeff = (1.f - breakpoint) * powf (0.5, i);
+ _fade_in->fast_simple_add (len * (breakpoint + ((1.0 - breakpoint) * (double)i / 9.0)), coeff);
}
_fade_in->fast_simple_add (len, VERY_SMALL_SIGNAL);
reverse_curve (c3, _fade_in.val());
@@ -1036,6 +1043,9 @@ AudioRegion::set_fade_in (FadeShape shape, framecnt_t len)
break;
}
+ _fade_in->set_interpolation(Evoral::ControlList::Curved);
+ _inverse_fade_in->set_interpolation(Evoral::ControlList::Curved);
+
_default_fade_in = false;
_fade_in->thaw ();
send_change (PropertyChange (Properties::fade_in));
@@ -1062,6 +1072,8 @@ AudioRegion::set_fade_out (FadeShape shape, framecnt_t len)
_fade_out->clear ();
_inverse_fade_out->clear ();
+ const int num_steps = 32;
+
switch (shape) {
case FadeLinear:
_fade_out->fast_simple_add (0.0, 1.0);
@@ -1070,13 +1082,13 @@ AudioRegion::set_fade_out (FadeShape shape, framecnt_t len)
break;
case FadeFast:
- generate_db_fade (_fade_out.val(), len, 10, -60);
+ generate_db_fade (_fade_out.val(), len, num_steps, -60);
generate_inverse_power_curve (_inverse_fade_out.val(), _fade_out.val());
break;
case FadeSlow:
- generate_db_fade (c1, len, 10, -1); //start off with a slow fade
- generate_db_fade (c2, len, 10, -80); //end with a fast fade
+ generate_db_fade (c1, len, num_steps, -1); //start off with a slow fade
+ generate_db_fade (c2, len, num_steps, -80); //end with a fast fade
merge_curves (_fade_out.val(), c1, c2);
generate_inverse_power_curve (_inverse_fade_out.val(), _fade_out.val());
break;
@@ -1085,9 +1097,9 @@ AudioRegion::set_fade_out (FadeShape shape, framecnt_t len)
//constant-power fades use a sin/cos relationship
//the cutoff is abrupt but it has the benefit of being symmetrical
_fade_out->fast_simple_add (0.0, 1.0);
- for (int i = 1; i < 9; i++ ) {
- float dist = (float)i/10.0;
- _fade_out->fast_simple_add ((len * dist), cos(dist*M_PI/2));
+ for (int i = 1; i < num_steps; ++i) {
+ const float dist = i / (num_steps + 1.f);
+ _fade_out->fast_simple_add (len * dist, cos (dist * M_PI / 2.0));
}
_fade_out->fast_simple_add (len, VERY_SMALL_SIGNAL);
reverse_curve (_inverse_fade_out.val(), _fade_out.val());
@@ -1096,23 +1108,21 @@ AudioRegion::set_fade_out (FadeShape shape, framecnt_t len)
case FadeSymmetric:
//start with a nearly linear cuve
_fade_out->fast_simple_add (0, 1);
- _fade_out->fast_simple_add (0.5*len, 0.6);
-
+ _fade_out->fast_simple_add (0.5 * len, 0.6);
//now generate a fade-out curve by successively applying a gain drop
- const float breakpoint = 0.7; //linear for first 70%
- const int num_steps = 9;
- for (int i = 2; i < num_steps; i++) {
- float coeff = (1.0-breakpoint);
- for (int j = 0; j < i; j++) {
- coeff *= 0.5; //6dB drop per step
- }
- _fade_out->fast_simple_add (len* (breakpoint+((1.0-breakpoint)*(double)i/(double)num_steps)), coeff);
+ const double breakpoint = 0.7; //linear for first 70%
+ for (int i = 2; i < 9; ++i) {
+ const float coeff = (1.f - breakpoint) * powf (0.5, i);
+ _fade_out->fast_simple_add (len * (breakpoint + ((1.0 - breakpoint) * (double)i / 9.0)), coeff);
}
_fade_out->fast_simple_add (len, VERY_SMALL_SIGNAL);
reverse_curve (_inverse_fade_out.val(), _fade_out.val());
break;
}
+ _fade_out->set_interpolation(Evoral::ControlList::Curved);
+ _inverse_fade_out->set_interpolation(Evoral::ControlList::Curved);
+
_default_fade_out = false;
_fade_out->thaw ();
send_change (PropertyChange (Properties::fade_out));
@@ -1202,14 +1212,14 @@ void
AudioRegion::set_default_fade_in ()
{
_fade_in_suspended = 0;
- set_fade_in (FadeLinear, 64);
+ set_fade_in (Config->get_default_fade_shape(), 64);
}
void
AudioRegion::set_default_fade_out ()
{
_fade_out_suspended = 0;
- set_fade_out (FadeLinear, 64);
+ set_fade_out (Config->get_default_fade_shape(), 64);
}
void
@@ -1852,22 +1862,3 @@ AudioRegion::verify_xfade_bounds (framecnt_t len, bool start)
}
-extern "C" {
-
- int region_read_peaks_from_c (void *arg, uint32_t npeaks, uint32_t start, uint32_t cnt, intptr_t data, uint32_t n_chan, double samples_per_unit)
-{
- return ((AudioRegion *) arg)->read_peaks ((PeakData *) data, (framecnt_t) npeaks, (framepos_t) start, (framecnt_t) cnt, n_chan,samples_per_unit);
-}
-
-uint32_t region_length_from_c (void *arg)
-{
-
- return ((AudioRegion *) arg)->length();
-}
-
-uint32_t sourcefile_length_from_c (void *arg, double zoom_factor)
-{
- return ( (AudioRegion *) arg)->audio_source()->available_peaks (zoom_factor) ;
-}
-
-} /* extern "C" */
diff --git a/libs/ardour/audiosource.cc b/libs/ardour/audiosource.cc
index 84a5b687f9..c08cea962b 100644
--- a/libs/ardour/audiosource.cc
+++ b/libs/ardour/audiosource.cc
@@ -17,12 +17,15 @@
*/
-#include <sys/stat.h>
+#ifdef COMPILER_MSVC
+#include <sys/utime.h>
+#else
#include <unistd.h>
+#include <utime.h>
+#endif
+#include <sys/stat.h>
#include <fcntl.h>
-#include <poll.h>
#include <float.h>
-#include <utime.h>
#include <cerrno>
#include <ctime>
#include <cmath>
@@ -31,6 +34,12 @@
#include <algorithm>
#include <vector>
+#include <glib.h>
+#include <glib/gstdio.h>
+
+#include <boost/scoped_array.hpp>
+#include <boost/scoped_ptr.hpp>
+
#include <glibmm/fileutils.h>
#include <glibmm/miscutils.h>
@@ -42,6 +51,8 @@
#include "i18n.h"
+#include "ardour/debug.h"
+
using namespace std;
using namespace ARDOUR;
using namespace PBD;
@@ -173,9 +184,9 @@ AudioSource::peaks_ready (boost::function<void()> doThisWhenReady, ScopedConnect
void
AudioSource::touch_peakfile ()
{
- struct stat statbuf;
+ GStatBuf statbuf;
- if (stat (peakpath.c_str(), &statbuf) != 0 || statbuf.st_size == 0) {
+ if (g_stat (peakpath.c_str(), &statbuf) != 0 || statbuf.st_size == 0) {
return;
}
@@ -184,7 +195,7 @@ AudioSource::touch_peakfile ()
tbuf.actime = statbuf.st_atime;
tbuf.modtime = time ((time_t*) 0);
- utime (peakpath.c_str(), &tbuf);
+ g_utime (peakpath.c_str(), &tbuf);
}
int
@@ -195,7 +206,7 @@ AudioSource::rename_peakfile (string newpath)
string oldpath = peakpath;
if (Glib::file_test (oldpath, Glib::FILE_TEST_EXISTS)) {
- if (rename (oldpath.c_str(), newpath.c_str()) != 0) {
+ if (g_rename (oldpath.c_str(), newpath.c_str()) != 0) {
error << string_compose (_("cannot rename peakfile for %1 from %2 to %3 (%4)"), _name, oldpath, newpath, strerror (errno)) << endmsg;
return -1;
}
@@ -209,17 +220,19 @@ AudioSource::rename_peakfile (string newpath)
int
AudioSource::initialize_peakfile (string audio_path)
{
- struct stat statbuf;
+ GStatBuf statbuf;
peakpath = peak_path (audio_path);
+ DEBUG_TRACE(DEBUG::Peaks, string_compose ("Initialize Peakfile %1 for Audio file %2\n", peakpath, audio_path));
+
/* if the peak file should be there, but isn't .... */
if (!empty() && !Glib::file_test (peakpath.c_str(), Glib::FILE_TEST_EXISTS)) {
peakpath = find_broken_peakfile (peakpath, audio_path);
}
- if (stat (peakpath.c_str(), &statbuf)) {
+ if (g_stat (peakpath.c_str(), &statbuf)) {
if (errno != ENOENT) {
/* it exists in the peaks dir, but there is some kind of error */
@@ -227,7 +240,7 @@ AudioSource::initialize_peakfile (string audio_path)
return -1;
}
- /* peakfile does not exist */
+ DEBUG_TRACE(DEBUG::Peaks, string_compose("Peakfile %1 does not exist\n", peakpath));
_peaks_built = false;
@@ -236,7 +249,7 @@ AudioSource::initialize_peakfile (string audio_path)
/* we found it in the peaks dir, so check it out */
if (statbuf.st_size == 0 || (statbuf.st_size < (off_t) ((length(_timeline_position) / _FPP) * sizeof (PeakData)))) {
- // empty
+ DEBUG_TRACE(DEBUG::Peaks, string_compose("Peakfile %1 is empty\n", peakpath));
_peaks_built = false;
} else {
// Check if the audio file has changed since the peakfile was built.
@@ -248,6 +261,7 @@ AudioSource::initialize_peakfile (string audio_path)
/* no audio path - nested source or we can't
read it or ... whatever, use the peakfile as-is.
*/
+ DEBUG_TRACE(DEBUG::Peaks, string_compose("Error when calling stat on Peakfile %1\n", peakpath));
_peaks_built = true;
_peak_byte_max = statbuf.st_size;
@@ -289,7 +303,7 @@ framecnt_t
AudioSource::write (Sample *dst, framecnt_t cnt)
{
Glib::Threads::Mutex::Lock lm (_lock);
- /* any write makes the fill not removable */
+ /* any write makes the file not removable */
_flags = Flag (_flags & ~Removable);
return write_unlocked (dst, cnt);
}
@@ -316,33 +330,20 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t
int32_t to_read;
uint32_t nread;
framecnt_t zero_fill = 0;
- int ret = -1;
- PeakData* staging = 0;
- Sample* raw_staging = 0;
- FdFileDescriptor* peakfile_descriptor = new FdFileDescriptor (peakpath, false, 0664);
+ boost::scoped_ptr<FdFileDescriptor> peakfile_descriptor(new FdFileDescriptor (peakpath, false, 0664));
int peakfile_fd = -1;
expected_peaks = (cnt / (double) samples_per_file_peak);
scale = npeaks/expected_peaks;
-#undef DEBUG_READ_PEAKS
-#ifdef DEBUG_READ_PEAKS
- cerr << "======>RP: npeaks = " << npeaks
- << " start = " << start
- << " cnt = " << cnt
- << " len = " << _length
- << " samples_per_visual_peak =" << samples_per_visual_peak
- << " expected was " << expected_peaks << " ... scale = " << scale
- << " PD ptr = " << peaks
- <<endl;
-
-#endif
+ DEBUG_TRACE (DEBUG::Peaks, string_compose (" ======>RP: npeaks = %1 start = %2 cnt = %3 len = %4 samples_per_visual_peak = %5 expected was %6 ... scale = %7 PD ptr = %8\n"
+ , npeaks, start, cnt, _length, samples_per_visual_peak, expected_peaks, scale, peaks));
/* fix for near-end-of-file conditions */
if (cnt > _length - start) {
- // cerr << "too close to end @ " << _length << " given " << start << " + " << cnt << endl;
+ // cerr << "too close to end @ " << _length << " given " << start << " + " << cnt << " (" << _length - start << ")" << endl;
cnt = _length - start;
framecnt_t old = npeaks;
npeaks = min ((framecnt_t) floor (cnt / samples_per_visual_peak), npeaks);
@@ -353,16 +354,15 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t
if (npeaks == cnt) {
-#ifdef DEBUG_READ_PEAKS
- cerr << "RAW DATA\n";
-#endif
+ DEBUG_TRACE (DEBUG::Peaks, "RAW DATA\n");
+
/* no scaling at all, just get the sample data and duplicate it for
both max and min peak values.
*/
- Sample* raw_staging = new Sample[cnt];
+ boost::scoped_array<Sample> raw_staging(new Sample[cnt]);
- if (read_unlocked (raw_staging, start, cnt) != cnt) {
+ if (read_unlocked (raw_staging.get(), start, cnt) != cnt) {
error << _("cannot read sample data for unscaled peak computation") << endmsg;
return -1;
}
@@ -372,43 +372,35 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t
peaks[i].min = raw_staging[i];
}
- delete peakfile_descriptor;
- delete [] raw_staging;
return 0;
}
if (scale == 1.0) {
+ off_t offset = 0;
off_t first_peak_byte = (start / samples_per_file_peak) * sizeof (PeakData);
-
+ ssize_t bytes_to_read = sizeof (PeakData)* npeaks;
/* open, read, close */
if ((peakfile_fd = peakfile_descriptor->allocate ()) < 0) {
error << string_compose(_("AudioSource: cannot open peakpath (a) \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
- delete peakfile_descriptor;
return -1;
}
-#ifdef DEBUG_READ_PEAKS
- cerr << "DIRECT PEAKS\n";
-#endif
+ DEBUG_TRACE (DEBUG::Peaks, "DIRECT PEAKS\n");
- nread = ::pread (peakfile_fd, peaks, sizeof (PeakData)* npeaks, first_peak_byte);
-
- if (nread != sizeof (PeakData) * npeaks) {
- cerr << "AudioSource["
- << _name
- << "]: cannot read peaks from peakfile! (read only "
- << nread
- << " not "
- << npeaks
- << "at sample "
- << start
- << " = byte "
- << first_peak_byte
- << ')'
- << endl;
- delete peakfile_descriptor;
+ offset = lseek (peakfile_fd, first_peak_byte, SEEK_SET);
+
+ if (offset != first_peak_byte) {
+ error << string_compose(_("AudioSource: could not seek to correct location in peak file \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
+ return -1;
+ }
+
+ nread = ::read (peakfile_fd, peaks, bytes_to_read);
+
+ if (nread != bytes_to_read) {
+ DEBUG_TRACE (DEBUG::Peaks, string_compose ("[%1]: Cannot read peaks from peakfile! (read only %2 not %3 at sample %4 = byte %5 )\n"
+ , _name, nread, npeaks, start, first_peak_byte));
return -1;
}
@@ -416,7 +408,6 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t
memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill);
}
- delete peakfile_descriptor;
return 0;
}
@@ -425,9 +416,8 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t
if (scale < 1.0) {
-#ifdef DEBUG_READ_PEAKS
- cerr << "DOWNSAMPLE\n";
-#endif
+ DEBUG_TRACE (DEBUG::Peaks, "DOWNSAMPLE\n");
+
/* the caller wants:
- more frames-per-peak (lower resolution) than the peakfile, or to put it another way,
@@ -440,7 +430,7 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t
const framecnt_t chunksize = (framecnt_t) min (expected_peaks, 65536.0);
- staging = new PeakData[chunksize];
+ boost::scoped_array<PeakData> staging(new PeakData[chunksize]);
/* compute the rounded up frame position */
@@ -461,8 +451,6 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t
if ((peakfile_fd = peakfile_descriptor->allocate ()) < 0) {
error << string_compose(_("AudioSource: cannot open peakpath (b) \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
- delete peakfile_descriptor;
- delete [] staging;
return 0;
}
@@ -473,33 +461,27 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t
uint32_t start_byte = current_stored_peak * sizeof(PeakData);
tnp = min ((framecnt_t)(_length/samples_per_file_peak - current_stored_peak), (framecnt_t) expected_peaks);
to_read = min (chunksize, tnp);
+ ssize_t bytes_to_read = sizeof (PeakData) * to_read;
-#ifdef DEBUG_READ_PEAKS
- cerr << "read " << sizeof (PeakData) * to_read << " from peakfile @ " << start_byte << endl;
-#endif
+ DEBUG_TRACE (DEBUG::Peaks, string_compose ("reading %1 bytes from peakfile @ %2\n"
+ , bytes_to_read, start_byte));
- if ((nread = ::pread (peakfile_fd, staging, sizeof (PeakData) * to_read, start_byte))
- != sizeof (PeakData) * to_read) {
- off_t fend = lseek (peakfile_fd, 0, SEEK_END);
+ off_t offset = lseek (peakfile_fd, start_byte, SEEK_SET);
- cerr << "AudioSource["
- << _name
- << "]: cannot read peak data from peakfile ("
- << (nread / sizeof(PeakData))
- << " peaks instead of "
- << to_read
- << ") ("
- << strerror (errno)
- << ')'
- << " at start_byte = " << start_byte
- << " _length = " << _length << " versus len = " << fend
- << " expected maxpeaks = " << (_length - current_frame)/samples_per_file_peak
- << " npeaks was " << npeaks
- << endl;
- goto out;
+ if (offset != start_byte) {
+ error << string_compose(_("AudioSource: could not seek to correct location in peak file \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
+ return -1;
}
+ if ((nread = ::read (peakfile_fd, staging.get(), bytes_to_read)) != bytes_to_read) {
+
+ off_t fend = lseek (peakfile_fd, 0, SEEK_END);
+
+ DEBUG_TRACE (DEBUG::Peaks, string_compose ("[%1]: cannot read peak data from peakfile (%2 peaks instead of %3) (%4) at start_byte = %5 _length = %6 versus len = %7 expected maxpeaks = %8 npeaks was %9"
+ , _name, (nread / sizeof(PeakData)), to_read, g_strerror (errno), start_byte, _length, fend, ((_length - current_frame)/samples_per_file_peak), npeaks));
+ return -1;
+ }
i = 0;
stored_peaks_read = nread / sizeof(PeakData);
}
@@ -527,16 +509,14 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t
}
if (zero_fill) {
+ cerr << "Zero fill end of peaks (@ " << npeaks << " with " << zero_fill << endl;
memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill);
}
- ret = 0;
-
} else {
-#ifdef DEBUG_READ_PEAKS
- cerr << "UPSAMPLE\n";
-#endif
+ DEBUG_TRACE (DEBUG::Peaks, "UPSAMPLE\n");
+
/* the caller wants
- less frames-per-peak (more resolution)
@@ -551,7 +531,7 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t
framecnt_t i = 0;
framecnt_t nvisual_peaks = 0;
framecnt_t chunksize = (framecnt_t) min (cnt, (framecnt_t) 4096);
- raw_staging = new Sample[chunksize];
+ boost::scoped_array<Sample> raw_staging(new Sample[chunksize]);
framepos_t frame_pos = start;
double pixel_pos = floor (frame_pos / samples_per_visual_peak);
@@ -576,18 +556,18 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t
this loop early
*/
- memset (raw_staging, 0, sizeof (Sample) * chunksize);
+ memset (raw_staging.get(), 0, sizeof (Sample) * chunksize);
} else {
to_read = min (chunksize, (_length - current_frame));
- if ((frames_read = read_unlocked (raw_staging, current_frame, to_read)) == 0) {
+ if ((frames_read = read_unlocked (raw_staging.get(), current_frame, to_read)) == 0) {
error << string_compose(_("AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"),
_name, to_read, current_frame, _length, strerror (errno))
<< endmsg;
- goto out;
+ return -1;
}
}
@@ -615,32 +595,19 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t
if (zero_fill) {
memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill);
}
-
- ret = 0;
}
- out:
- delete peakfile_descriptor;
-
- delete [] staging;
- delete [] raw_staging;
-
-#ifdef DEBUG_READ_PEAKS
- cerr << "RP DONE\n";
-#endif
-
- return ret;
+ DEBUG_TRACE (DEBUG::Peaks, "READPEAKS DONE\n");
+ return 0;
}
-#undef DEBUG_PEAK_BUILD
-
int
AudioSource::build_peaks_from_scratch ()
{
- Sample* buf = 0;
-
const framecnt_t bufsize = 65536; // 256kB per disk read for mono data is about ideal
+ DEBUG_TRACE (DEBUG::Peaks, "Building peaks from scratch\n");
+
int ret = -1;
{
@@ -656,20 +623,20 @@ AudioSource::build_peaks_from_scratch ()
framecnt_t cnt = _length;
_peaks_built = false;
- buf = new Sample[bufsize];
+ boost::scoped_array<Sample> buf(new Sample[bufsize]);
while (cnt) {
framecnt_t frames_to_read = min (bufsize, cnt);
framecnt_t frames_read;
- if ((frames_read = read_unlocked (buf, current_frame, frames_to_read)) != frames_to_read) {
+ if ((frames_read = read_unlocked (buf.get(), current_frame, frames_to_read)) != frames_to_read) {
error << string_compose(_("%1: could not write read raw data for peak computation (%2)"), _name, strerror (errno)) << endmsg;
done_with_peakfile_writes (false);
goto out;
}
- if (compute_and_write_peaks (buf, current_frame, frames_read, true, false, _FPP)) {
+ if (compute_and_write_peaks (buf.get(), current_frame, frames_read, true, false, _FPP)) {
break;
}
@@ -690,11 +657,10 @@ AudioSource::build_peaks_from_scratch ()
out:
if (ret) {
- unlink (peakpath.c_str());
+ DEBUG_TRACE (DEBUG::Peaks, string_compose("Could not write peak data, attempting to remove peakfile %1\n", peakpath));
+ ::g_unlink (peakpath.c_str());
}
- delete [] buf;
-
return ret;
}
@@ -738,15 +704,13 @@ int
AudioSource::compute_and_write_peaks (Sample* buf, framecnt_t first_frame, framecnt_t cnt,
bool force, bool intermediate_peaks_ready, framecnt_t fpp)
{
- Sample* buf2 = 0;
framecnt_t to_do;
uint32_t peaks_computed;
- PeakData* peakbuf = 0;
- int ret = -1;
framepos_t current_frame;
framecnt_t frames_done;
const size_t blocksize = (128 * 1024);
off_t first_peak_byte;
+ boost::scoped_array<Sample> buf2;
if (_peakfile_descriptor == 0) {
prepare_for_peakfile_writes ();
@@ -769,9 +733,16 @@ AudioSource::compute_and_write_peaks (Sample* buf, framecnt_t first_frame, frame
off_t byte = (peak_leftover_frame / fpp) * sizeof (PeakData);
- if (::pwrite (_peakfile_fd, &x, sizeof (PeakData), byte) != sizeof (PeakData)) {
+ off_t offset = lseek (_peakfile_fd, byte, SEEK_SET);
+
+ if (offset != byte) {
+ error << string_compose(_("%1: could not seek in peak file data (%2)"), _name, strerror (errno)) << endmsg;
+ return -1;
+ }
+
+ if (::write (_peakfile_fd, &x, sizeof (PeakData)) != sizeof (PeakData)) {
error << string_compose(_("%1: could not write peak file data (%2)"), _name, strerror (errno)) << endmsg;
- goto out;
+ return -1;
}
_peak_byte_max = max (_peak_byte_max, (off_t) (byte + sizeof(PeakData)));
@@ -797,19 +768,19 @@ AudioSource::compute_and_write_peaks (Sample* buf, framecnt_t first_frame, frame
/* make a new contiguous buffer containing leftovers and the new stuff */
to_do = cnt + peak_leftover_cnt;
- buf2 = new Sample[to_do];
+ buf2.reset(new Sample[to_do]);
/* the remnants */
- memcpy (buf2, peak_leftovers, peak_leftover_cnt * sizeof (Sample));
+ memcpy (buf2.get(), peak_leftovers, peak_leftover_cnt * sizeof (Sample));
/* the new stuff */
- memcpy (buf2+peak_leftover_cnt, buf, cnt * sizeof (Sample));
+ memcpy (buf2.get()+peak_leftover_cnt, buf, cnt * sizeof (Sample));
/* no more leftovers */
peak_leftover_cnt = 0;
/* use the temporary buffer */
- buf = buf2;
+ buf = buf2.get();
/* make sure that when we write into the peakfile, we startup where we left off */
@@ -819,7 +790,7 @@ AudioSource::compute_and_write_peaks (Sample* buf, framecnt_t first_frame, frame
to_do = cnt;
}
- peakbuf = new PeakData[(to_do/fpp)+1];
+ boost::scoped_array<PeakData> peakbuf(new PeakData[(to_do/fpp)+1]);
peaks_computed = 0;
current_frame = first_frame;
frames_done = 0;
@@ -876,18 +847,31 @@ AudioSource::compute_and_write_peaks (Sample* buf, framecnt_t first_frame, frame
off_t target_length = blocksize * ((first_peak_byte + blocksize + 1) / blocksize);
if (endpos < target_length) {
+ DEBUG_TRACE(DEBUG::Peaks, string_compose ("Truncating Peakfile %1\n", peakpath));
if (ftruncate (_peakfile_fd, target_length)) {
/* error doesn't actually matter so continue on without testing */
}
}
}
- if (::pwrite (_peakfile_fd, peakbuf, sizeof (PeakData) * peaks_computed, first_peak_byte) != (ssize_t) (sizeof (PeakData) * peaks_computed)) {
+
+ off_t offset = lseek(_peakfile_fd, first_peak_byte, SEEK_SET);
+
+ if (offset != first_peak_byte) {
+ error << string_compose(_("%1: could not seek in peak file data (%2)"), _name, strerror (errno)) << endmsg;
+ return -1;
+ }
+
+ ssize_t bytes_to_write = sizeof (PeakData) * peaks_computed;
+
+ ssize_t bytes_written = ::write (_peakfile_fd, peakbuf.get(), bytes_to_write);
+
+ if (bytes_written != bytes_to_write) {
error << string_compose(_("%1: could not write peak file data (%2)"), _name, strerror (errno)) << endmsg;
- goto out;
+ return -1;
}
- _peak_byte_max = max (_peak_byte_max, (off_t) (first_peak_byte + sizeof(PeakData)*peaks_computed));
+ _peak_byte_max = max (_peak_byte_max, (off_t) (first_peak_byte + bytes_to_write));
if (frames_done) {
Glib::Threads::Mutex::Lock lm (_peaks_ready_lock);
@@ -897,13 +881,7 @@ AudioSource::compute_and_write_peaks (Sample* buf, framecnt_t first_frame, frame
}
}
- ret = 0;
-
- out:
- delete [] peakbuf;
- delete [] buf2;
-
- return ret;
+ return 0;
}
void
@@ -920,6 +898,7 @@ AudioSource::truncate_peakfile ()
off_t end = lseek (_peakfile_fd, 0, SEEK_END);
if (end > _peak_byte_max) {
+ DEBUG_TRACE(DEBUG::Peaks, string_compose ("Truncating Peakfile %1\n", peakpath));
if (ftruncate (_peakfile_fd, _peak_byte_max)) {
error << string_compose (_("could not truncate peakfile %1 to %2 (error: %3)"),
peakpath, _peak_byte_max, errno) << endmsg;
diff --git a/libs/ardour/auditioner.cc b/libs/ardour/auditioner.cc
index d682dc3617..d412a17d6a 100644
--- a/libs/ardour/auditioner.cc
+++ b/libs/ardour/auditioner.cc
@@ -53,6 +53,7 @@ Auditioner::Auditioner (Session& s)
, _synth_added (false)
, _synth_changed (false)
, _queue_panic (false)
+ , _import_position (0)
{
}
@@ -370,6 +371,7 @@ Auditioner::audition_region (boost::shared_ptr<Region> region)
_synth_added = false;
}
midi_region.reset();
+ _import_position = 0;
/* copy it */
the_region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (region));
@@ -399,13 +401,14 @@ Auditioner::audition_region (boost::shared_ptr<Region> region)
_midi_audition = true;
set_diskstream(_diskstream_midi);
the_region.reset();
+ _import_position = region->position();
/* copy it */
midi_region = (boost::dynamic_pointer_cast<MidiRegion> (RegionFactory::create (region)));
- midi_region->set_position (0);
+ midi_region->set_position (_import_position);
_diskstream->playlist()->drop_regions ();
- _diskstream->playlist()->add_region (midi_region, 0, 1);
+ _diskstream->playlist()->add_region (midi_region, _import_position, 1);
midi_diskstream()->reset_tracker();
ProcessorStreams ps;
@@ -457,7 +460,7 @@ Auditioner::audition_region (boost::shared_ptr<Region> region)
if (_midi_audition) {
length = midi_region->length();
- offset = midi_region->sync_offset (dir);
+ offset = _import_position + midi_region->sync_offset (dir);
} else {
length = the_region->length();
offset = the_region->sync_offset (dir);
@@ -527,7 +530,7 @@ Auditioner::play_audition (framecnt_t nframes)
}
if (!_seeking) {
- AuditionProgress(current_frame, length); /* emit */
+ AuditionProgress(current_frame - _import_position, length); /* emit */
}
if (current_frame >= length) {
diff --git a/libs/ardour/automation_list.cc b/libs/ardour/automation_list.cc
index 83df92488b..32e69af7ae 100644
--- a/libs/ardour/automation_list.cc
+++ b/libs/ardour/automation_list.cc
@@ -346,8 +346,6 @@ AutomationList::deserialize_events (const XMLNode& node)
fast_simple_add (x, y);
}
- thin ();
-
if (!ok) {
clear ();
error << _("automation list: cannot load coordinates from XML, all points ignored") << endmsg;
@@ -410,9 +408,7 @@ AutomationList::set_state (const XMLNode& node, int version)
fast_simple_add (x, y);
}
- thin ();
-
- thaw ();
+ thaw ();
return 0;
}
diff --git a/libs/ardour/automation_watch.cc b/libs/ardour/automation_watch.cc
index 87ac08abc2..5fa7285c67 100644
--- a/libs/ardour/automation_watch.cc
+++ b/libs/ardour/automation_watch.cc
@@ -19,6 +19,8 @@
#include <iostream>
+#include <glibmm/timer.h>
+
#include "pbd/compose.h"
#include "ardour/automation_control.h"
@@ -134,7 +136,7 @@ void
AutomationWatch::thread ()
{
while (_run_thread) {
- usleep ((useconds_t) floor (Config->get_automation_interval_msecs() * 1000));
+ Glib::usleep ((gulong) floor (Config->get_automation_interval_msecs() * 1000));
timer ();
}
}
diff --git a/libs/ardour/broadcast_info.cc b/libs/ardour/broadcast_info.cc
index a7fa41aaf9..a08d2c7991 100644
--- a/libs/ardour/broadcast_info.cc
+++ b/libs/ardour/broadcast_info.cc
@@ -22,6 +22,7 @@
#include <iostream>
#include <sstream>
#include <iomanip>
+#include <vector>
#include <glibmm.h>
@@ -37,15 +38,15 @@ namespace ARDOUR
static void
snprintf_bounded_null_filled (char* target, size_t target_size, char const * fmt, ...)
{
- char buf[target_size+1];
+ std::vector<char> buf(target_size+1);
va_list ap;
va_start (ap, fmt);
- vsnprintf (buf, target_size+1, fmt, ap);
+ vsnprintf (&buf[0], target_size+1, fmt, ap);
va_end (ap);
memset (target, 0, target_size);
- memcpy (target, buf, target_size);
+ memcpy (target, &buf[0], target_size);
}
@@ -84,7 +85,7 @@ BroadcastInfo::set_originator_ref_from_session (Session const & /*session*/)
/* random code is 9 digits */
- int random_code = random() % 999999999;
+ int random_code = g_random_int() % 999999999;
/* Serial number is 12 chars */
diff --git a/libs/ardour/buffer_manager.cc b/libs/ardour/buffer_manager.cc
index c8819e41cb..c221837af8 100644
--- a/libs/ardour/buffer_manager.cc
+++ b/libs/ardour/buffer_manager.cc
@@ -75,11 +75,11 @@ BufferManager::put_thread_buffers (ThreadBuffers* tbp)
}
void
-BufferManager::ensure_buffers (ChanCount howmany)
+BufferManager::ensure_buffers (ChanCount howmany, size_t custom)
{
/* this is protected by the audioengine's process lock: we do not */
for (ThreadBufferList::iterator i = thread_buffers_list->begin(); i != thread_buffers_list->end(); ++i) {
- (*i)->ensure_buffers (howmany);
+ (*i)->ensure_buffers (howmany, custom);
}
}
diff --git a/libs/ardour/butler.cc b/libs/ardour/butler.cc
index 03ae7867db..327665441e 100644
--- a/libs/ardour/butler.cc
+++ b/libs/ardour/butler.cc
@@ -20,7 +20,11 @@
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
+
+#ifndef PLATFORM_WINDOWS
#include <poll.h>
+#endif
+
#include "pbd/error.h"
#include "pbd/pthread_utils.h"
#include "ardour/butler.h"
@@ -38,7 +42,8 @@ namespace ARDOUR {
Butler::Butler(Session& s)
: SessionHandleRef (s)
- , thread(0)
+ , thread()
+ , have_thread (false)
, audio_dstream_capture_buffer_size(0)
, audio_dstream_playback_buffer_size(0)
, midi_dstream_buffer_size(0)
@@ -68,25 +73,10 @@ Butler::config_changed (std::string p)
}
}
+#ifndef PLATFORM_WINDOWS
int
-Butler::start_thread()
+Butler::setup_request_pipe ()
{
- const float rate = (float)_session.frame_rate();
-
- /* size is in Samples, not bytes */
- audio_dstream_capture_buffer_size = (uint32_t) floor (Config->get_audio_capture_buffer_seconds() * rate);
- audio_dstream_playback_buffer_size = (uint32_t) floor (Config->get_audio_playback_buffer_seconds() * rate);
-
- /* size is in bytes
- * XXX: Jack needs to tell us the MIDI buffer size
- * (i.e. how many MIDI bytes we might see in a cycle)
- */
- midi_dstream_buffer_size = (uint32_t) floor (Config->get_midi_track_buffer_seconds() * rate);
-
- MidiDiskstream::set_readahead_frames ((framecnt_t) (Config->get_midi_readahead() * rate));
-
- should_run = false;
-
if (pipe (request_pipe)) {
error << string_compose(_("Cannot create transport request signal pipe (%1)"),
strerror (errno)) << endmsg;
@@ -104,6 +94,32 @@ Butler::start_thread()
strerror (errno)) << endmsg;
return -1;
}
+ return 0;
+}
+#endif
+
+int
+Butler::start_thread()
+{
+ const float rate = (float)_session.frame_rate();
+
+ /* size is in Samples, not bytes */
+ audio_dstream_capture_buffer_size = (uint32_t) floor (Config->get_audio_capture_buffer_seconds() * rate);
+ audio_dstream_playback_buffer_size = (uint32_t) floor (Config->get_audio_playback_buffer_seconds() * rate);
+
+ /* size is in bytes
+ * XXX: Jack needs to tell us the MIDI buffer size
+ * (i.e. how many MIDI bytes we might see in a cycle)
+ */
+ midi_dstream_buffer_size = (uint32_t) floor (Config->get_midi_track_buffer_seconds() * rate);
+
+ MidiDiskstream::set_readahead_frames ((framecnt_t) (Config->get_midi_readahead() * rate));
+
+ should_run = false;
+
+#ifndef PLATFORM_WINDOWS
+ if (setup_request_pipe() != 0) return -1;
+#endif
if (pthread_create_and_store ("disk butler", &thread, _thread_work, this)) {
error << _("Session: could not create butler thread") << endmsg;
@@ -111,17 +127,16 @@ Butler::start_thread()
}
//pthread_detach (thread);
-
+ have_thread = true;
return 0;
}
void
Butler::terminate_thread ()
{
- if (thread) {
+ if (have_thread) {
void* status;
- const char c = Request::Quit;
- (void) ::write (request_pipe[1], &c, 1);
+ queue_request (Request::Quit);
pthread_join (thread, &status);
}
}
@@ -134,28 +149,25 @@ Butler::_thread_work (void* arg)
return ((Butler *) arg)->thread_work ();
}
-void *
-Butler::thread_work ()
+bool
+Butler::wait_for_requests ()
{
- uint32_t err = 0;
-
+#ifndef PLATFORM_WINDOWS
struct pollfd pfd[1];
- bool disk_work_outstanding = false;
- RouteList::iterator i;
- while (true) {
- pfd[0].fd = request_pipe[0];
- pfd[0].events = POLLIN|POLLERR|POLLHUP;
+ pfd[0].fd = request_pipe[0];
+ pfd[0].events = POLLIN|POLLERR|POLLHUP;
- if (poll (pfd, 1, (disk_work_outstanding ? 0 : -1)) < 0) {
+ while(true) {
+ if (poll (pfd, 1, -1) < 0) {
if (errno == EINTR) {
continue;
}
error << string_compose (_("poll on butler request pipe failed (%1)"),
- strerror (errno))
- << endmsg;
+ strerror (errno))
+ << endmsg;
break;
}
@@ -165,16 +177,60 @@ Butler::thread_work ()
}
if (pfd[0].revents & POLLIN) {
+ return true;
+ }
+ }
+ return false;
+#else
+ m_request_sem.wait ();
+ return true;
+#endif
+}
- char req;
+bool
+Butler::dequeue_request (Request::Type& r)
+{
+#ifndef PLATFORM_WINDOWS
+ char req;
+ size_t nread = ::read (request_pipe[0], &req, sizeof (req));
+ if (nread == 1) {
+ r = (Request::Type) req;
+ return true;
+ } else if (nread == 0) {
+ return false;
+ } else if (errno == EAGAIN) {
+ return false;
+ } else {
+ fatal << _("Error reading from butler request pipe") << endmsg;
+ /*NOTREACHED*/
+ }
+#else
+ r = (Request::Type) m_request_state.get();
+#endif
+ return false;
+}
- /* empty the pipe of all current requests */
+ void *
+Butler::thread_work ()
+{
+ uint32_t err = 0;
- while (1) {
- size_t nread = ::read (request_pipe[0], &req, sizeof (req));
- if (nread == 1) {
+ bool disk_work_outstanding = false;
+ RouteList::iterator i;
- switch ((Request::Type) req) {
+ while (true) {
+ if(!disk_work_outstanding) {
+ if (wait_for_requests ()) {
+ Request::Type req;
+
+ /* empty the pipe of all current requests */
+#ifdef PLATFORM_WINDOWS
+ dequeue_request (req);
+ {
+#else
+ while(dequeue_request(req)) {
+#endif
+ switch (req) {
case Request::Run:
should_run = true;
@@ -192,14 +248,6 @@ Butler::thread_work ()
default:
break;
}
-
- } else if (nread == 0) {
- break;
- } else if (errno == EAGAIN) {
- break;
- } else {
- fatal << _("Error reading from butler request pipe") << endmsg;
- /*NOTREACHED*/
}
}
}
@@ -346,18 +394,28 @@ Butler::schedule_transport_work ()
}
void
-Butler::summon ()
+Butler::queue_request (Request::Type r)
{
- char c = Request::Run;
+#ifndef PLATFORM_WINDOWS
+ char c = r;
(void) ::write (request_pipe[1], &c, 1);
+#else
+ m_request_state.set (r);
+ m_request_sem.post ();
+#endif
+}
+
+void
+Butler::summon ()
+{
+ queue_request (Request::Run);
}
void
Butler::stop ()
{
Glib::Threads::Mutex::Lock lm (request_lock);
- char c = Request::Pause;
- (void) ::write (request_pipe[1], &c, 1);
+ queue_request (Request::Pause);
paused.wait(request_lock);
}
@@ -365,8 +423,7 @@ void
Butler::wait_until_finished ()
{
Glib::Threads::Mutex::Lock lm (request_lock);
- char c = Request::Pause;
- (void) ::write (request_pipe[1], &c, 1);
+ queue_request (Request::Pause);
paused.wait(request_lock);
}
diff --git a/libs/ardour/control_protocol_manager.cc b/libs/ardour/control_protocol_manager.cc
index 974258a5c2..fdac48e731 100644
--- a/libs/ardour/control_protocol_manager.cc
+++ b/libs/ardour/control_protocol_manager.cc
@@ -17,7 +17,7 @@
*/
-#include <dlfcn.h>
+#include <glibmm/module.h>
#include <glibmm/fileutils.h>
@@ -29,7 +29,9 @@
#include "ardour/debug.h"
#include "ardour/control_protocol_manager.h"
-#include "ardour/control_protocol_search_path.h"
+
+#include "ardour/search_paths.h"
+
using namespace ARDOUR;
using namespace std;
@@ -211,7 +213,9 @@ ControlProtocolManager::teardown (ControlProtocolInfo& cpi)
}
cpi.protocol = 0;
- dlclose (cpi.descriptor->module);
+ delete cpi.state;
+ cpi.state = 0;
+ delete (Glib::Module*)cpi.descriptor->module;
ProtocolStatusChange (&cpi);
@@ -241,14 +245,37 @@ ControlProtocolManager::discover_control_protocols ()
{
vector<std::string> cp_modules;
+#ifdef COMPILER_MSVC
+ /**
+ * Different build targets (Debug / Release etc) use different versions
+ * of the 'C' runtime (which can't be 'mixed & matched'). Therefore, in
+ * case the supplied search path contains multiple version(s) of a given
+ * module, only select the one(s) which match the current build target
+ */
+ #if defined (_DEBUG)
+ Glib::PatternSpec dll_extension_pattern("*D.dll");
+ #elif defined (RDC_BUILD)
+ Glib::PatternSpec dll_extension_pattern("*RDC.dll");
+ #elif defined (_WIN64)
+ Glib::PatternSpec dll_extension_pattern("*64.dll");
+ #else
+ Glib::PatternSpec dll_extension_pattern("*32.dll");
+ #endif
+#else
+ Glib::PatternSpec dll_extension_pattern("*.dll");
+#endif
+
Glib::PatternSpec so_extension_pattern("*.so");
Glib::PatternSpec dylib_extension_pattern("*.dylib");
- find_matching_files_in_search_path (control_protocol_search_path (),
- so_extension_pattern, cp_modules);
+ find_files_matching_pattern (cp_modules, control_protocol_search_path (),
+ dll_extension_pattern);
- find_matching_files_in_search_path (control_protocol_search_path (),
- dylib_extension_pattern, cp_modules);
+ find_files_matching_pattern (cp_modules, control_protocol_search_path (),
+ so_extension_pattern);
+
+ find_files_matching_pattern (cp_modules, control_protocol_search_path (),
+ dylib_extension_pattern);
DEBUG_TRACE (DEBUG::ControlProtocols,
string_compose (_("looking for control protocols in %1\n"), control_protocol_search_path().to_string()));
@@ -296,7 +323,7 @@ ControlProtocolManager::control_protocol_discover (string path)
string_compose(_("Control surface protocol discovered: \"%1\"\n"), cpi->name));
}
- dlclose (descriptor->module);
+ delete (Glib::Module*)descriptor->module;
}
return 0;
@@ -305,31 +332,31 @@ ControlProtocolManager::control_protocol_discover (string path)
ControlProtocolDescriptor*
ControlProtocolManager::get_descriptor (string path)
{
- void *module;
+ Glib::Module* module = new Glib::Module(path);
ControlProtocolDescriptor *descriptor = 0;
ControlProtocolDescriptor* (*dfunc)(void);
- const char *errstr;
+ void* func = 0;
- if ((module = dlopen (path.c_str(), RTLD_NOW)) == 0) {
- error << string_compose(_("ControlProtocolManager: cannot load module \"%1\" (%2)"), path, dlerror()) << endmsg;
+ if (!(*module)) {
+ error << string_compose(_("ControlProtocolManager: cannot load module \"%1\" (%2)"), path, Glib::Module::get_last_error()) << endmsg;
+ delete module;
return 0;
}
-
- dfunc = (ControlProtocolDescriptor* (*)(void)) dlsym (module, "protocol_descriptor");
-
- if ((errstr = dlerror()) != 0) {
+ if (!module->get_symbol("protocol_descriptor", func)) {
error << string_compose(_("ControlProtocolManager: module \"%1\" has no descriptor function."), path) << endmsg;
- error << errstr << endmsg;
- dlclose (module);
+ error << Glib::Module::get_last_error() << endmsg;
+ delete module;
return 0;
}
+ dfunc = (ControlProtocolDescriptor* (*)(void))func;
descriptor = dfunc();
+
if (descriptor) {
- descriptor->module = module;
+ descriptor->module = (void*)module;
} else {
- dlclose (module);
+ delete module;
}
return descriptor;
diff --git a/libs/ardour/cycle_timer.cc b/libs/ardour/cycle_timer.cc
index 02d1abb930..bb4f3181e0 100644
--- a/libs/ardour/cycle_timer.cc
+++ b/libs/ardour/cycle_timer.cc
@@ -22,6 +22,8 @@
#include "pbd/error.h"
#include "ardour/cycle_timer.h"
+#include "ardour/libardour_visibility.h"
+
#include "i18n.h"
using namespace std;
diff --git a/libs/ardour/debug.cc b/libs/ardour/debug.cc
index fb122dd83c..69f2663aa8 100644
--- a/libs/ardour/debug.cc
+++ b/libs/ardour/debug.cc
@@ -31,6 +31,8 @@ uint64_t PBD::DEBUG::MidiDiskstreamIO = PBD::new_debug_bit ("mididiskstreamio");
uint64_t PBD::DEBUG::SnapBBT = PBD::new_debug_bit ("snapbbt");
uint64_t PBD::DEBUG::Configuration = PBD::new_debug_bit ("configuration");
uint64_t PBD::DEBUG::Latency = PBD::new_debug_bit ("latency");
+uint64_t PBD::DEBUG::LatencyCompensation = PBD::new_debug_bit ("latencycompensation");
+uint64_t PBD::DEBUG::Peaks = PBD::new_debug_bit ("peaks");
uint64_t PBD::DEBUG::Processors = PBD::new_debug_bit ("processors");
uint64_t PBD::DEBUG::ProcessThreads = PBD::new_debug_bit ("processthreads");
uint64_t PBD::DEBUG::Graph = PBD::new_debug_bit ("graph");
@@ -61,5 +63,7 @@ uint64_t PBD::DEBUG::OrderKeys = PBD::new_debug_bit ("orderkeys");
uint64_t PBD::DEBUG::Automation = PBD::new_debug_bit ("automation");
uint64_t PBD::DEBUG::WiimoteControl = PBD::new_debug_bit ("wiimotecontrol");
uint64_t PBD::DEBUG::Ports = PBD::new_debug_bit ("Ports");
+uint64_t PBD::DEBUG::AudioEngine = PBD::new_debug_bit ("AudioEngine");
+uint64_t PBD::DEBUG::Soundcloud = PBD::new_debug_bit ("Soundcloud");
diff --git a/libs/ardour/default_click.cc b/libs/ardour/default_click.cc
index fd23f0166d..7e8eca8fd2 100644
--- a/libs/ardour/default_click.cc
+++ b/libs/ardour/default_click.cc
@@ -21,6 +21,10 @@
#include "ardour/session.h"
#include "ardour/types.h"
+#ifdef COMPILER_MSVC
+#pragma warning(disable:4305)
+#endif
+
using namespace ARDOUR;
const Sample Session::default_click_emphasis[] = {
diff --git a/libs/ardour/delayline.cc b/libs/ardour/delayline.cc
new file mode 100644
index 0000000000..0bd7793366
--- /dev/null
+++ b/libs/ardour/delayline.cc
@@ -0,0 +1,351 @@
+/*
+ Copyright (C) 2006, 2013 Paul Davis
+ Copyright (C) 2013, 2014 Robin Gareus <robin@gareus.org>
+
+ 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.
+*/
+
+#include <assert.h>
+#include <cmath>
+
+#include "pbd/compose.h"
+
+#include "ardour/debug.h"
+#include "ardour/audio_buffer.h"
+#include "ardour/midi_buffer.h"
+#include "ardour/buffer_set.h"
+#include "ardour/delayline.h"
+
+using namespace std;
+using namespace PBD;
+using namespace ARDOUR;
+
+DelayLine::DelayLine (Session& s, const std::string& name)
+ : Processor (s, string_compose ("latency-compensation-%1", name))
+ , _delay(0)
+ , _pending_delay(0)
+ , _bsiz(0)
+ , _pending_bsiz(0)
+ , _roff(0)
+ , _woff(0)
+ , _pending_flush(false)
+{
+}
+
+DelayLine::~DelayLine ()
+{
+}
+
+#define FADE_LEN (16)
+void
+DelayLine::run (BufferSet& bufs, framepos_t /* start_frame */, framepos_t /* end_frame */, pframes_t nsamples, bool)
+{
+ const uint32_t chn = _configured_output.n_audio();
+ pframes_t p0 = 0;
+ uint32_t c;
+
+ const frameoffset_t pending_delay = _pending_delay;
+ const frameoffset_t delay_diff = _delay - pending_delay;
+ const bool pending_flush = _pending_flush;
+ _pending_flush = false;
+
+ /* run() and set_delay() may be called in parallel by
+ * different threads.
+ * if a larger buffer is needed, it is allocated in
+ * set_delay(), here it is just swap'ed in place
+ */
+ if (_pending_bsiz) {
+ assert(_pending_bsiz >= _bsiz);
+
+ const size_t boff = _pending_bsiz - _bsiz;
+ if (_bsiz > 0) {
+ /* write offset is retained. copy existing data to new buffer */
+ frameoffset_t wl = _bsiz - _woff;
+ memcpy(_pending_buf.get(), _buf.get(), sizeof(Sample) * _woff * chn);
+ memcpy(_pending_buf.get() + (_pending_bsiz - wl) * chn, _buf.get() + _woff * chn, sizeof(Sample) * wl * chn);
+
+ /* new buffer is all zero by default, fade into the existing data copied above */
+ frameoffset_t wo = _pending_bsiz - wl;
+ for (pframes_t pos = 0; pos < FADE_LEN; ++pos) {
+ const gain_t gain = (gain_t)pos / (gain_t)FADE_LEN;
+ for (c = 0; c < _configured_input.n_audio(); ++c) {
+ _pending_buf.get()[ wo * chn + c ] *= gain;
+ wo = (wo + 1) % (_pending_bsiz + 1);
+ }
+ }
+
+ /* read-pointer will be moved and may up anywhere..
+ * copy current data for smooth fade-out below
+ */
+ frameoffset_t roold = _roff;
+ frameoffset_t ro = _roff;
+ if (ro > _woff) {
+ ro += boff;
+ }
+ ro += delay_diff;
+ if (ro < 0) {
+ ro -= (_pending_bsiz +1) * floor(ro / (float)(_pending_bsiz +1));
+ }
+ ro = ro % (_pending_bsiz + 1);
+ for (pframes_t pos = 0; pos < FADE_LEN; ++pos) {
+ for (c = 0; c < _configured_input.n_audio(); ++c) {
+ _pending_buf.get()[ ro * chn + c ] = _buf.get()[ roold * chn + c ];
+ ro = (ro + 1) % (_pending_bsiz + 1);
+ roold = (roold + 1) % (_bsiz + 1);
+ }
+ }
+ }
+
+ if (_roff > _woff) {
+ _roff += boff;
+ }
+
+ _buf = _pending_buf;
+ _bsiz = _pending_bsiz;
+ _pending_bsiz = 0;
+ _pending_buf.reset();
+ }
+
+ /* there may be no buffer when delay == 0.
+ * we also need to check audio-channels in case all audio-channels
+ * were removed in which case no new buffer was allocated. */
+ Sample *buf = _buf.get();
+ if (buf && _configured_output.n_audio() > 0) {
+
+ assert (_bsiz >= pending_delay);
+ const framecnt_t rbs = _bsiz + 1;
+
+ if (pending_delay != _delay || pending_flush) {
+ const pframes_t fade_len = (nsamples >= FADE_LEN) ? FADE_LEN : nsamples / 2;
+
+ DEBUG_TRACE (DEBUG::LatencyCompensation,
+ string_compose ("Old %1 delay: %2 bufsiz: %3 offset-diff: %4 write-offset: %5 read-offset: %6\n",
+ name(), _delay, _bsiz, ((_woff - _roff + rbs) % rbs), _woff, _roff));
+
+ // fade out at old position
+ c = 0;
+ for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++c) {
+ Sample * const data = i->data();
+ for (pframes_t pos = 0; pos < fade_len; ++pos) {
+ const gain_t gain = (gain_t)(fade_len - pos) / (gain_t)fade_len;
+ buf[ _woff * chn + c ] = data[ pos ];
+ data[ pos ] = buf[ _roff * chn + c ] * gain;
+ _roff = (_roff + 1) % rbs;
+ _woff = (_woff + 1) % rbs;
+ }
+ }
+
+ if (pending_flush) {
+ DEBUG_TRACE (DEBUG::LatencyCompensation,
+ string_compose ("Flush buffer: %1\n", name()));
+ memset(buf, 0, _configured_output.n_audio() * rbs * sizeof (Sample));
+ }
+
+ // adjust read pointer
+ _roff += _delay - pending_delay;
+
+ if (_roff < 0) {
+ _roff -= rbs * floor(_roff / (float)rbs);
+ }
+ _roff = _roff % rbs;
+
+ // fade in at new position
+ c = 0;
+ for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++c) {
+ Sample * const data = i->data();
+ for (pframes_t pos = fade_len; pos < 2 * fade_len; ++pos) {
+ const gain_t gain = (gain_t)(pos - fade_len) / (gain_t)fade_len;
+ buf[ _woff * chn + c ] = data[ pos ];
+ data[ pos ] = buf[ _roff * chn + c ] * gain;
+ _roff = (_roff + 1) % rbs;
+ _woff = (_woff + 1) % rbs;
+ }
+ }
+ p0 = 2 * fade_len;
+
+ _delay = pending_delay;
+
+ DEBUG_TRACE (DEBUG::LatencyCompensation,
+ string_compose ("New %1 delay: %2 bufsiz: %3 offset-diff: %4 write-offset: %5 read-offset: %6\n",
+ name(), _delay, _bsiz, ((_woff - _roff + rbs) % rbs), _woff, _roff));
+ }
+
+ assert(_delay == ((_woff - _roff + rbs) % rbs));
+
+ c = 0;
+ for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++c) {
+ Sample * const data = i->data();
+ for (pframes_t pos = p0; pos < nsamples; ++pos) {
+ buf[ _woff * chn + c ] = data[ pos ];
+ data[ pos ] = buf[ _roff * chn + c ];
+ _roff = (_roff + 1) % rbs;
+ _woff = (_woff + 1) % rbs;
+ }
+ }
+ }
+
+ if (_midi_buf.get()) {
+ _delay = pending_delay;
+
+ for (BufferSet::midi_iterator i = bufs.midi_begin(); i != bufs.midi_end(); ++i) {
+ if (i != bufs.midi_begin()) { break; } // XXX only one buffer for now
+
+ MidiBuffer* dly = _midi_buf.get();
+ MidiBuffer& mb (*i);
+ if (pending_flush) {
+ dly->silence(nsamples);
+ }
+
+ // If the delay time changes, iterate over all events in the dly-buffer
+ // and adjust the time in-place. <= 0 becomes 0.
+ //
+ // iterate over all events in dly-buffer and subtract one cycle
+ // (nsamples) from the timestamp, bringing them closer to de-queue.
+ for (MidiBuffer::iterator m = dly->begin(); m != dly->end(); ++m) {
+ MidiBuffer::TimeType *t = m.timeptr();
+ if (*t > nsamples + delay_diff) {
+ *t -= nsamples + delay_diff;
+ } else {
+ *t = 0;
+ }
+ }
+
+ if (_delay != 0) {
+ // delay events in current-buffer, in place.
+ for (MidiBuffer::iterator m = mb.begin(); m != mb.end(); ++m) {
+ MidiBuffer::TimeType *t = m.timeptr();
+ *t += _delay;
+ }
+ }
+
+ // move events from dly-buffer into current-buffer until nsamples
+ // and remove them from the dly-buffer
+ for (MidiBuffer::iterator m = dly->begin(); m != dly->end();) {
+ const Evoral::MIDIEvent<MidiBuffer::TimeType> ev (*m, false);
+ if (ev.time() >= nsamples) {
+ break;
+ }
+ mb.insert_event(ev);
+ m = dly->erase(m);
+ }
+
+ /* For now, this is only relevant if there is there's a positive delay.
+ * In the future this could also be used to delay 'too early' events
+ * (ie '_global_port_buffer_offset + _port_buffer_offset' - midi_port.cc)
+ */
+ if (_delay != 0) {
+ // move events after nsamples from current-buffer into dly-buffer
+ // and trim current-buffer after nsamples
+ for (MidiBuffer::iterator m = mb.begin(); m != mb.end();) {
+ const Evoral::MIDIEvent<MidiBuffer::TimeType> ev (*m, false);
+ if (ev.time() < nsamples) {
+ ++m;
+ continue;
+ }
+ dly->insert_event(ev);
+ m = mb.erase(m);
+ }
+ }
+ }
+ }
+
+ _delay = pending_delay;
+}
+
+void
+DelayLine::set_delay(framecnt_t signal_delay)
+{
+ if (signal_delay < 0) {
+ signal_delay = 0;
+ cerr << "WARNING: latency compensation is not possible.\n";
+ }
+
+ const framecnt_t rbs = signal_delay + 1;
+
+ DEBUG_TRACE (DEBUG::LatencyCompensation,
+ string_compose ("%1 set_delay to %2 samples for %3 channels\n",
+ name(), signal_delay, _configured_output.n_audio()));
+
+ if (signal_delay <= _bsiz) {
+ _pending_delay = signal_delay;
+ return;
+ }
+
+ if (_pending_bsiz) {
+ if (_pending_bsiz < signal_delay) {
+ cerr << "LatComp: buffer resize in progress. "<< name() << "pending: "<< _pending_bsiz <<" want: " << signal_delay <<"\n"; // XXX
+ } else {
+ _pending_delay = signal_delay;
+ }
+ return;
+ }
+
+ if (_configured_output.n_audio() > 0 ) {
+ _pending_buf.reset(new Sample[_configured_output.n_audio() * rbs]);
+ memset(_pending_buf.get(), 0, _configured_output.n_audio() * rbs * sizeof (Sample));
+ _pending_bsiz = signal_delay;
+ } else {
+ _pending_buf.reset();
+ _pending_bsiz = 0;
+ }
+
+ _pending_delay = signal_delay;
+
+ DEBUG_TRACE (DEBUG::LatencyCompensation,
+ string_compose ("allocated buffer for %1 of size %2\n",
+ name(), signal_delay));
+}
+
+bool
+DelayLine::can_support_io_configuration (const ChanCount& in, ChanCount& out)
+{
+ out = in;
+ return true;
+}
+
+bool
+DelayLine::configure_io (ChanCount in, ChanCount out)
+{
+ if (out != in) { // always 1:1
+ return false;
+ }
+
+ // TODO realloc buffers if channel count changes..
+ // TODO support multiple midi buffers
+
+ DEBUG_TRACE (DEBUG::LatencyCompensation,
+ string_compose ("configure IO: %1 Ain: %2 Aout: %3 Min: %4 Mout: %5\n",
+ name(), in.n_audio(), out.n_audio(), in.n_midi(), out.n_midi()));
+
+ if (in.n_midi() > 0 && !_midi_buf) {
+ _midi_buf.reset(new MidiBuffer(16384));
+ }
+
+ return Processor::configure_io (in, out);
+}
+
+void
+DelayLine::flush()
+{
+ _pending_flush = true;
+}
+
+XMLNode&
+DelayLine::state (bool full_state)
+{
+ XMLNode& node (Processor::state (full_state));
+ node.add_property("type", "delay");
+ return node;
+}
diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc
index 8c12d44e51..30f7ef63fa 100644
--- a/libs/ardour/delivery.cc
+++ b/libs/ardour/delivery.cc
@@ -249,6 +249,7 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf
processing pathway that wants to use this->output_buffers() for some reason.
*/
+ // TODO delayline -- latency-compensation
output_buffers().get_backend_port_addresses (ports, nframes);
// this Delivery processor is not a derived type, and thus we assume
@@ -556,7 +557,7 @@ Delivery::set_name (const std::string& name)
{
bool ret = IOProcessor::set_name (name);
- if (ret) {
+ if (ret && _panshell) {
ret = _panshell->set_name (name);
}
diff --git a/libs/ardour/directory_names.cc b/libs/ardour/directory_names.cc
index af7f7f550c..c368f8eaaf 100644
--- a/libs/ardour/directory_names.cc
+++ b/libs/ardour/directory_names.cc
@@ -36,14 +36,16 @@ const char* const export_formats_dir_name = X_("export");
const char* const templates_dir_name = X_("templates");
const char* const route_templates_dir_name = X_("route_templates");
const char* const surfaces_dir_name = X_("surfaces");
+const char* const ladspa_dir_name = X_("ladspa");
const char* const panner_dir_name = X_("panners");
const char* const backend_dir_name = X_("backends");
-/* these should end up using variants of PROGRAM_NAME */
-#ifdef __APPLE__
-const char* const user_config_dir_name = X_("Ardour" "3");
+char config_dir_name[] = X_(PROGRAM_NAME "3");
+#if defined (__APPLE__) || defined (PLATFORM_WINDOWS)
+const char* const user_config_dir_name = config_dir_name;
#else
-const char* const user_config_dir_name = X_("ardour" "3");
+#include "pbd/convert.h"
+const char* const user_config_dir_name = PBD::downcase (config_dir_name);
#endif
}
diff --git a/libs/ardour/diskstream.cc b/libs/ardour/diskstream.cc
index 94b68478d1..0e05ffabf4 100644
--- a/libs/ardour/diskstream.cc
+++ b/libs/ardour/diskstream.cc
@@ -29,7 +29,6 @@
#include <cstdlib>
#include <ctime>
#include <sys/stat.h>
-#include <sys/mman.h>
#include <glibmm/threads.h>
@@ -281,17 +280,17 @@ Diskstream::set_align_choice (AlignChoice a, bool force)
if ((a != _alignment_choice) || force) {
_alignment_choice = a;
- switch (_alignment_choice) {
- case Automatic:
- set_align_style_from_io ();
- break;
- case UseExistingMaterial:
- set_align_style (ExistingMaterial);
- break;
- case UseCaptureTime:
- set_align_style (CaptureTime);
- break;
- }
+ switch (_alignment_choice) {
+ case Automatic:
+ set_align_style_from_io ();
+ break;
+ case UseExistingMaterial:
+ set_align_style (ExistingMaterial);
+ break;
+ case UseCaptureTime:
+ set_align_style (CaptureTime);
+ break;
+ }
}
}
@@ -438,7 +437,13 @@ Diskstream::set_name (const string& str)
playlist()->set_name (str);
SessionObject::set_name(str);
}
- return true;
+ return true;
+}
+
+bool
+Diskstream::set_write_source_name (const std::string& str) {
+ _write_source_name = str;
+ return true;
}
XMLNode&
@@ -571,7 +576,7 @@ Diskstream::move_processor_automation (boost::weak_ptr<Processor> p, list< Evora
set<Evoral::Parameter> const a = processor->what_can_be_automated ();
- for (set<Evoral::Parameter>::iterator i = a.begin (); i != a.end (); ++i) {
+ for (set<Evoral::Parameter>::const_iterator i = a.begin (); i != a.end (); ++i) {
boost::shared_ptr<AutomationList> al = processor->automation_control(*i)->alist();
XMLNode & before = al->get_state ();
bool const things_moved = al->move_ranges (movements);
@@ -594,27 +599,27 @@ Diskstream::check_record_status (framepos_t transport_frame, bool can_record)
const int transport_rolling = 0x4;
const int track_rec_enabled = 0x2;
const int global_rec_enabled = 0x1;
- const int fully_rec_enabled = (transport_rolling|track_rec_enabled|global_rec_enabled);
+ const int fully_rec_enabled = (transport_rolling|track_rec_enabled|global_rec_enabled);
/* merge together the 3 factors that affect record status, and compute
- what has changed.
- */
+ * what has changed.
+ */
rolling = _session.transport_speed() != 0.0f;
- possibly_recording = (rolling << 2) | (record_enabled() << 1) | can_record;
+ possibly_recording = (rolling << 2) | ((int)record_enabled() << 1) | (int)can_record;
change = possibly_recording ^ last_possibly_recording;
if (possibly_recording == last_possibly_recording) {
return;
}
- framecnt_t existing_material_offset = _session.worst_playback_latency();
+ framecnt_t existing_material_offset = _session.worst_playback_latency();
- if (possibly_recording == fully_rec_enabled) {
+ if (possibly_recording == fully_rec_enabled) {
- if (last_possibly_recording == fully_rec_enabled) {
- return;
- }
+ if (last_possibly_recording == fully_rec_enabled) {
+ return;
+ }
capture_start_frame = _session.transport_frame();
first_recordable_frame = capture_start_frame + _capture_offset;
@@ -637,32 +642,32 @@ Diskstream::check_record_status (framepos_t transport_frame, bool can_record)
first_recordable_frame));
}
- prepare_record_status (capture_start_frame);
+ prepare_record_status (capture_start_frame);
- } else {
+ } else {
- if (last_possibly_recording == fully_rec_enabled) {
+ if (last_possibly_recording == fully_rec_enabled) {
- /* we were recording last time */
+ /* we were recording last time */
- if (change & transport_rolling) {
+ if (change & transport_rolling) {
- /* transport-change (stopped rolling): last_recordable_frame was set in ::prepare_to_stop(). We
- had to set it there because we likely rolled past the stopping point to declick out,
- and then backed up.
- */
+ /* transport-change (stopped rolling): last_recordable_frame was set in ::prepare_to_stop(). We
+ * had to set it there because we likely rolled past the stopping point to declick out,
+ * and then backed up.
+ */
- } else {
- /* punch out */
+ } else {
+ /* punch out */
- last_recordable_frame = _session.transport_frame() + _capture_offset;
+ last_recordable_frame = _session.transport_frame() + _capture_offset;
- if (_alignment_style == ExistingMaterial) {
- last_recordable_frame += existing_material_offset;
- }
- }
- }
- }
+ if (_alignment_style == ExistingMaterial) {
+ last_recordable_frame += existing_material_offset;
+ }
+ }
+ }
+ }
last_possibly_recording = possibly_recording;
}
diff --git a/libs/ardour/element_import_handler.cc b/libs/ardour/element_import_handler.cc
index c360e82206..8f6483b145 100644
--- a/libs/ardour/element_import_handler.cc
+++ b/libs/ardour/element_import_handler.cc
@@ -18,6 +18,7 @@
*/
+#include "ardour/libardour_visibility.h"
#include "ardour/element_import_handler.h"
#include <algorithm>
diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc
index e32fe329af..7a200ee0a0 100644
--- a/libs/ardour/enums.cc
+++ b/libs/ardour/enums.cc
@@ -74,8 +74,6 @@ setup_enum_writer ()
AFLPosition _AFLPosition;
RemoteModel _RemoteModel;
DenormalModel _DenormalModel;
- CrossfadeModel _CrossfadeModel;
- CrossfadeChoice _CrossfadeChoice;
InsertMergePolicy _InsertMergePolicy;
ListenPosition _ListenPosition;
SampleFormat _SampleFormat;
@@ -289,15 +287,6 @@ setup_enum_writer ()
*/
enum_writer.add_to_hack_table ("EditorOrdered", "MixerOrdered");
- REGISTER_ENUM (FullCrossfade);
- REGISTER_ENUM (ShortCrossfade);
- REGISTER (_CrossfadeModel);
-
- REGISTER_ENUM (RegionFades);
- REGISTER_ENUM (ConstantPowerMinus3dB);
- REGISTER_ENUM (ConstantPowerMinus6dB);
- REGISTER (_CrossfadeChoice);
-
REGISTER_ENUM (InsertMergeReject);
REGISTER_ENUM (InsertMergeRelax);
REGISTER_ENUM (InsertMergeReplace);
@@ -794,34 +783,6 @@ std::ostream& operator<<(std::ostream& o, const InsertMergePolicy& var)
return o << s;
}
-std::istream& operator>>(std::istream& o, CrossfadeModel& var)
-{
- std::string s;
- o >> s;
- var = (CrossfadeModel) string_2_enum (s, var);
- return o;
-}
-
-std::ostream& operator<<(std::ostream& o, const CrossfadeModel& var)
-{
- std::string s = enum_2_string (var);
- return o << s;
-}
-
-std::istream& operator>>(std::istream& o, CrossfadeChoice& var)
-{
- std::string s;
- o >> s;
- var = (CrossfadeChoice) string_2_enum (s, var);
- return o;
-}
-
-std::ostream& operator<<(std::ostream& o, const CrossfadeChoice& var)
-{
- std::string s = enum_2_string (var);
- return o << s;
-}
-
std::istream& operator>>(std::istream& o, SyncSource& var)
{
std::string s;
@@ -941,3 +902,16 @@ std::ostream& operator<<(std::ostream& o, const Evoral::OverlapType& var)
std::string s = enum_2_string (var);
return o << s;
}
+std::istream& operator>>(std::istream& o, FadeShape& var)
+{
+ std::string s;
+ o >> s;
+ var = (FadeShape) string_2_enum (s, var);
+ return o;
+}
+
+std::ostream& operator<<(std::ostream& o, const FadeShape& var)
+{
+ std::string s = enum_2_string (var);
+ return o << s;
+}
diff --git a/libs/ardour/export_channel.cc b/libs/ardour/export_channel.cc
index 0e029a01f7..9362171738 100644
--- a/libs/ardour/export_channel.cc
+++ b/libs/ardour/export_channel.cc
@@ -187,11 +187,12 @@ RegionExportChannelFactory::update_buffers (framecnt_t frames)
assert (mixdown_buffer && gain_buffer);
for (size_t channel = 0; channel < n_channels; ++channel) {
memset (mixdown_buffer.get(), 0, sizeof (Sample) * frames);
+ buffers.get_audio (channel).silence(frames);
region.read_at (buffers.get_audio (channel).data(), mixdown_buffer.get(), gain_buffer.get(), position, frames, channel);
}
break;
case Processed:
- track.export_stuff (buffers, position, frames, track.main_outs(), true, true);
+ track.export_stuff (buffers, position, frames, track.main_outs(), true, true, false);
break;
default:
throw ExportFailed ("Unhandled type in ExportChannelFactory::update_buffers");
@@ -239,7 +240,11 @@ RouteExportChannel::read (Sample const *& data, framecnt_t frames) const
{
assert(processor);
AudioBuffer const & buffer = processor->get_capture_buffers().get_audio (channel);
+#ifndef NDEBUG
+ (void) frames;
+#else
assert (frames <= (framecnt_t) buffer.capacity());
+#endif
data = buffer.data();
}
diff --git a/libs/ardour/export_filename.cc b/libs/ardour/export_filename.cc
index 9e126ed087..f7fe22c3b4 100644
--- a/libs/ardour/export_filename.cc
+++ b/libs/ardour/export_filename.cc
@@ -19,7 +19,6 @@
*/
#include <string>
-#include "ardour/export_filename.h"
#include <glibmm/miscutils.h>
#include <glibmm/fileutils.h>
@@ -28,11 +27,13 @@
#include "pbd/convert.h"
#include "pbd/enumwriter.h"
+#include "ardour/libardour_visibility.h"
#include "ardour/session.h"
#include "ardour/session_directory.h"
-#include "ardour/export_timespan.h"
+#include "ardour/export_filename.h"
#include "ardour/export_format_specification.h"
#include "ardour/export_channel_configuration.h"
+#include "ardour/export_timespan.h"
#include "ardour/utils.h"
#include "i18n.h"
diff --git a/libs/ardour/export_format_base.cc b/libs/ardour/export_format_base.cc
index ed8bb9d5f8..1eda449915 100644
--- a/libs/ardour/export_format_base.cc
+++ b/libs/ardour/export_format_base.cc
@@ -185,7 +185,7 @@ ExportFormatBase::nearest_sample_rate (framecnt_t sample_rate)
SampleRate best_match = SR_None;
#define DO_SR_COMPARISON(rate) \
- diff = std::fabs((rate) - sample_rate); \
+ diff = std::fabs((double)((rate) - sample_rate)); \
if(diff < smallest_diff) { \
smallest_diff = diff; \
best_match = (rate); \
diff --git a/libs/ardour/export_format_manager.cc b/libs/ardour/export_format_manager.cc
index 890623c114..04cfa76677 100644
--- a/libs/ardour/export_format_manager.cc
+++ b/libs/ardour/export_format_manager.cc
@@ -293,6 +293,14 @@ ExportFormatManager::select_with_toc (bool value)
check_for_description_change ();
}
+
+void
+ExportFormatManager::set_command (std::string command)
+{
+ current_selection->set_command (command);
+ check_for_description_change ();
+}
+
void
ExportFormatManager::select_trim_beginning (bool value)
{
diff --git a/libs/ardour/export_format_specification.cc b/libs/ardour/export_format_specification.cc
index b139faeee2..d8a45ba533 100644
--- a/libs/ardour/export_format_specification.cc
+++ b/libs/ardour/export_format_specification.cc
@@ -170,6 +170,8 @@ ExportFormatSpecification::ExportFormatSpecification (Session & s)
, _normalize_target (1.0)
, _with_toc (false)
, _with_cue (false)
+ , _soundcloud_upload (false)
+ , _command ("")
{
format_ids.insert (F_None);
endiannesses.insert (E_FileDefault);
@@ -244,6 +246,7 @@ ExportFormatSpecification::get_state ()
root->add_property ("id", _id.to_s());
root->add_property ("with-cue", _with_cue ? "true" : "false");
root->add_property ("with-toc", _with_toc ? "true" : "false");
+ root->add_property ("command", _command);
node = root->add_child ("Encoding");
node->add_property ("id", enum_2_string (format_id()));
@@ -321,6 +324,13 @@ ExportFormatSpecification::set_state (const XMLNode & root)
_with_toc = false;
}
+
+ if ((prop = root.property ("command"))) {
+ _command = prop->value();
+ } else {
+ _command = "";
+ }
+
/* Encoding and SRC */
if ((child = root.child ("Encoding"))) {
@@ -590,6 +600,10 @@ ExportFormatSpecification::description (bool include_name)
components.push_back ("CUE");
}
+ if (!_command.empty()) {
+ components.push_back ("+");
+ }
+
string desc;
if (include_name) {
desc = _name + ": ";
diff --git a/libs/ardour/export_formats_search_path.cc b/libs/ardour/export_formats_search_path.cc
deleted file mode 100644
index cf18b14a18..0000000000
--- a/libs/ardour/export_formats_search_path.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- Copyright (C) 2007 Tim Mayberry
-
- 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.
-
-*/
-
-#include <iostream>
-#include <glibmm/miscutils.h>
-
-#include "ardour/export_formats_search_path.h"
-#include "ardour/directory_names.h"
-#include "ardour/filesystem_paths.h"
-
-namespace {
- const char * const export_env_variable_name = "ARDOUR_EXPORT_FORMATS_PATH";
-} // anonymous
-
-using namespace PBD;
-
-namespace ARDOUR {
-
-SearchPath
-export_formats_search_path ()
-{
- SearchPath spath (ardour_data_search_path());
- spath.add_subdirectory_to_paths (export_formats_dir_name);
-
- bool export_formats_path_defined = false;
- SearchPath spath_env (Glib::getenv(export_env_variable_name, export_formats_path_defined));
-
- if (export_formats_path_defined) {
- spath += spath_env;
- }
-
- return spath;
-}
-
-} // namespace ARDOUR
diff --git a/libs/ardour/export_graph_builder.cc b/libs/ardour/export_graph_builder.cc
index 301914b0ae..2c0c44033d 100644
--- a/libs/ardour/export_graph_builder.cc
+++ b/libs/ardour/export_graph_builder.cc
@@ -20,6 +20,8 @@
#include "ardour/export_graph_builder.h"
+#include <vector>
+
#include <glibmm/miscutils.h>
#include "audiographer/process_context.h"
@@ -317,8 +319,8 @@ ExportGraphBuilder::Normalizer::Normalizer (ExportGraphBuilder & parent, FileSpe
{
std::string tmpfile_path = parent.session.session_directory().export_path();
tmpfile_path = Glib::build_filename(tmpfile_path, "XXXXXX");
- char tmpfile_path_buf[tmpfile_path.size() + 1];
- std::copy(tmpfile_path.begin(), tmpfile_path.end(), tmpfile_path_buf);
+ std::vector<char> tmpfile_path_buf(tmpfile_path.size() + 1);
+ std::copy(tmpfile_path.begin(), tmpfile_path.end(), tmpfile_path_buf.begin());
tmpfile_path_buf[tmpfile_path.size()] = '\0';
config = new_config;
@@ -334,7 +336,7 @@ ExportGraphBuilder::Normalizer::Normalizer (ExportGraphBuilder & parent, FileSpe
normalizer->add_output (threader);
int format = ExportFormatBase::F_RAW | ExportFormatBase::SF_Float;
- tmp_file.reset (new TmpFile<float> (tmpfile_path_buf, format, channels, config.format->sample_rate()));
+ tmp_file.reset (new TmpFile<float> (&tmpfile_path_buf[0], format, channels, config.format->sample_rate()));
tmp_file->FileWritten.connect_same_thread (post_processing_connection,
boost::bind (&Normalizer::start_post_processing, this));
diff --git a/libs/ardour/export_handler.cc b/libs/ardour/export_handler.cc
index 93f43f33a6..e706522aa9 100644
--- a/libs/ardour/export_handler.cc
+++ b/libs/ardour/export_handler.cc
@@ -20,18 +20,24 @@
#include "ardour/export_handler.h"
+#include <glib/gstdio.h>
#include <glibmm.h>
#include <glibmm/convert.h>
#include "pbd/convert.h"
#include "ardour/audiofile_tagger.h"
+#include "ardour/debug.h"
#include "ardour/export_graph_builder.h"
#include "ardour/export_timespan.h"
#include "ardour/export_channel_configuration.h"
#include "ardour/export_status.h"
#include "ardour/export_format_specification.h"
#include "ardour/export_filename.h"
+#include "ardour/soundcloud_upload.h"
+#include "ardour/system_exec.h"
+#include "pbd/openuri.h"
+#include "pbd/basename.h"
#include "ardour/session_metadata.h"
#include "i18n.h"
@@ -277,6 +283,13 @@ ExportHandler::process_normalize ()
}
void
+ExportHandler::command_output(std::string output, size_t size)
+{
+ std::cerr << "command: " << size << ", " << output << std::endl;
+ info << output << endmsg;
+}
+
+void
ExportHandler::finish_timespan ()
{
while (config_map.begin() != timespan_bounds.second) {
@@ -296,13 +309,69 @@ ExportHandler::finish_timespan ()
AudiofileTagger::tag_file(filename, *SessionMetadata::Metadata());
}
+ if (!fmt->command().empty()) {
+
+#if 0 // would be nicer with C++11 initialiser...
+ std::map<char, std::string> subs {
+ { 'f', filename },
+ { 'd', Glib::path_get_dirname(filename) + G_DIR_SEPARATOR },
+ { 'b', PBD::basename_nosuffix(filename) },
+ ...
+ };
+#endif
+
+ PBD::ScopedConnection command_connection;
+ std::map<char, std::string> subs;
+ subs.insert (std::pair<char, std::string> ('f', filename));
+ subs.insert (std::pair<char, std::string> ('d', Glib::path_get_dirname (filename) + G_DIR_SEPARATOR));
+ subs.insert (std::pair<char, std::string> ('b', PBD::basename_nosuffix (filename)));
+ subs.insert (std::pair<char, std::string> ('s', session.path ()));
+ subs.insert (std::pair<char, std::string> ('n', session.name ()));
+
+ ARDOUR::SystemExec *se = new ARDOUR::SystemExec(fmt->command(), subs);
+ se->ReadStdout.connect_same_thread(command_connection, boost::bind(&ExportHandler::command_output, this, _1, _2));
+ if (se->start (2) == 0) {
+ // successfully started
+ while (se->is_running ()) {
+ // wait for system exec to terminate
+ Glib::usleep (1000);
+ }
+ }
+ delete (se);
+ }
+
+ if (fmt->soundcloud_upload()) {
+ SoundcloudUploader *soundcloud_uploader = new SoundcloudUploader;
+ std::string token = soundcloud_uploader->Get_Auth_Token(soundcloud_username, soundcloud_password);
+ DEBUG_TRACE (DEBUG::Soundcloud, string_compose(
+ "uploading %1 - username=%2, password=%3, token=%4",
+ filename, soundcloud_username, soundcloud_password, token) );
+ std::string path = soundcloud_uploader->Upload (
+ filename,
+ PBD::basename_nosuffix(filename), // title
+ token,
+ soundcloud_make_public,
+ soundcloud_downloadable,
+ this);
+
+ if (path.length() != 0) {
+ info << string_compose ( _("File %1 uploaded to %2"), filename, path) << endmsg;
+ if (soundcloud_open_page) {
+ DEBUG_TRACE (DEBUG::Soundcloud, string_compose ("opening %1", path) );
+ open_uri(path.c_str()); // open the soundcloud website to the new file
+ }
+ } else {
+ error << _("upload to Soundcloud failed. Perhaps your email or password are incorrect?\n") << endmsg;
+ }
+ delete soundcloud_uploader;
+ }
config_map.erase (config_map.begin());
}
start_timespan ();
}
-/*** CD Marker sutff ***/
+/*** CD Marker stuff ***/
struct LocationSortByStart {
bool operator() (Location *a, Location *b) {
@@ -422,10 +491,10 @@ ExportHandler::export_cd_marker_file (ExportTimespanPtr timespan, ExportFormatSp
} catch (std::exception& e) {
error << string_compose (_("an error occured while writing a TOC/CUE file: %1"), e.what()) << endmsg;
- ::unlink (filepath.c_str());
+ ::g_unlink (filepath.c_str());
} catch (Glib::Exception& e) {
error << string_compose (_("an error occured while writing a TOC/CUE file: %1"), e.what()) << endmsg;
- ::unlink (filepath.c_str());
+ ::g_unlink (filepath.c_str());
}
}
diff --git a/libs/ardour/export_profile_manager.cc b/libs/ardour/export_profile_manager.cc
index 42e494c0cb..4a10d3dfa8 100644
--- a/libs/ardour/export_profile_manager.cc
+++ b/libs/ardour/export_profile_manager.cc
@@ -34,7 +34,7 @@
#include "ardour/export_profile_manager.h"
#include "ardour/export_format_specification.h"
-#include "ardour/export_formats_search_path.h"
+#include "ardour/search_paths.h"
#include "ardour/export_timespan.h"
#include "ardour/export_channel_configuration.h"
#include "ardour/export_filename.h"
@@ -332,8 +332,7 @@ ExportProfileManager::find_file (std::string const & pattern)
{
vector<std::string> found;
- Glib::PatternSpec pattern_spec (pattern);
- find_matching_files_in_search_path (search_path, pattern_spec, found);
+ find_files_matching_pattern (found, search_path, pattern);
return found;
}
@@ -644,6 +643,7 @@ ExportProfileManager::get_new_format (ExportFormatSpecPtr original)
ExportFormatSpecPtr format;
if (original) {
format.reset (new ExportFormatSpecification (*original));
+ std::cerr << "After new format created from original, format has id [" << format->id().to_s() << ']' << std::endl;
} else {
format = handler->add_format();
format->set_name (_("empty format"));
@@ -685,7 +685,7 @@ ExportProfileManager::FormatStatePtr
ExportProfileManager::deserialize_format (XMLNode & root)
{
XMLProperty * prop;
- UUID id;
+ PBD::UUID id;
if ((prop = root.property ("id"))) {
id = prop->value();
@@ -724,8 +724,20 @@ ExportProfileManager::load_formats ()
void
ExportProfileManager::load_format_from_disk (std::string const & path)
{
- XMLTree const tree (path);
- ExportFormatSpecPtr format = handler->add_format (*tree.root());
+ XMLTree tree;
+
+ if (!tree.read (path)) {
+ error << string_compose (_("Cannot load export format from %1"), path) << endmsg;
+ return;
+ }
+
+ XMLNode* root = tree.root();
+ if (!root) {
+ error << string_compose (_("Cannot export format read from %1"), path) << endmsg;
+ return;
+ }
+
+ ExportFormatSpecPtr format = handler->add_format (*root);
/* Handle id to filename mapping and don't add duplicates to list */
diff --git a/libs/ardour/file_source.cc b/libs/ardour/file_source.cc
index 30ae2178fe..8c41f981b9 100644
--- a/libs/ardour/file_source.cc
+++ b/libs/ardour/file_source.cc
@@ -51,7 +51,7 @@ using namespace ARDOUR;
using namespace PBD;
using namespace Glib;
-PBD::Signal3<int,std::string,std::string,std::vector<std::string> > FileSource::AmbiguousFileName;
+PBD::Signal2<int,std::string,std::vector<std::string> > FileSource::AmbiguousFileName;
FileSource::FileSource (Session& session, DataType type, const string& path, const string& origin, Source::Flag flag)
: Source(session, type, path, flag)
@@ -243,19 +243,15 @@ FileSource::find (Session& s, DataType type, const string& path, bool must_exist
isnew = false;
if (!Glib::path_is_absolute (path)) {
- vector<string> dirs;
vector<string> hits;
string fullpath;
+ std::vector<std::string> dirs = s.source_search_path (type);
- string search_path = s.source_search_path (type);
-
- if (search_path.length() == 0) {
+ if (dirs.size() == 0) {
error << _("FileSource: search path not set") << endmsg;
goto out;
}
- split (search_path, dirs, ':');
-
hits.clear ();
for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
@@ -299,7 +295,7 @@ FileSource::find (Session& s, DataType type, const string& path, bool must_exist
/* more than one match: ask the user */
- int which = FileSource::AmbiguousFileName (path, search_path, de_duped_hits).get_value_or (-1);
+ int which = FileSource::AmbiguousFileName (path, de_duped_hits).get_value_or (-1);
if (which < 0) {
goto out;
@@ -313,8 +309,7 @@ FileSource::find (Session& s, DataType type, const string& path, bool must_exist
if (must_exist) {
error << string_compose(
- _("Filesource: cannot find required file (%1): while searching %2"),
- path, search_path) << endmsg;
+ _("Filesource: cannot find required file (%1)"), path) << endmsg;
goto out;
} else {
isnew = true;
@@ -360,8 +355,6 @@ bool
FileSource::find_2X (Session& s, DataType type, const string& path, bool must_exist,
bool& isnew, uint16_t& chan, string& found_path)
{
- string search_path = s.source_search_path (type);
-
string pathstr = path;
string::size_type pos;
bool ret = false;
@@ -372,18 +365,17 @@ FileSource::find_2X (Session& s, DataType type, const string& path, bool must_ex
/* non-absolute pathname: find pathstr in search path */
- vector<string> dirs;
+ vector<string> dirs = s.source_search_path (type);
+
int cnt;
string fullpath;
string keeppath;
- if (search_path.length() == 0) {
+ if (dirs.size() == 0) {
error << _("FileSource: search path not set") << endmsg;
goto out;
}
- split (search_path, dirs, ':');
-
cnt = 0;
for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
@@ -440,16 +432,14 @@ FileSource::find_2X (Session& s, DataType type, const string& path, bool must_ex
if (cnt > 1) {
error << string_compose (
- _("FileSource: \"%1\" is ambigous when searching %2\n\t"),
- pathstr, search_path) << endmsg;
+ _("FileSource: \"%1\" is ambigous when searching\n\t"), pathstr) << endmsg;
goto out;
} else if (cnt == 0) {
if (must_exist) {
error << string_compose(
- _("Filesource: cannot find required file (%1): while searching %2"),
- pathstr, search_path) << endmsg;
+ _("Filesource: cannot find required file (%1)"), pathstr) << endmsg;
goto out;
} else {
isnew = true;
@@ -499,13 +489,14 @@ FileSource::find_2X (Session& s, DataType type, const string& path, bool must_ex
goto out;
}
+#ifndef PLATFORM_WINDOWS
if (errno != ENOENT) {
error << string_compose(
_("Filesource: cannot check for existing file (%1): %2"),
path, strerror (errno)) << endmsg;
goto out;
}
-
+#endif
/* a new file */
isnew = true;
ret = true;
diff --git a/libs/ardour/filesystem_paths.cc b/libs/ardour/filesystem_paths.cc
index 73bfaff137..1b4bd0476d 100644
--- a/libs/ardour/filesystem_paths.cc
+++ b/libs/ardour/filesystem_paths.cc
@@ -30,6 +30,11 @@
#include "i18n.h"
+#ifdef PLATFORM_WINDOWS
+#include "shlobj.h"
+#include "pbd/windows_special_dirs.h"
+#endif
+
using namespace PBD;
namespace ARDOUR {
@@ -54,8 +59,12 @@ user_config_directory ()
if ((c = getenv ("XDG_CONFIG_HOME")) != 0) {
p = c;
} else {
+#ifdef PLATFORM_WINDOWS
+ // Not technically the home dir (since it needs to be a writable folder)
+ const string home_dir = Glib::build_filename (Glib::get_user_config_dir(), user_config_dir_name);
+#else
const string home_dir = Glib::get_home_dir();
-
+#endif
if (home_dir.empty ()) {
error << "Unable to determine home directory" << endmsg;
exit (1);
@@ -66,7 +75,9 @@ user_config_directory ()
}
#endif
+#ifndef PLATFORM_WINDOWS
p = Glib::build_filename (p, user_config_dir_name);
+#endif
if (!Glib::file_test (p, Glib::FILE_TEST_EXISTS)) {
if (g_mkdir_with_parents (p.c_str(), 0755)) {
@@ -84,51 +95,122 @@ user_config_directory ()
}
std::string
+user_cache_directory ()
+{
+ static std::string p;
+
+ if (!p.empty()) return p;
+
+#ifdef __APPLE__
+ p = Glib::build_filename (Glib::get_home_dir(), "Library/Caches");
+#else
+ const char* c = 0;
+
+ /* adopt freedesktop standards, and put .ardour3 into $XDG_CACHE_HOME
+ * defaulting to or ~/.config
+ */
+ if ((c = getenv ("XDG_CACHE_HOME")) != 0) {
+ p = c;
+ } else {
+#ifdef PLATFORM_WINDOWS
+ // Not technically the home dir (since it needs to be a writable folder)
+ const string home_dir = Glib::build_filename (Glib::get_user_data_dir(), user_config_dir_name);
+#else
+ const string home_dir = Glib::get_home_dir();
+#endif
+ if (home_dir.empty ()) {
+ error << "Unable to determine home directory" << endmsg;
+ exit (1);
+ }
+
+ p = home_dir;
+ p = Glib::build_filename (p, ".cache");
+ }
+#endif
+
+#ifndef PLATFORM_WINDOWS
+ p = Glib::build_filename (p, user_config_dir_name);
+#endif
+
+ if (!Glib::file_test (p, Glib::FILE_TEST_EXISTS)) {
+ if (g_mkdir_with_parents (p.c_str(), 0755)) {
+ error << string_compose (_("Cannot create cache directory %1 - cannot run"),
+ p) << endmsg;
+ exit (1);
+ }
+ } else if (!Glib::file_test (p, Glib::FILE_TEST_IS_DIR)) {
+ error << string_compose (_("Cache directory %1 already exists and is not a directory/folder - cannot run"),
+ p) << endmsg;
+ exit (1);
+ }
+
+ return p;
+}
+
+std::string
ardour_dll_directory ()
{
+#ifdef PLATFORM_WINDOWS
+ std::string dll_dir_path(g_win32_get_package_installation_directory_of_module(NULL));
+ dll_dir_path = Glib::build_filename (dll_dir_path, "lib");
+ return Glib::build_filename (dll_dir_path, "ardour3");
+#else
std::string s = Glib::getenv("ARDOUR_DLL_PATH");
if (s.empty()) {
std::cerr << _("ARDOUR_DLL_PATH not set in environment - exiting\n");
::exit (1);
}
return s;
+#endif
}
-SearchPath
+#ifdef PLATFORM_WINDOWS
+Searchpath
+windows_search_path ()
+{
+ std::string dll_dir_path(g_win32_get_package_installation_directory_of_module(NULL));
+ dll_dir_path = Glib::build_filename (dll_dir_path, "share");
+ return Glib::build_filename (dll_dir_path, "ardour3");
+}
+#endif
+
+Searchpath
ardour_config_search_path ()
{
- static SearchPath search_path;
+ static Searchpath search_path;
if (search_path.empty()) {
search_path += user_config_directory();
-
+#ifdef PLATFORM_WINDOWS
+ search_path += windows_search_path ();
+#endif
std::string s = Glib::getenv("ARDOUR_CONFIG_PATH");
if (s.empty()) {
- std::cerr << _("ARDOUR_CONFIG_PATH not set in environment - exiting\n");
- ::exit (1);
+ std::cerr << _("ARDOUR_CONFIG_PATH not set in environment\n");
+ } else {
+ search_path += Searchpath (s);
}
-
- search_path += SearchPath (s);
}
return search_path;
}
-SearchPath
+Searchpath
ardour_data_search_path ()
{
- static SearchPath search_path;
+ static Searchpath search_path;
if (search_path.empty()) {
search_path += user_config_directory();
-
+#ifdef PLATFORM_WINDOWS
+ search_path += windows_search_path ();
+#endif
std::string s = Glib::getenv("ARDOUR_DATA_PATH");
if (s.empty()) {
- std::cerr << _("ARDOUR_DATA_PATH not set in environment - exiting\n");
- ::exit (1);
+ std::cerr << _("ARDOUR_DATA_PATH not set in environment\n");
+ } else {
+ search_path += Searchpath (s);
}
-
- search_path += SearchPath (s);
}
return search_path;
diff --git a/libs/ardour/find_session.cc b/libs/ardour/find_session.cc
index f0a034d8d4..501927c42c 100644
--- a/libs/ardour/find_session.cc
+++ b/libs/ardour/find_session.cc
@@ -27,10 +27,12 @@
#include <glibmm/miscutils.h>
#include "pbd/compose.h"
+#include "pbd/pathexpand.h"
#include "pbd/error.h"
#include "ardour/filename_extensions.h"
#include "ardour/utils.h"
+#include "ardour/session_utils.h"
#include "i18n.h"
@@ -43,16 +45,10 @@ int
find_session (string str, string& path, string& snapshot, bool& isnew)
{
struct stat statbuf;
- char buf[PATH_MAX+1];
isnew = false;
- if (!realpath (str.c_str(), buf) && (errno != ENOENT && errno != ENOTDIR)) {
- error << string_compose (_("Could not resolve path: %1 (%2)"), buf, strerror(errno)) << endmsg;
- return -1;
- }
-
- str = buf;
+ str = canonical_path (str);
/* check to see if it exists, and what it is */
diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc
index 9850d82d31..ed62420ff0 100644
--- a/libs/ardour/globals.cc
+++ b/libs/ardour/globals.cc
@@ -20,12 +20,18 @@
#include "libardour-config.h"
#endif
+#ifdef interface
+#undef interface
+#endif
+
#include <cstdio> // Needed so that libraptor (included in lrdf) won't complain
#include <cstdlib>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
+#ifndef PLATFORM_WINDOWS
#include <sys/resource.h>
+#endif
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
@@ -43,7 +49,7 @@
#include "ardour/audio_unit.h"
#endif
-#ifdef __SSE__
+#if defined(__SSE__) || defined(USE_XMMINTRIN)
#include <xmmintrin.h>
#endif
@@ -54,7 +60,9 @@
#include <glibmm/fileutils.h>
#include <glibmm/miscutils.h>
+#ifdef HAVE_LRDF
#include <lrdf.h>
+#endif
#include "pbd/cpus.h"
#include "pbd/error.h"
@@ -117,6 +125,8 @@ mix_buffers_with_gain_t ARDOUR::mix_buffers_with_gain = 0;
mix_buffers_no_gain_t ARDOUR::mix_buffers_no_gain = 0;
PBD::Signal1<void,std::string> ARDOUR::BootMessage;
+PBD::Signal3<void,std::string,std::string,bool> ARDOUR::PluginScanMessage;
+PBD::Signal1<void,int> ARDOUR::PluginScanTimeout;
PBD::Signal0<void> ARDOUR::GUIIdle;
namespace ARDOUR {
@@ -196,6 +206,7 @@ setup_hardware_optimization (bool try_optimization)
static void
lotsa_files_please ()
{
+#ifndef PLATFORM_WINDOWS
struct rlimit rl;
if (getrlimit (RLIMIT_NOFILE, &rl) == 0) {
@@ -216,6 +227,7 @@ lotsa_files_please ()
} else {
error << string_compose (_("Could not get system open files limit (%1)"), strerror (errno)) << endmsg;
}
+#endif
}
bool
@@ -229,6 +241,7 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir
#ifdef ENABLE_NLS
(void) bindtextdomain(PACKAGE, localedir);
+ (void) bind_textdomain_codeset (PACKAGE, "UTF-8");
#endif
SessionEvent::init_event_pool ();
@@ -262,7 +275,9 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir
// allow ardour the absolute maximum number of open files
lotsa_files_please ();
+#ifdef HAVE_LRDF
lrdf_init();
+#endif
Library = new AudioLibrary;
BootMessage (_("Loading configuration"));
@@ -351,7 +366,7 @@ ARDOUR::init_post_engine ()
/* find plugins */
- ARDOUR::PluginManager::instance().refresh ();
+ ARDOUR::PluginManager::instance().refresh (!Config->get_discover_vst_on_start());
}
void
@@ -364,7 +379,9 @@ ARDOUR::cleanup ()
ARDOUR::AudioEngine::destroy ();
delete Library;
+#ifdef HAVE_LRDF
lrdf_cleanup ();
+#endif
delete &ControlProtocolManager::instance();
#ifdef WINDOWS_VST_SUPPORT
fst_exit ();
@@ -373,6 +390,8 @@ ARDOUR::cleanup ()
#ifdef LXVST_SUPPORT
vstfx_exit();
#endif
+ delete &PluginManager::instance();
+ delete Config;
PBD::cleanup ();
return;
@@ -382,14 +401,12 @@ void
ARDOUR::find_bindings_files (map<string,string>& files)
{
vector<std::string> found;
- SearchPath spath = ardour_config_search_path();
+ Searchpath spath = ardour_config_search_path();
if (getenv ("ARDOUR_SAE")) {
- Glib::PatternSpec pattern("*SAE-*.bindings");
- find_matching_files_in_search_path (spath, pattern, found);
+ find_files_matching_pattern (found, spath, "*SAE-*.bindings");
} else {
- Glib::PatternSpec pattern("*.bindings");
- find_matching_files_in_search_path (spath, pattern, found);
+ find_files_matching_pattern (found, spath, "*.bindings");
}
if (found.empty()) {
@@ -525,8 +542,8 @@ ARDOUR::set_translations_enabled (bool yn)
c = '0';
}
- ::write (fd, &c, 1);
- ::close (fd);
+ (void) ::write (fd, &c, 1);
+ (void) ::close (fd);
return true;
}
@@ -581,10 +598,21 @@ clock_gettime (int /*clk_id*/, struct timespec *t)
microseconds_t
ARDOUR::get_microseconds ()
{
+#ifdef PLATFORM_WINDOWS
+ microseconds_t ret = 0;
+ LARGE_INTEGER freq, time;
+
+ if (QueryPerformanceFrequency(&freq))
+ if (QueryPerformanceCounter(&time))
+ ret = (microseconds_t)((time.QuadPart * 1000000) / freq.QuadPart);
+
+ return ret;
+#else
struct timespec ts;
if (clock_gettime (CLOCK_MONOTONIC, &ts) != 0) {
/* EEEK! */
return 0;
}
return (microseconds_t) ts.tv_sec * 1000000 + (ts.tv_nsec/1000);
+#endif
}
diff --git a/libs/ardour/graph.cc b/libs/ardour/graph.cc
index 71eeee41ea..3e87853319 100644
--- a/libs/ardour/graph.cc
+++ b/libs/ardour/graph.cc
@@ -22,6 +22,7 @@
#include "pbd/compose.h"
#include "pbd/debug_rt_alloc.h"
+#include "pbd/pthread_utils.h"
#include "ardour/debug.h"
#include "ardour/graph.h"
@@ -31,8 +32,6 @@
#include "ardour/process_thread.h"
#include "ardour/audioengine.h"
-#include <jack/thread.h>
-
#include "i18n.h"
using namespace ARDOUR;
@@ -223,7 +222,7 @@ Graph::trigger (GraphNode* n)
void
Graph::dec_ref()
{
- if (g_atomic_int_dec_and_test (&_finished_refcount)) {
+ if (g_atomic_int_dec_and_test (const_cast<gint*> (&_finished_refcount))) {
/* We have run all the nodes that are at the `output' end of
the graph, so there is nothing more to do this time around.
@@ -358,7 +357,7 @@ Graph::run_one()
/* update the number of threads that will still be sleeping */
_execution_tokens -= wakeup;
- DEBUG_TRACE(DEBUG::ProcessThreads, string_compose ("%1 signals %2\n", pthread_self(), wakeup));
+ DEBUG_TRACE(DEBUG::ProcessThreads, string_compose ("%1 signals %2\n", pthread_name(), wakeup));
for (int i = 0; i < wakeup; i++) {
_execution_sem.signal ();
@@ -367,12 +366,12 @@ Graph::run_one()
while (to_run == 0) {
_execution_tokens += 1;
pthread_mutex_unlock (&_trigger_mutex);
- DEBUG_TRACE (DEBUG::ProcessThreads, string_compose ("%1 goes to sleep\n", pthread_self()));
+ DEBUG_TRACE (DEBUG::ProcessThreads, string_compose ("%1 goes to sleep\n", pthread_name()));
_execution_sem.wait ();
if (_quit_threads) {
return true;
}
- DEBUG_TRACE (DEBUG::ProcessThreads, string_compose ("%1 is awake\n", pthread_self()));
+ DEBUG_TRACE (DEBUG::ProcessThreads, string_compose ("%1 is awake\n", pthread_name()));
pthread_mutex_lock (&_trigger_mutex);
if (_trigger_queue.size()) {
to_run = _trigger_queue.back();
@@ -384,7 +383,7 @@ Graph::run_one()
to_run->process();
to_run->finish (_current_chain);
- DEBUG_TRACE(DEBUG::ProcessThreads, string_compose ("%1 has finished run_one()\n", pthread_self()));
+ DEBUG_TRACE(DEBUG::ProcessThreads, string_compose ("%1 has finished run_one()\n", pthread_name()));
return false;
}
@@ -552,7 +551,7 @@ Graph::process_one_route (Route* route)
assert (route);
- DEBUG_TRACE (DEBUG::ProcessThreads, string_compose ("%1 runs route %2\n", pthread_self(), route->name()));
+ DEBUG_TRACE (DEBUG::ProcessThreads, string_compose ("%1 runs route %2\n", pthread_name(), route->name()));
if (_process_silent) {
retval = route->silent_roll (_process_nframes, _process_start_frame, _process_end_frame, need_butler);
diff --git a/libs/ardour/import.cc b/libs/ardour/import.cc
index 6f7b3d0616..e86e500ed9 100644
--- a/libs/ardour/import.cc
+++ b/libs/ardour/import.cc
@@ -34,6 +34,7 @@
#include <sndfile.h>
#include <samplerate.h>
+#include <glib/gstdio.h>
#include <glibmm.h>
#include <boost/scoped_array.hpp>
@@ -122,7 +123,7 @@ Session::get_paths_for_new_sources (bool /*allow_replacing*/, const string& impo
vector<string> new_paths;
const string basename = basename_nosuffix (import_file_path);
- for (uint n = 0; n < channels; ++n) {
+ for (uint32_t n = 0; n < channels; ++n) {
const DataType type = SMFSource::safe_midi_file_extension (import_file_path) ? DataType::MIDI : DataType::AUDIO;
string filepath;
@@ -149,7 +150,7 @@ Session::get_paths_for_new_sources (bool /*allow_replacing*/, const string& impo
static bool
map_existing_mono_sources (const vector<string>& new_paths, Session& /*sess*/,
- uint /*samplerate*/, vector<boost::shared_ptr<Source> >& newfiles, Session *session)
+ uint32_t /*samplerate*/, vector<boost::shared_ptr<Source> >& newfiles, Session *session)
{
for (vector<string>::const_iterator i = new_paths.begin();
i != new_paths.end(); ++i)
@@ -168,7 +169,7 @@ map_existing_mono_sources (const vector<string>& new_paths, Session& /*sess*/,
static bool
create_mono_sources_for_writing (const vector<string>& new_paths,
- Session& sess, uint samplerate,
+ Session& sess, uint32_t samplerate,
vector<boost::shared_ptr<Source> >& newfiles,
framepos_t timeline_position)
{
@@ -206,10 +207,10 @@ create_mono_sources_for_writing (const vector<string>& new_paths,
static string
compose_status_message (const string& path,
- uint file_samplerate,
- uint session_samplerate,
- uint /* current_file */,
- uint /* total_files */)
+ uint32_t file_samplerate,
+ uint32_t session_samplerate,
+ uint32_t /* current_file */,
+ uint32_t /* total_files */)
{
if (file_samplerate != session_samplerate) {
return string_compose (_("Resampling %1 from %2kHz to %3kHz"),
@@ -253,7 +254,7 @@ write_audio_data_to_new_files (ImportableSource* source, ImportStatus& status,
*/
float peak = 0;
- uint read_count = 0;
+ uint32_t read_count = 0;
while (!status.cancel) {
framecnt_t const nread = source->read (data.get(), nframes);
@@ -276,7 +277,7 @@ write_audio_data_to_new_files (ImportableSource* source, ImportStatus& status,
progress_multiplier = 0.5;
progress_base = 0.5;
}
-
+
framecnt_t read_count = 0;
while (!status.cancel) {
@@ -286,6 +287,14 @@ write_audio_data_to_new_files (ImportableSource* source, ImportStatus& status,
uint32_t chn;
if ((nread = source->read (data.get(), nframes)) == 0) {
+#ifdef PLATFORM_WINDOWS
+ /* Flush the data once we've finished importing the file. Windows can */
+ /* cache the data for very long periods of time (perhaps not writing */
+ /* it to disk until Ardour closes). So let's force it to flush now. */
+ for (chn = 0; chn < channels; ++chn)
+ if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(newfiles[chn])) != 0)
+ afs->flush ();
+#endif
break;
}
@@ -417,7 +426,7 @@ remove_file_source (boost::shared_ptr<Source> source)
boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
if (fs) {
- ::unlink (fs->path().c_str());
+ ::g_unlink (fs->path().c_str());
}
}
@@ -432,7 +441,7 @@ Session::import_files (ImportStatus& status)
Sources all_new_sources;
boost::shared_ptr<AudioFileSource> afs;
boost::shared_ptr<SMFSource> smfs;
- uint channels = 0;
+ uint32_t channels = 0;
status.sources.clear ();
@@ -465,6 +474,11 @@ Session::import_files (ImportStatus& status)
return;
}
}
+
+ if (channels == 0) {
+ error << _("Import: file contains no channels.") << endmsg;
+ continue;
+ }
vector<string> new_paths = get_paths_for_new_sources (status.replace_existing_source, *p, channels);
Sources newfiles;
diff --git a/libs/ardour/internal_return.cc b/libs/ardour/internal_return.cc
index fc5963603b..1eae5d3171 100644
--- a/libs/ardour/internal_return.cc
+++ b/libs/ardour/internal_return.cc
@@ -20,6 +20,7 @@
#include "ardour/internal_return.h"
#include "ardour/internal_send.h"
+#include "ardour/route.h"
using namespace std;
using namespace ARDOUR;
@@ -41,7 +42,7 @@ InternalReturn::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*e
if (lm.locked ()) {
for (list<InternalSend*>::iterator i = _sends.begin(); i != _sends.end(); ++i) {
- if ((*i)->active ()) {
+ if ((*i)->active () && (!(*i)->source_route() || (*i)->source_route()->active())) {
bufs.merge_from ((*i)->get_buffers(), nframes);
}
}
diff --git a/libs/ardour/internal_send.cc b/libs/ardour/internal_send.cc
index 17a3ca1f42..e5c7232f48 100644
--- a/libs/ardour/internal_send.cc
+++ b/libs/ardour/internal_send.cc
@@ -40,14 +40,21 @@ using namespace std;
PBD::Signal1<void, pframes_t> InternalSend::CycleStart;
-InternalSend::InternalSend (Session& s, boost::shared_ptr<Pannable> p, boost::shared_ptr<MuteMaster> mm, boost::shared_ptr<Route> sendto, Delivery::Role role, bool ignore_bitslot)
+InternalSend::InternalSend (Session& s,
+ boost::shared_ptr<Pannable> p,
+ boost::shared_ptr<MuteMaster> mm,
+ boost::shared_ptr<Route> sendfrom,
+ boost::shared_ptr<Route> sendto,
+ Delivery::Role role,
+ bool ignore_bitslot)
: Send (s, p, mm, role, ignore_bitslot)
+ , _send_from (sendfrom)
{
- if (sendto) {
- if (use_target (sendto)) {
- throw failed_constructor();
- }
- }
+ if (sendto) {
+ if (use_target (sendto)) {
+ throw failed_constructor();
+ }
+ }
init_gain ();
@@ -202,6 +209,8 @@ InternalSend::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame
_amp->setup_gain_automation (start_frame, end_frame, nframes);
_amp->run (mixbufs, start_frame, end_frame, nframes, true);
+ _delayline->run (mixbufs, start_frame, end_frame, nframes, true);
+
/* consider metering */
if (_metering) {
diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc
index 6f5b5a63da..2cc213f797 100644
--- a/libs/ardour/io.cc
+++ b/libs/ardour/io.cc
@@ -19,6 +19,7 @@
#include <fstream>
#include <algorithm>
#include <cmath>
+#include <vector>
#include <unistd.h>
#include <locale.h>
@@ -395,7 +396,9 @@ IO::disconnect (void* src)
int
IO::ensure_ports_locked (ChanCount count, bool clear, bool& changed)
{
+#ifndef PLATFORM_WINDOWS
assert (!AudioEngine::instance()->process_lock().trylock());
+#endif
boost::shared_ptr<Port> port;
@@ -466,7 +469,9 @@ IO::ensure_ports_locked (ChanCount count, bool clear, bool& changed)
int
IO::ensure_ports (ChanCount count, bool clear, void* src)
{
+#ifndef PLATFORM_WINDOWS
assert (!AudioEngine::instance()->process_lock().trylock());
+#endif
bool changed = false;
@@ -501,7 +506,9 @@ IO::ensure_ports (ChanCount count, bool clear, void* src)
int
IO::ensure_io (ChanCount count, bool clear, void* src)
{
+#ifndef PLATFORM_WINDOWS
assert (!AudioEngine::instance()->process_lock().trylock());
+#endif
return ensure_ports (count, clear, src);
}
@@ -1373,20 +1380,20 @@ IO::build_legal_port_name (DataType type)
limit = name_size - AudioEngine::instance()->my_name().length() - (suffix.length() + 5);
- char buf1[name_size+1];
- char buf2[name_size+1];
+ std::vector<char> buf1(name_size+1);
+ std::vector<char> buf2(name_size+1);
/* colons are illegal in port names, so fix that */
string nom = _name.val();
replace_all (nom, ":", ";");
- snprintf (buf1, name_size+1, ("%.*s/%s"), limit, nom.c_str(), suffix.c_str());
+ snprintf (&buf1[0], name_size+1, ("%.*s/%s"), limit, nom.c_str(), suffix.c_str());
- int port_number = find_port_hole (buf1);
- snprintf (buf2, name_size+1, "%s %d", buf1, port_number);
+ int port_number = find_port_hole (&buf1[0]);
+ snprintf (&buf2[0], name_size+1, "%s %d", &buf1[0], port_number);
- return string (buf2);
+ return string (&buf2[0]);
}
int32_t
@@ -1404,14 +1411,13 @@ IO::find_port_hole (const char* base)
*/
for (n = 1; n < 9999; ++n) {
- size_t size = AudioEngine::instance()->port_name_size() + 1;
- char buf[size];
+ std::vector<char> buf (AudioEngine::instance()->port_name_size());
PortSet::iterator i = _ports.begin();
- snprintf (buf, size, _("%s %u"), base, n);
+ snprintf (&buf[0], buf.size()+1, _("%s %u"), base, n);
for ( ; i != _ports.end(); ++i) {
- if (i->name() == buf) {
+ if (string(i->name()) == string(&buf[0])) {
break;
}
}
diff --git a/libs/ardour/ladspa_plugin.cc b/libs/ardour/ladspa_plugin.cc
index bc3a83799b..8b089929b5 100644
--- a/libs/ardour/ladspa_plugin.cc
+++ b/libs/ardour/ladspa_plugin.cc
@@ -17,6 +17,10 @@
*/
+#ifdef WAF_BUILD
+#include "libardour-config.h"
+#endif
+
#include <inttypes.h>
#include <vector>
@@ -25,11 +29,15 @@
#include <cstdlib>
#include <cstdio> // so libraptor doesn't complain
#include <cmath>
+#ifndef COMPILER_MSVC
#include <dirent.h>
+#endif
#include <sys/stat.h>
#include <cerrno>
+#ifdef HAVE_LRDF
#include <lrdf.h>
+#endif
#include "pbd/compose.h"
#include "pbd/error.h"
@@ -50,16 +58,16 @@ using namespace std;
using namespace ARDOUR;
using namespace PBD;
-LadspaPlugin::LadspaPlugin (void *mod, AudioEngine& e, Session& session, uint32_t index, framecnt_t rate)
+LadspaPlugin::LadspaPlugin (string module_path, AudioEngine& e, Session& session, uint32_t index, framecnt_t rate)
: Plugin (e, session)
{
- init (mod, index, rate);
+ init (module_path, index, rate);
}
LadspaPlugin::LadspaPlugin (const LadspaPlugin &other)
: Plugin (other)
{
- init (other._module, other._index, other._sample_rate);
+ init (other._module_path, other._index, other._sample_rate);
for (uint32_t i = 0; i < parameter_count(); ++i) {
_control_data[i] = other._shadow_data[i];
@@ -68,25 +76,32 @@ LadspaPlugin::LadspaPlugin (const LadspaPlugin &other)
}
void
-LadspaPlugin::init (void *mod, uint32_t index, framecnt_t rate)
+LadspaPlugin::init (string module_path, uint32_t index, framecnt_t rate)
{
+ void* func;
LADSPA_Descriptor_Function dfunc;
uint32_t i, port_cnt;
- const char *errstr;
- _module = mod;
+ _module_path = module_path;
+ _module = new Glib::Module(_module_path);
_control_data = 0;
_shadow_data = 0;
_latency_control_port = 0;
_was_activated = false;
- dfunc = (LADSPA_Descriptor_Function) dlsym (_module, "ladspa_descriptor");
+ if (!(*_module)) {
+ error << _("LADSPA: Unable to open module: ") << Glib::Module::get_last_error() << endmsg;
+ delete _module;
+ throw failed_constructor();
+ }
- if ((errstr = dlerror()) != NULL) {
+ if (!_module->get_symbol("ladspa_descriptor", func)) {
error << _("LADSPA: module has no descriptor function.") << endmsg;
throw failed_constructor();
}
+ dfunc = (LADSPA_Descriptor_Function)func;
+
if ((_descriptor = dfunc (index)) == 0) {
error << _("LADSPA: plugin has gone away since discovery!") << endmsg;
throw failed_constructor();
@@ -142,9 +157,8 @@ LadspaPlugin::~LadspaPlugin ()
deactivate ();
cleanup ();
- /* XXX who should close a plugin? */
-
- // dlclose (module);
+ // glib has internal reference counting on modules so this is ok
+ delete _module;
delete [] _control_data;
delete [] _shadow_data;
@@ -629,10 +643,11 @@ LadspaPlugin::print_parameter (uint32_t param, char *buf, uint32_t len) const
boost::shared_ptr<Plugin::ScalePoints>
LadspaPlugin::get_scale_points(uint32_t port_index) const
{
+ boost::shared_ptr<Plugin::ScalePoints> ret;
+#ifdef HAVE_LRDF
const uint32_t id = atol(unique_id().c_str());
lrdf_defaults* points = lrdf_get_scale_values(id, port_index);
- boost::shared_ptr<Plugin::ScalePoints> ret;
if (!points) {
return ret;
}
@@ -645,6 +660,7 @@ LadspaPlugin::get_scale_points(uint32_t port_index) const
}
lrdf_free_setting_values(points);
+#endif
return ret;
}
@@ -710,17 +726,7 @@ PluginPtr
LadspaPluginInfo::load (Session& session)
{
try {
- PluginPtr plugin;
- void *module;
-
- if ((module = dlopen (path.c_str(), RTLD_NOW)) == 0) {
- error << string_compose(_("LADSPA: cannot load module from \"%1\""), path) << endmsg;
- error << dlerror() << endmsg;
- return PluginPtr ((Plugin*) 0);
- } else {
- plugin.reset (new LadspaPlugin (module, session.engine(), session, index, session.frame_rate()));
- }
-
+ PluginPtr plugin (new LadspaPlugin (path, session.engine(), session, index, session.frame_rate()));
plugin->set_info(PluginInfoPtr(new LadspaPluginInfo(*this)));
return plugin;
}
@@ -739,6 +745,7 @@ LadspaPluginInfo::LadspaPluginInfo()
void
LadspaPlugin::find_presets ()
{
+#ifdef HAVE_LRDF
uint32_t id;
std::string unique (unique_id());
@@ -759,12 +766,14 @@ LadspaPlugin::find_presets ()
}
lrdf_free_uris(set_uris);
}
+#endif
}
bool
LadspaPlugin::load_preset (PresetRecord r)
{
+#ifdef HAVE_LRDF
lrdf_defaults* defs = lrdf_get_setting_values (r.uri.c_str());
if (defs) {
@@ -777,6 +786,7 @@ LadspaPlugin::load_preset (PresetRecord r)
}
Plugin::load_preset (r);
+#endif
return true;
}
@@ -784,6 +794,7 @@ LadspaPlugin::load_preset (PresetRecord r)
static void
lrdf_remove_preset (const char* /*source*/, const char *setting_uri)
{
+#ifdef HAVE_LRDF
lrdf_statement p;
lrdf_statement *q;
lrdf_statement *i;
@@ -817,11 +828,13 @@ lrdf_remove_preset (const char* /*source*/, const char *setting_uri)
p.predicate = NULL;
p.object = NULL;
lrdf_remove_matches (&p);
+#endif
}
void
LadspaPlugin::do_remove_preset (string name)
{
+#ifdef HAVE_LRDF
string const envvar = preset_envvar ();
if (envvar.empty()) {
warning << _("Could not locate HOME. Preset not removed.") << endmsg;
@@ -837,6 +850,7 @@ LadspaPlugin::do_remove_preset (string name)
lrdf_remove_preset (source.c_str(), p->uri.c_str ());
write_preset_file (envvar);
+#endif
}
string
@@ -859,6 +873,7 @@ LadspaPlugin::preset_source (string envvar) const
bool
LadspaPlugin::write_preset_file (string envvar)
{
+#ifdef HAVE_LRDF
string path = string_compose("%1/.ladspa", envvar);
if (g_mkdir_with_parents (path.c_str(), 0775)) {
warning << string_compose(_("Could not create %1. Preset not saved. (%2)"), path, strerror(errno)) << endmsg;
@@ -879,11 +894,15 @@ LadspaPlugin::write_preset_file (string envvar)
}
return true;
+#else
+ return false;
+#endif
}
string
LadspaPlugin::do_save_preset (string name)
{
+#ifdef HAVE_LRDF
/* make a vector of pids that are input parameters */
vector<int> input_parameter_pids;
for (uint32_t i = 0; i < parameter_count(); ++i) {
@@ -902,8 +921,8 @@ LadspaPlugin::do_save_preset (string name)
lrdf_defaults defaults;
defaults.count = input_parameter_pids.size ();
- lrdf_portvalue portvalues[input_parameter_pids.size()];
- defaults.items = portvalues;
+ std::vector<lrdf_portvalue> portvalues(input_parameter_pids.size());
+ defaults.items = &portvalues[0];
for (vector<int>::size_type i = 0; i < input_parameter_pids.size(); ++i) {
portvalues[i].pid = input_parameter_pids[i];
@@ -927,6 +946,9 @@ LadspaPlugin::do_save_preset (string name)
}
return uri;
+#else
+ return string();
+#endif
}
LADSPA_PortDescriptor
diff --git a/libs/ardour/linux_vst_info_file.cc b/libs/ardour/linux_vst_info_file.cc
deleted file mode 100644
index 581bcca87f..0000000000
--- a/libs/ardour/linux_vst_info_file.cc
+++ /dev/null
@@ -1,427 +0,0 @@
-/*
- Copyright (C) 2012 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.
-
-*/
-
-/** @file libs/ardour/vst_info_file.cc
- * @brief Code to manage info files containing cached information about a plugin.
- * e.g. its name, creator etc.
- */
-
-#include <iostream>
-#include <cassert>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <errno.h>
-
-#include <stdlib.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <libgen.h>
-
-#include <glib.h>
-#include <glib/gstdio.h>
-#include <glibmm.h>
-
-#include "pbd/error.h"
-
-#include "ardour/linux_vst_support.h"
-
-#define MAX_STRING_LEN 256
-
-using namespace std;
-
-static char *
-read_string (FILE *fp)
-{
- char buf[MAX_STRING_LEN];
-
- if (!fgets (buf, MAX_STRING_LEN, fp)) {
- return 0;
- }
-
- if (strlen(buf) < MAX_STRING_LEN) {
- if (strlen (buf)) {
- buf[strlen(buf)-1] = 0;
- }
- return strdup (buf);
- } else {
- return 0;
- }
-}
-
-/** Read an integer value from a line in fp into n,
- * @return true on failure, false on success.
- */
-static bool
-read_int (FILE* fp, int* n)
-{
- char buf[MAX_STRING_LEN];
-
- char* p = fgets (buf, MAX_STRING_LEN, fp);
- if (p == 0) {
- return true;
- }
-
- return (sscanf (p, "%d", n) != 1);
-}
-
-static VSTInfo *
-load_vstfx_info_file (FILE* fp)
-{
- VSTInfo *info;
-
- if ((info = (VSTInfo*) malloc (sizeof (VSTInfo))) == 0) {
- return 0;
- }
-
- if ((info->name = read_string(fp)) == 0) goto error;
- if ((info->creator = read_string(fp)) == 0) goto error;
- if (read_int (fp, &info->UniqueID)) goto error;
- if ((info->Category = read_string(fp)) == 0) goto error;
- if (read_int (fp, &info->numInputs)) goto error;
- if (read_int (fp, &info->numOutputs)) goto error;
- if (read_int (fp, &info->numParams)) goto error;
- if (read_int (fp, &info->wantMidi)) goto error;
- if (read_int (fp, &info->hasEditor)) goto error;
- if (read_int (fp, &info->canProcessReplacing)) goto error;
-
- if ((info->ParamNames = (char **) malloc(sizeof(char*)*info->numParams)) == 0) {
- goto error;
- }
-
- for (int i = 0; i < info->numParams; ++i) {
- if ((info->ParamNames[i] = read_string(fp)) == 0) goto error;
- }
-
- if ((info->ParamLabels = (char **) malloc(sizeof(char*)*info->numParams)) == 0) {
- goto error;
- }
-
- for (int i = 0; i < info->numParams; ++i) {
- if ((info->ParamLabels[i] = read_string(fp)) == 0) goto error;
- }
-
- return info;
-
- error:
- free (info);
- return 0;
-}
-
-static int
-save_vstfx_info_file (VSTInfo *info, FILE* fp)
-{
- assert (info);
- assert (fp);
-
- fprintf (fp, "%s\n", info->name);
- fprintf (fp, "%s\n", info->creator);
- fprintf (fp, "%d\n", info->UniqueID);
- fprintf (fp, "%s\n", info->Category);
- fprintf (fp, "%d\n", info->numInputs);
- fprintf (fp, "%d\n", info->numOutputs);
- fprintf (fp, "%d\n", info->numParams);
- fprintf (fp, "%d\n", info->wantMidi);
- fprintf (fp, "%d\n", info->hasEditor);
- fprintf (fp, "%d\n", info->canProcessReplacing);
-
- for (int i = 0; i < info->numParams; i++) {
- fprintf (fp, "%s\n", info->ParamNames[i]);
- }
-
- for (int i = 0; i < info->numParams; i++) {
- fprintf (fp, "%s\n", info->ParamLabels[i]);
- }
-
- return 0;
-}
-
-static string
-vstfx_infofile_path (char* dllpath, int personal)
-{
- string dir;
- if (personal) {
- dir = Glib::build_filename (Glib::get_home_dir (), ".fst");
-
- /* If the directory doesn't exist, try to create it */
- if (!Glib::file_test (dir, Glib::FILE_TEST_IS_DIR)) {
- if (g_mkdir (dir.c_str (), 0700)) {
- return 0;
- }
- }
-
- } else {
- dir = Glib::path_get_dirname (std::string(dllpath));
- }
-
- stringstream s;
- s << "." << Glib::path_get_basename (dllpath) << ".fsi";
- return Glib::build_filename (dir, s.str ());
-}
-
-static char *
-vstfx_infofile_stat (char *dllpath, struct stat* statbuf, int personal)
-{
- if (strstr (dllpath, ".so" ) == 0) {
- return 0;
- }
-
- string const path = vstfx_infofile_path (dllpath, personal);
-
- if (Glib::file_test (path, Glib::FileTest (Glib::FILE_TEST_EXISTS | Glib::FILE_TEST_IS_REGULAR))) {
-
- /* info file exists in same location as the shared object, so
- check if its current and up to date
- */
-
-
- struct stat dllstat;
-
- if (stat (dllpath, &dllstat) == 0) {
- if (stat (path.c_str(), statbuf) == 0) {
- if (dllstat.st_mtime <= statbuf->st_mtime) {
- /* plugin is older than info file */
- return strdup (path.c_str ());
- }
- }
- }
- }
-
- return 0;
-}
-
-
-static FILE *
-vstfx_infofile_for_read (char* dllpath)
-{
- struct stat own_statbuf;
- struct stat sys_statbuf;
- FILE *rv = NULL;
-
- char* own_info = vstfx_infofile_stat (dllpath, &own_statbuf, 1);
- char* sys_info = vstfx_infofile_stat (dllpath, &sys_statbuf, 0);
-
- if (own_info) {
- if (sys_info) {
- if (own_statbuf.st_mtime <= sys_statbuf.st_mtime) {
- /* system info file is newer, use it */
- rv = g_fopen (sys_info, "rb");
- }
- } else {
- rv = g_fopen (own_info, "rb");
- }
- }
- free(own_info);
- free(sys_info);
-
- return rv;
-}
-
-static FILE *
-vstfx_infofile_create (char* dllpath, int personal)
-{
- if (strstr (dllpath, ".so" ) == 0) {
- return 0;
- }
-
- string const path = vstfx_infofile_path (dllpath, personal);
- return fopen (path.c_str(), "w");
-}
-
-static FILE *
-vstfx_infofile_for_write (char* dllpath)
-{
- FILE* f;
-
- if ((f = vstfx_infofile_create (dllpath, 0)) == 0) {
- f = vstfx_infofile_create (dllpath, 1);
- }
-
- return f;
-}
-
-static
-int vstfx_can_midi (VSTState* vstfx)
-{
- AEffect* plugin = vstfx->plugin;
-
- int const vst_version = plugin->dispatcher (plugin, effGetVstVersion, 0, 0, 0, 0.0f);
-
- if (vst_version >= 2) {
- /* should we send it VST events (i.e. MIDI) */
-
- if ((plugin->flags & effFlagsIsSynth) || (plugin->dispatcher (plugin, effCanDo, 0, 0,(void*) "receiveVstEvents", 0.0f) > 0)) {
- return -1;
- }
- }
-
- return false;
-}
-
-static VSTInfo *
-vstfx_info_from_plugin (VSTState* vstfx)
-{
- assert (vstfx);
-
- VSTInfo* info = (VSTInfo*) malloc (sizeof (VSTInfo));
- if (!info) {
- return 0;
- }
-
- /*We need to init the creator because some plugins
- fail to implement getVendorString, and so won't stuff the
- string with any name*/
-
- char creator[65] = "Unknown\0";
-
- AEffect* plugin = vstfx->plugin;
-
- info->name = strdup (vstfx->handle->name);
-
- /*If the plugin doesn't bother to implement GetVendorString we will
- have pre-stuffed the string with 'Unkown' */
-
- plugin->dispatcher (plugin, effGetVendorString, 0, 0, creator, 0);
-
- /*Some plugins DO implement GetVendorString, but DON'T put a name in it
- so if its just a zero length string we replace it with 'Unknown' */
-
- if (strlen(creator) == 0) {
- info->creator = strdup ("Unknown");
- } else {
- info->creator = strdup (creator);
- }
-
- info->UniqueID = plugin->uniqueID;
-
- info->Category = strdup("None"); /* XXX */
- info->numInputs = plugin->numInputs;
- info->numOutputs = plugin->numOutputs;
- info->numParams = plugin->numParams;
- info->wantMidi = vstfx_can_midi(vstfx);
- info->hasEditor = plugin->flags & effFlagsHasEditor ? true : false;
- info->canProcessReplacing = plugin->flags & effFlagsCanReplacing ? true : false;
- info->ParamNames = (char **) malloc(sizeof(char*)*info->numParams);
- info->ParamLabels = (char **) malloc(sizeof(char*)*info->numParams);
-
- for (int i = 0; i < info->numParams; ++i) {
- char name[64];
- char label[64];
-
- /* Not all plugins give parameters labels as well as names */
-
- strcpy (name, "No Name");
- strcpy (label, "No Label");
-
- plugin->dispatcher (plugin, effGetParamName, i, 0, name, 0);
- info->ParamNames[i] = strdup(name);
-
- //NOTE: 'effGetParamLabel' is no longer defined in vestige headers
- //plugin->dispatcher (plugin, effGetParamLabel, i, 0, label, 0);
- info->ParamLabels[i] = strdup(label);
- }
- return info;
-}
-
-/* A simple 'dummy' audiomaster callback which should be ok,
- we will only be instantiating the plugin in order to get its info
-*/
-
-static intptr_t
-simple_master_callback (AEffect *, int32_t opcode, int32_t, intptr_t, void *, float)
-{
- if (opcode == audioMasterVersion) {
- return 2;
- } else {
- return 0;
- }
-}
-
-/** Try to get plugin info - first by looking for a .fsi cache of the
- data, and if that doesn't exist, load the plugin, get its data and
- then cache it for future ref
-*/
-
-VSTInfo *
-vstfx_get_info (char* dllpath)
-{
- FILE* infofile;
- VSTHandle* h;
- VSTState* vstfx;
-
- if ((infofile = vstfx_infofile_for_read (dllpath)) != 0) {
- VSTInfo *info;
- info = load_vstfx_info_file (infofile);
- fclose (infofile);
- if (info == 0) {
- PBD::warning << "Cannot get LinuxVST information form " << dllpath << ": info file load failed." << endmsg;
- }
- return info;
- }
-
- if (!(h = vstfx_load(dllpath))) {
- PBD::warning << "Cannot get LinuxVST information from " << dllpath << ": load failed." << endmsg;
- return 0;
- }
-
- if (!(vstfx = vstfx_instantiate(h, simple_master_callback, 0))) {
- vstfx_unload(h);
- PBD::warning << "Cannot get LinuxVST information from " << dllpath << ": instantiation failed." << endmsg;
- return 0;
- }
-
- infofile = vstfx_infofile_for_write (dllpath);
-
- if (!infofile) {
- vstfx_close(vstfx);
- vstfx_unload(h);
- PBD::warning << "Cannot get LinuxVST information from " << dllpath << ": cannot create new FST info file." << endmsg;
- return 0;
- }
-
- VSTInfo* info = vstfx_info_from_plugin (vstfx);
-
- save_vstfx_info_file (info, infofile);
- fclose (infofile);
-
- vstfx_close (vstfx);
- vstfx_unload (h);
-
- return info;
-}
-
-void
-vstfx_free_info (VSTInfo *info)
-{
- for (int i = 0; i < info->numParams; i++) {
- free (info->ParamNames[i]);
- free (info->ParamLabels[i]);
- }
-
- free (info->name);
- free (info->creator);
- free (info->Category);
- free (info->ParamNames);
- free (info->ParamLabels);
- free (info);
-}
-
-
diff --git a/libs/ardour/linux_vst_support.cc b/libs/ardour/linux_vst_support.cc
index 9d36905f48..bd1ed0d27e 100644
--- a/libs/ardour/linux_vst_support.cc
+++ b/libs/ardour/linux_vst_support.cc
@@ -112,7 +112,7 @@ vstfx_new ()
void* vstfx_load_vst_library(const char* path)
{
void* dll;
- char* full_path;
+ char* full_path = NULL;
char* envdup;
char* lxvst_path;
size_t len1;
@@ -152,14 +152,15 @@ void* vstfx_load_vst_library(const char* path)
len2 = strlen(path);
/*Try all the possibilities in the path - deliminated by : */
-
- lxvst_path = strtok (envdup, ":");
+ char *saveptr;
+ lxvst_path = strtok_r (envdup, ":", &saveptr);
while (lxvst_path != 0)
{
vstfx_error ("\"%s\"", lxvst_path);
len1 = strlen(lxvst_path);
+ if (full_path) free(full_path);
full_path = (char*)malloc(len1 + 1 + len2 + 1);
memcpy(full_path, lxvst_path, len1);
full_path[len1] = '/';
@@ -176,11 +177,11 @@ void* vstfx_load_vst_library(const char* path)
/*Try again*/
- lxvst_path = strtok (0, ":");
+ lxvst_path = strtok_r (0, ":", &saveptr);
}
/*Free the path*/
-
+ if (full_path) free(full_path);
free(envdup);
return dll;
@@ -209,8 +210,6 @@ vstfx_load (const char *path)
buf = (char *)malloc(strlen(path) + 4); //The .so and a terminating zero
sprintf (buf, "%s.so", path);
-
- fhandle->nameptr = strdup (path);
}
else
@@ -218,8 +217,6 @@ vstfx_load (const char *path)
/*We already have .so appened to the filename*/
buf = strdup(path);
-
- fhandle->nameptr = strdup (path);
}
/* get a name for the plugin based on the path: ye old VST problem where
@@ -227,7 +224,7 @@ vstfx_load (const char *path)
which we don't want to do at this point
*/
- fhandle->name = strdup (PBD::basename_nosuffix (fhandle->nameptr).c_str());
+ fhandle->name = strdup (PBD::basename_nosuffix (path).c_str());
/*call load_vstfx_library to actually load the .so into memory*/
@@ -289,9 +286,8 @@ vstfx_unload (VSTHandle* fhandle)
fhandle->dll = 0;
}
- if (fhandle->nameptr)
+ if (fhandle->name)
{
- free (fhandle->nameptr);
free (fhandle->name);
}
@@ -310,8 +306,9 @@ vstfx_instantiate (VSTHandle* fhandle, audioMasterCallback amc, void* userptr)
if(fhandle == 0)
{
- vstfx_error( "** ERROR ** VSTFX : The handle was 0\n" );
- return 0;
+ vstfx_error( "** ERROR ** VSTFX : The handle was 0\n" );
+ free (vstfx);
+ return 0;
}
if ((vstfx->plugin = fhandle->main_entry (amc)) == 0)
diff --git a/libs/ardour/location.cc b/libs/ardour/location.cc
index 2a27fc318a..eef94797e9 100644
--- a/libs/ardour/location.cc
+++ b/libs/ardour/location.cc
@@ -30,6 +30,7 @@
#include "pbd/enumwriter.h"
#include "ardour/location.h"
+#include "ardour/midi_scene_change.h"
#include "ardour/session.h"
#include "ardour/audiofilesource.h"
#include "ardour/tempo.h"
@@ -42,6 +43,8 @@ using namespace std;
using namespace ARDOUR;
using namespace PBD;
+PBD::Signal0<void> Location::scene_changed;
+
Location::Location (Session& s)
: SessionHandleRef (s)
, _start (0)
@@ -87,6 +90,8 @@ Location::Location (const Location& other)
assert (_start >= 0);
assert (_end >= 0);
+
+ /* scene change is NOT COPIED */
}
Location::Location (Session& s, const XMLNode& node)
@@ -134,6 +139,8 @@ Location::operator= (const Location& other)
_bbt_end = other._bbt_end;
_flags = other._flags;
_position_lock_style = other._position_lock_style;
+
+ /* XXX need to copy scene change */
/* copy is not locked even if original was */
@@ -181,6 +188,14 @@ Location::set_start (framepos_t s, bool force, bool allow_bbt_recompute)
end_changed (this); /* EMIT SIGNAL */
}
+ /* moving the start (position) of a marker with a scene change
+ requires an update in the Scene Changer.
+ */
+
+ if (_scene_change) {
+ scene_changed (); /* EMIT SIGNAL */
+ }
+
assert (_start >= 0);
assert (_end >= 0);
@@ -196,6 +211,7 @@ Location::set_start (framepos_t s, bool force, bool allow_bbt_recompute)
recompute_bbt_from_frames ();
}
start_changed (this); /* EMIT SIGNAL */
+
if (is_session_range ()) {
Session::StartTimeChanged (old); /* EMIT SIGNAL */
AudioFileSource::set_header_position_offset (s);
@@ -431,11 +447,15 @@ Location::get_state ()
node->add_property ("locked", (_locked ? "yes" : "no"));
node->add_property ("position-lock-style", enum_2_string (_position_lock_style));
+ if (_scene_change) {
+ node->add_child_nocopy (_scene_change->get_state());
+ }
+
return *node;
}
int
-Location::set_state (const XMLNode& node, int /*version*/)
+Location::set_state (const XMLNode& node, int version)
{
const XMLProperty *prop;
@@ -521,6 +541,12 @@ Location::set_state (const XMLNode& node, int /*version*/)
_position_lock_style = PositionLockStyle (string_2_enum (prop->value(), _position_lock_style));
}
+ XMLNode* scene_child = find_named_node (node, SceneChange::xml_node_name);
+
+ if (scene_child) {
+ _scene_change = SceneChange::factory (*scene_child, version);
+ }
+
recompute_bbt_from_frames ();
changed (this); /* EMIT SIGNAL */
@@ -581,6 +607,14 @@ Location::unlock ()
LockChanged (this);
}
+void
+Location::set_scene_change (boost::shared_ptr<SceneChange> sc)
+{
+ _scene_change = sc;
+
+ scene_changed (); /* EMIT SIGNAL */
+}
+
/*---------------------------------------------------------------------- */
Locations::Locations (Session& s)
@@ -675,6 +709,7 @@ Locations::clear ()
++tmp;
if (!(*i)->is_session_range()) {
+ delete *i;
locations.erase (i);
}
@@ -700,6 +735,7 @@ Locations::clear_markers ()
++tmp;
if ((*i)->is_mark() && !(*i)->is_session_range()) {
+ delete *i;
locations.erase (i);
}
@@ -723,6 +759,7 @@ Locations::clear_ranges ()
++tmp;
if (!(*i)->is_mark()) {
+ delete *i;
locations.erase (i);
}
@@ -779,6 +816,7 @@ Locations::remove (Location *loc)
for (i = locations.begin(); i != locations.end(); ++i) {
if ((*i) == loc) {
+ delete *i;
locations.erase (i);
was_removed = true;
if (current_location == loc) {
@@ -972,6 +1010,44 @@ Locations::first_mark_before (framepos_t frame, bool include_special_ranges)
return -1;
}
+Location*
+Locations::mark_at (framepos_t pos, framecnt_t slop) const
+{
+ Glib::Threads::Mutex::Lock lm (lock);
+ Location* closest = 0;
+ frameoffset_t mindelta = max_framepos;
+ frameoffset_t delta;
+
+ /* locations are not necessarily stored in linear time order so we have
+ * to iterate across all of them to find the one closest to a give point.
+ */
+
+ for (LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
+
+ if ((*i)->is_mark()) {
+ if (pos > (*i)->start()) {
+ delta = pos - (*i)->start();
+ } else {
+ delta = (*i)->start() - pos;
+ }
+
+ if (slop == 0 && delta == 0) {
+ /* special case: no slop, and direct hit for position */
+ return *i;
+ }
+
+ if (delta <= slop) {
+ if (delta < mindelta) {
+ closest = *i;
+ mindelta = delta;
+ }
+ }
+ }
+ }
+
+ return closest;
+}
+
framepos_t
Locations::first_mark_after (framepos_t frame, bool include_special_ranges)
{
@@ -1146,3 +1222,4 @@ Locations::find_all_between (framepos_t start, framepos_t end, LocationList& ll,
}
}
}
+
diff --git a/libs/ardour/ltc_slave.cc b/libs/ardour/ltc_slave.cc
index bdb4fbead9..8d570aeeb8 100644
--- a/libs/ardour/ltc_slave.cc
+++ b/libs/ardour/ltc_slave.cc
@@ -19,11 +19,11 @@
*/
#include <iostream>
#include <errno.h>
-#include <poll.h>
#include <sys/types.h>
#include <unistd.h>
#include "pbd/error.h"
+#include "pbd/pthread_utils.h"
#include "ardour/debug.h"
#include "ardour/slave.h"
@@ -150,7 +150,7 @@ LTC_Slave::reset()
}
void
-LTC_Slave::parse_ltc(const pframes_t nframes, const Sample* const in, const framecnt_t posinfo)
+LTC_Slave::parse_ltc(const ARDOUR::pframes_t nframes, const Sample* const in, const ARDOUR::framecnt_t posinfo)
{
pframes_t i;
unsigned char sound[8192];
@@ -432,7 +432,7 @@ LTC_Slave::speed_and_position (double& speed, framepos_t& pos)
frameoffset_t skip = now - (monotonic_cnt + nframes);
monotonic_cnt = now;
- DEBUG_TRACE (DEBUG::LTC, string_compose ("speed_and_position - TID:%1 | latency: %2 | skip %3\n", ::pthread_self(), ltc_slave_latency.max, skip));
+ DEBUG_TRACE (DEBUG::LTC, string_compose ("speed_and_position - TID:%1 | latency: %2 | skip %3\n", pthread_name(), ltc_slave_latency.max, skip));
if (last_timestamp == 0) {
engine_dll_initstate = 0;
@@ -588,10 +588,10 @@ LTC_Slave::approximate_current_delta() const
if (last_timestamp == 0 || engine_dll_initstate == 0) {
snprintf(delta, sizeof(delta), "\u2012\u2012\u2012\u2012");
} else if ((monotonic_cnt - last_timestamp) > 2 * frames_per_ltc_frame) {
- snprintf(delta, sizeof(delta), _("flywheel"));
+ snprintf(delta, sizeof(delta), "%s", _("flywheel"));
} else {
- snprintf(delta, sizeof(delta), "\u0394<span foreground=\"green\" face=\"monospace\" >%s%s%" PRIi64 "</span>sm",
- LEADINGZERO(abs(current_delta)), PLUSMINUS(-current_delta), abs(current_delta));
+ snprintf(delta, sizeof(delta), "\u0394<span foreground=\"green\" face=\"monospace\" >%s%s%lld</span>sm",
+ LEADINGZERO(llabs(current_delta)), PLUSMINUS(-current_delta), llabs(current_delta));
}
return std::string(delta);
}
diff --git a/libs/ardour/lv2_evbuf.c b/libs/ardour/lv2_evbuf.c
index f0e62d9b65..2802ab8c81 100644
--- a/libs/ardour/lv2_evbuf.c
+++ b/libs/ardour/lv2_evbuf.c
@@ -219,7 +219,7 @@ lv2_evbuf_get(LV2_Evbuf_Iterator iter,
*subframes = 0;
*type = aev->body.type;
*size = aev->body.size;
- *data = LV2_ATOM_BODY(&aev->body);
+ *data = (uint8_t*)LV2_ATOM_BODY(&aev->body);
break;
}
diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc
index 204ae2c694..1bdb2f20d6 100644
--- a/libs/ardour/lv2_plugin.cc
+++ b/libs/ardour/lv2_plugin.cc
@@ -25,14 +25,14 @@
#include <cstdlib>
#include <cstring>
-#include <giomm/file.h>
+#include <glib/gstdio.h>
#include <glib/gprintf.h>
#include <glibmm.h>
#include <boost/utility.hpp>
-#include "pbd/clear_dir.h"
-#include "pbd/pathscanner.h"
+#include "pbd/file_utils.h"
+#include "pbd/stl_delete.h"
#include "pbd/compose.h"
#include "pbd/error.h"
#include "pbd/xml++.h"
@@ -48,7 +48,7 @@
#include "ardour/types.h"
#include "ardour/utils.h"
#include "ardour/worker.h"
-#include "ardour/lv2_bundled_search_path.h"
+#include "ardour/search_paths.h"
#include "i18n.h"
#include <locale.h>
@@ -1094,7 +1094,7 @@ LV2Plugin::do_remove_preset(string name)
name + ".ttl"
)
);
- unlink(preset_file.c_str());
+ ::g_unlink(preset_file.c_str());
}
bool
@@ -1122,16 +1122,16 @@ LV2Plugin::write_to(RingBuffer<uint8_t>* dest,
uint32_t size,
const uint8_t* body)
{
- const uint32_t buf_size = sizeof(UIMessage) + size;
- uint8_t buf[buf_size];
+ const uint32_t buf_size = sizeof(UIMessage) + size;
+ vector<uint8_t> buf(buf_size);
- UIMessage* msg = (UIMessage*)buf;
+ UIMessage* msg = (UIMessage*)&buf[0];
msg->index = index;
msg->protocol = protocol;
msg->size = size;
memcpy(msg + 1, body, size);
- return (dest->write(buf, buf_size) == buf_size);
+ return (dest->write(&buf[0], buf_size) == buf_size);
}
bool
@@ -1210,13 +1210,13 @@ LV2Plugin::emit_to_ui(void* controller, UIMessageSink sink)
error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
break;
}
- uint8_t body[msg.size];
- if (_to_ui->read(body, msg.size) != msg.size) {
+ vector<uint8_t> body(msg.size);
+ if (_to_ui->read(&body[0], msg.size) != msg.size) {
error << "Error reading from Plugin=>UI RingBuffer" << endmsg;
break;
}
- sink(controller, msg.index, msg.size, msg.protocol, body);
+ sink(controller, msg.index, msg.size, msg.protocol, &body[0]);
read_space -= sizeof(msg) + msg.size;
}
@@ -1699,15 +1699,15 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
break;
}
- uint8_t body[msg.size];
- if (_from_ui->read(body, msg.size) != msg.size) {
+ vector<uint8_t> body(msg.size);
+ if (_from_ui->read(&body[0], msg.size) != msg.size) {
error << "Error reading from UI=>Plugin RingBuffer" << endmsg;
break;
}
if (msg.protocol == urids.atom_eventTransfer) {
LV2_Evbuf* buf = _ev_buffers[msg.index];
LV2_Evbuf_Iterator i = lv2_evbuf_end(buf);
- const LV2_Atom* const atom = (const LV2_Atom*)body;
+ const LV2_Atom* const atom = (const LV2_Atom*)&body[0];
if (!lv2_evbuf_write(&i, nframes, 0, atom->type, atom->size,
(const uint8_t*)(atom + 1))) {
error << "Failed to write data to LV2 event buffer\n";
@@ -2013,21 +2013,19 @@ LV2World::load_bundled_plugins()
{
if (!_bundle_checked) {
cout << "Scanning folders for bundled LV2s: " << ARDOUR::lv2_bundled_search_path().to_string() << endl;
- PathScanner scanner;
- vector<string *> *plugin_objects = scanner (ARDOUR::lv2_bundled_search_path().to_string(), lv2_filter, 0, true, true);
- if (plugin_objects) {
- for ( vector<string *>::iterator x = plugin_objects->begin(); x != plugin_objects->end (); ++x) {
-#ifdef WINDOWS
- string uri = "file:///" + **x + "/";
+
+ vector<string> plugin_objects;
+ find_paths_matching_filter (plugin_objects, ARDOUR::lv2_bundled_search_path(), lv2_filter, 0, true, true, true);
+ for ( vector<string>::iterator x = plugin_objects.begin(); x != plugin_objects.end (); ++x) {
+#ifdef PLATFORM_WINDOWS
+ string uri = "file:///" + *x + "/";
#else
- string uri = "file://" + **x + "/";
+ string uri = "file://" + *x + "/";
#endif
- LilvNode *node = lilv_new_uri(world, uri.c_str());
- lilv_world_load_bundle(world, node);
- lilv_node_free(node);
- }
+ LilvNode *node = lilv_new_uri(world, uri.c_str());
+ lilv_world_load_bundle(world, node);
+ lilv_node_free(node);
}
- delete (plugin_objects);
_bundle_checked = true;
}
@@ -2069,7 +2067,9 @@ LV2PluginInfo::discover()
PluginInfoList* plugs = new PluginInfoList;
const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
- info << "LV2: Discovering " << lilv_plugins_size(plugins) << " plugins" << endmsg;
+ if (!Config->get_show_plugin_scan_window()) {
+ info << "LV2: Discovering " << lilv_plugins_size(plugins) << " plugins" << endmsg;
+ }
LILV_FOREACH(plugins, i, plugins) {
const LilvPlugin* p = lilv_plugins_get(plugins, i);
@@ -2087,6 +2087,7 @@ LV2PluginInfo::discover()
info->name = string(lilv_node_as_string(name));
lilv_node_free(name);
+ ARDOUR::PluginScanMessage(_("LV2"), info->name, false);
const LilvPluginClass* pclass = lilv_plugin_get_class(p);
const LilvNode* label = lilv_plugin_class_get_label(pclass);
diff --git a/libs/ardour/lxvst_plugin.cc b/libs/ardour/lxvst_plugin.cc
index 6e30e0c443..c3074d65ad 100644
--- a/libs/ardour/lxvst_plugin.cc
+++ b/libs/ardour/lxvst_plugin.cc
@@ -27,14 +27,16 @@ using namespace std;
using namespace ARDOUR;
using namespace PBD;
-LXVSTPlugin::LXVSTPlugin (AudioEngine& e, Session& session, VSTHandle* h)
+LXVSTPlugin::LXVSTPlugin (AudioEngine& e, Session& session, VSTHandle* h, int unique_id)
: VSTPlugin (e, session, h)
{
/* Instantiate the plugin and return a VSTState* */
+ Session::vst_current_loading_id = unique_id;
if ((_state = vstfx_instantiate (_handle, Session::vst_callback, this)) == 0) {
throw failed_constructor();
}
+ Session::vst_current_loading_id = 0;
set_plugin (_state->plugin);
}
@@ -44,9 +46,12 @@ LXVSTPlugin::LXVSTPlugin (const LXVSTPlugin &other)
{
_handle = other._handle;
+ Session::vst_current_loading_id = PBD::atoi(other.unique_id());
if ((_state = vstfx_instantiate (_handle, Session::vst_callback, this)) == 0) {
throw failed_constructor();
}
+ Session::vst_current_loading_id = 0;
+
_plugin = _state->plugin;
// Plugin::setup_controls ();
@@ -72,7 +77,7 @@ LXVSTPluginInfo::load (Session& session)
error << string_compose(_("LXVST: cannot load module from \"%1\""), path) << endmsg;
}
else {
- plugin.reset (new LXVSTPlugin (session.engine(), session, handle));
+ plugin.reset (new LXVSTPlugin (session.engine(), session, handle, PBD::atoi(unique_id)));
}
}
else {
diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc
index ec736fef69..80690bd744 100644
--- a/libs/ardour/meter.cc
+++ b/libs/ardour/meter.cc
@@ -18,6 +18,7 @@
#include <algorithm>
#include <cmath>
+#include <limits>
#include "pbd/compose.h"
@@ -153,7 +154,7 @@ void
PeakMeter::reset_max ()
{
for (size_t i = 0; i < _max_peak_power.size(); ++i) {
- _max_peak_power[i] = -INFINITY;
+ _max_peak_power[i] = -std::numeric_limits<float>::infinity();
_max_peak_signal[i] = 0;
}
@@ -163,7 +164,7 @@ PeakMeter::reset_max ()
if (n < n_midi) {
_visible_peak_power[n] = 0;
} else {
- _visible_peak_power[n] = -INFINITY;
+ _visible_peak_power[n] = -std::numeric_limits<float>::infinity();
}
}
}
@@ -302,7 +303,7 @@ PeakMeter::meter ()
_peak_signal[n] = 0; /* ... to here */
if (n < n_midi) {
- _max_peak_power[n] = -INFINITY; // std::max (new_peak, _max_peak_power[n]); // XXX
+ _max_peak_power[n] = -std::numeric_limits<float>::infinity(); // std::max (new_peak, _max_peak_power[n]); // XXX
_max_peak_signal[n] = 0;
if (midi_meter_falloff == 0.0f || new_peak > _visible_peak_power[n]) {
;
@@ -336,7 +337,7 @@ PeakMeter::meter ()
} else {
// do falloff
new_peak = _visible_peak_power[n] - (audio_meter_falloff);
- _visible_peak_power[n] = std::max (new_peak, -INFINITY);
+ _visible_peak_power[n] = std::max (new_peak, -std::numeric_limits<float>::infinity());
}
}
}
diff --git a/libs/ardour/midi_buffer.cc b/libs/ardour/midi_buffer.cc
index 1a6cb7fa26..4715be928c 100644
--- a/libs/ardour/midi_buffer.cc
+++ b/libs/ardour/midi_buffer.cc
@@ -199,6 +199,57 @@ MidiBuffer::push_back(TimeType time, size_t size, const uint8_t* data)
return true;
}
+bool
+MidiBuffer::insert_event(const Evoral::MIDIEvent<TimeType>& ev)
+{
+ if (size() == 0) {
+ return push_back(ev);
+ }
+
+ const size_t stamp_size = sizeof(TimeType);
+ const size_t bytes_to_merge = stamp_size + ev.size();
+
+ if (_size + bytes_to_merge >= _capacity) {
+ cerr << "MidiBuffer::push_back failed (buffer is full)" << endl;
+ PBD::stacktrace (cerr, 20);
+ return false;
+ }
+
+ TimeType t = ev.time();
+
+ ssize_t insert_offset = -1;
+ for (MidiBuffer::iterator m = begin(); m != end(); ++m) {
+ if ((*m).time() < t) {
+ continue;
+ }
+ if ((*m).time() == t) {
+ const uint8_t our_midi_status_byte = *(_data + m.offset + sizeof (TimeType));
+ if (second_simultaneous_midi_byte_is_first (ev.type(), our_midi_status_byte)) {
+ continue;
+ }
+ }
+ insert_offset = m.offset;
+ break;
+ }
+ if (insert_offset == -1) {
+ return push_back(ev);
+ }
+
+ // don't use memmove - it may use malloc(!)
+ // memmove (_data + insert_offset + bytes_to_merge, _data + insert_offset, _size - insert_offset);
+ for (ssize_t a = _size + bytes_to_merge - 1, b = _size - 1; b >= insert_offset; --b, --a) {
+ _data[a] = _data[b];
+ }
+
+ uint8_t* const write_loc = _data + insert_offset;
+ *((TimeType*)write_loc) = t;
+ memcpy(write_loc + stamp_size, ev.buffer(), ev.size());
+
+ _size += bytes_to_merge;
+
+ return true;
+}
+
/** Reserve space for a new event in the buffer.
*
* This call is for copying MIDI directly into the buffer, the data location
diff --git a/libs/ardour/midi_clock_slave.cc b/libs/ardour/midi_clock_slave.cc
index 762d94469c..8c95272fde 100644
--- a/libs/ardour/midi_clock_slave.cc
+++ b/libs/ardour/midi_clock_slave.cc
@@ -20,7 +20,6 @@
#include <cmath>
#include <errno.h>
-#include <poll.h>
#include <sys/types.h>
#include <unistd.h>
#include "pbd/error.h"
@@ -261,7 +260,7 @@ MIDIClock_Slave::stop (Parser& /*parser*/, framepos_t /*timestamp*/)
}
void
-MIDIClock_Slave::position (Parser& /*parser*/, byte* message, size_t size)
+MIDIClock_Slave::position (Parser& /*parser*/, MIDI::byte* message, size_t size)
{
// we are note supposed to get position messages while we are running
// so lets be robust and ignore those
@@ -270,8 +269,8 @@ MIDIClock_Slave::position (Parser& /*parser*/, byte* message, size_t size)
}
assert(size == 3);
- byte lsb = message[1];
- byte msb = message[2];
+ MIDI::byte lsb = message[1];
+ MIDI::byte msb = message[2];
assert((lsb <= 0x7f) && (msb <= 0x7f));
uint16_t position_in_sixteenth_notes = (uint16_t(msb) << 7) | uint16_t(lsb);
diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc
index 54b060299f..69eca996aa 100644
--- a/libs/ardour/midi_diskstream.cc
+++ b/libs/ardour/midi_diskstream.cc
@@ -26,11 +26,10 @@
#include <fcntl.h>
#include <cstdlib>
#include <ctime>
-#include <strings.h> // for ffs(3)
#include <sys/stat.h>
-#include <sys/mman.h>
#include "pbd/error.h"
+#include "pbd/ffs.h"
#include "pbd/basename.h"
#include <glibmm/threads.h>
#include "pbd/xml++.h"
@@ -76,6 +75,7 @@ MidiDiskstream::MidiDiskstream (Session &sess, const string &name, Diskstream::F
, _frames_read_from_ringbuffer(0)
, _frames_pending_write(0)
, _num_captured_loops(0)
+ , _accumulated_capture_offset(0)
, _gui_feed_buffer(AudioEngine::instance()->raw_buffer_size (DataType::MIDI))
{
in_set_state = true;
@@ -100,6 +100,7 @@ MidiDiskstream::MidiDiskstream (Session& sess, const XMLNode& node)
, _frames_read_from_ringbuffer(0)
, _frames_pending_write(0)
, _num_captured_loops(0)
+ , _accumulated_capture_offset(0)
, _gui_feed_buffer(AudioEngine::instance()->raw_buffer_size (DataType::MIDI))
{
in_set_state = true;
@@ -137,6 +138,8 @@ MidiDiskstream::init ()
MidiDiskstream::~MidiDiskstream ()
{
Glib::Threads::Mutex::Lock lm (state_lock);
+ delete _playback_buf;
+ delete _capture_buf;
}
@@ -363,6 +366,15 @@ MidiDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t
Evoral::OverlapType ot = Evoral::coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
calculate_record_range(ot, transport_frame, nframes, rec_nframes, rec_offset);
+ /* For audio: not writing frames to the capture ringbuffer offsets
+ * the recording. For midi: we need to keep track of the record range
+ * and subtract the accumulated difference from the event time.
+ */
+ if (rec_nframes) {
+ _accumulated_capture_offset += rec_offset;
+ } else {
+ _accumulated_capture_offset += nframes;
+ }
if (rec_nframes && !was_recording) {
if (loop_loc) {
@@ -395,6 +407,9 @@ MidiDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t
for (MidiBuffer::iterator i = buf.begin(); i != buf.end(); ++i) {
Evoral::MIDIEvent<MidiBuffer::TimeType> ev(*i, false);
+ if (ev.time() + rec_offset > rec_nframes) {
+ break;
+ }
#ifndef NDEBUG
if (DEBUG::MidiIO & PBD::debug_bits) {
const uint8_t* __data = ev.buffer();
@@ -417,36 +432,39 @@ MidiDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t
any desirable behaviour. We don't want to send event with
transport time here since that way the source can not
reconstruct their actual time; future clever MIDI looping should
- probabl be implemented in the source instead of here.
+ probably be implemented in the source instead of here.
*/
const framecnt_t loop_offset = _num_captured_loops * loop_length;
-
+ const framepos_t event_time = transport_frame + loop_offset - _accumulated_capture_offset + ev.time();
+ if (event_time < 0 || event_time < first_recordable_frame) {
+ continue;
+ }
switch (mode) {
case AllChannels:
- _capture_buf->write(transport_frame + loop_offset + ev.time(),
+ _capture_buf->write(event_time,
ev.type(), ev.size(), ev.buffer());
break;
case FilterChannels:
if (ev.is_channel_event()) {
if ((1<<ev.channel()) & mask) {
- _capture_buf->write(transport_frame + loop_offset + ev.time(),
+ _capture_buf->write(event_time,
ev.type(), ev.size(), ev.buffer());
}
} else {
- _capture_buf->write(transport_frame + loop_offset + ev.time(),
+ _capture_buf->write(event_time,
ev.type(), ev.size(), ev.buffer());
}
break;
case ForceChannel:
if (ev.is_channel_event()) {
- ev.set_channel (ffs(mask) - 1);
+ ev.set_channel (PBD::ffs(mask) - 1);
}
- _capture_buf->write(transport_frame + loop_offset + ev.time(),
+ _capture_buf->write(event_time,
ev.type(), ev.size(), ev.buffer());
break;
}
}
- g_atomic_int_add(const_cast<gint*> (&_frames_pending_write), nframes);
+ g_atomic_int_add(const_cast<gint*>(&_frames_pending_write), nframes);
if (buf.size() != 0) {
Glib::Threads::Mutex::Lock lm (_gui_feed_buffer_mutex, Glib::Threads::TRY_LOCK);
@@ -473,6 +491,7 @@ MidiDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t
if (was_recording) {
finish_capture ();
}
+ _accumulated_capture_offset = 0;
}
@@ -808,7 +827,7 @@ MidiDiskstream::do_flush (RunContext /*context*/, bool force_flush)
}
/* if there are 2+ chunks of disk i/o possible for
- this track, let the caller know so that it can arrange
+ this track), let the caller know so that it can arrange
for us to be called again, ASAP.
if we are forcing a flush, then if there is* any* extra
@@ -973,6 +992,10 @@ MidiDiskstream::transport_stopped_wallclock (struct tm& /*when*/, time_t /*twhen
RegionFactory::region_name (region_name, _write_source->name(), false);
+ DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n",
+ _name, (*ci)->start, (*ci)->frames, region_name));
+
+
// cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add a region\n";
try {
@@ -1195,11 +1218,12 @@ MidiDiskstream::use_new_write_source (uint32_t n)
return 1;
}
+ _accumulated_capture_offset = 0;
_write_source.reset();
try {
_write_source = boost::dynamic_pointer_cast<SMFSource>(
- _session.create_midi_source_for_session (name ()));
+ _session.create_midi_source_for_session (write_source_name ()));
if (!_write_source) {
throw failed_constructor();
@@ -1417,6 +1441,9 @@ MidiDiskstream::get_playback (MidiBuffer& dst, framecnt_t nframes)
bool
MidiDiskstream::set_name (string const & name)
{
+ if (_name == name) {
+ return true;
+ }
Diskstream::set_name (name);
/* get a new write source so that its name reflects the new diskstream name */
@@ -1425,6 +1452,19 @@ MidiDiskstream::set_name (string const & name)
return true;
}
+bool
+MidiDiskstream::set_write_source_name (const std::string& str) {
+ if (_write_source_name == str) {
+ return true;
+ }
+ Diskstream::set_write_source_name (str);
+ if (_write_source_name == name()) {
+ return true;
+ }
+ use_new_write_source (0);
+ return true;
+}
+
boost::shared_ptr<MidiBuffer>
MidiDiskstream::get_gui_feed_buffer () const
{
diff --git a/libs/ardour/midi_model.cc b/libs/ardour/midi_model.cc
index 5c1f65d96b..ef9544589d 100644
--- a/libs/ardour/midi_model.cc
+++ b/libs/ardour/midi_model.cc
@@ -1018,6 +1018,7 @@ MidiModel::PatchChangeDiffCommand::change_channel (PatchChangePtr patch, uint8_t
c.patch = patch;
c.old_channel = patch->channel ();
c.new_channel = channel;
+ c.patch_id = patch->id();
_changes.push_back (c);
}
@@ -1030,6 +1031,7 @@ MidiModel::PatchChangeDiffCommand::change_program (PatchChangePtr patch, uint8_t
c.patch = patch;
c.old_program = patch->program ();
c.new_program = program;
+ c.patch_id = patch->id();
_changes.push_back (c);
}
@@ -1250,7 +1252,7 @@ MidiModel::PatchChangePtr
MidiModel::PatchChangeDiffCommand::unmarshal_patch_change (XMLNode* n)
{
XMLProperty* prop;
- Evoral::event_id_t id;
+ Evoral::event_id_t id = 0;
Evoral::MusicalTime time = 0;
int channel = 0;
int program = 0;
@@ -1282,6 +1284,7 @@ MidiModel::PatchChangeDiffCommand::unmarshal_patch_change (XMLNode* n)
}
PatchChangePtr p (new Evoral::PatchChange<TimeType> (time, channel, program, bank));
+ assert(id);
p->set_id (id);
return p;
}
diff --git a/libs/ardour/midi_patch_manager.cc b/libs/ardour/midi_patch_manager.cc
index 4bced4e46d..591c0cae40 100644
--- a/libs/ardour/midi_patch_manager.cc
+++ b/libs/ardour/midi_patch_manager.cc
@@ -28,7 +28,8 @@
#include "ardour/session.h"
#include "ardour/session_directory.h"
#include "ardour/midi_patch_manager.h"
-#include "ardour/midi_patch_search_path.h"
+
+#include "ardour/search_paths.h"
#include "i18n.h"
@@ -67,10 +68,9 @@ MidiPatchManager::add_session_patches ()
assert (Glib::file_test (path_to_patches, Glib::FILE_TEST_IS_DIR));
- Glib::PatternSpec pattern(string("*.midnam"));
vector<std::string> result;
- find_matching_files_in_directory (path_to_patches, pattern, result);
+ find_files_matching_pattern (result, path_to_patches, "*.midnam");
info << "Loading " << result.size() << " MIDI patches from " << path_to_patches << endmsg;
@@ -102,11 +102,10 @@ MidiPatchManager::refresh()
_master_devices_by_model.clear();
_all_models.clear();
- SearchPath search_path = midi_patch_search_path ();
- Glib::PatternSpec pattern (string("*.midnam"));
+ Searchpath search_path = midi_patch_search_path ();
vector<std::string> result;
- find_matching_files_in_search_path (search_path, pattern, result);
+ find_files_matching_pattern (result, search_path, "*.midnam");
info << "Loading " << result.size() << " MIDI patches from " << search_path.to_string() << endmsg;
diff --git a/libs/ardour/midi_scene_change.cc b/libs/ardour/midi_scene_change.cc
new file mode 100644
index 0000000000..dae8acfc21
--- /dev/null
+++ b/libs/ardour/midi_scene_change.cc
@@ -0,0 +1,142 @@
+/*
+ Copyright (C) 2014 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.
+
+*/
+
+#include "pbd/error.h"
+#include "pbd/compose.h"
+
+#include "ardour/midi_port.h"
+#include "ardour/midi_scene_change.h"
+
+#include "i18n.h"
+
+using namespace PBD;
+using namespace ARDOUR;
+
+MIDISceneChange::MIDISceneChange (int c, int b, int p)
+ : _bank (b)
+ , _program (p)
+ , _channel (c & 0xf)
+{
+ if (_bank > 16384) {
+ _bank = -1;
+ }
+
+ if (_program > 128) {
+ _program = -1;
+ }
+}
+
+MIDISceneChange::MIDISceneChange (const XMLNode& node, int version)
+ : _bank (-1)
+ , _program (-1)
+ , _channel (-1)
+{
+ set_state (node, version);
+}
+
+MIDISceneChange::~MIDISceneChange ()
+{
+}
+
+size_t
+MIDISceneChange::get_bank_msb_message (uint8_t* buf, size_t size) const
+{
+ if (size < 3 || _bank < 0) {
+ return 0;
+ }
+
+ buf[0] = 0xB0 | (_channel & 0xf);
+ buf[1] = 0x0;
+ buf[2] = (_bank >> 7) & 0x7f;
+
+ return 3;
+}
+
+size_t
+MIDISceneChange::get_bank_lsb_message (uint8_t* buf, size_t size) const
+{
+ if (size < 3 || _bank < 0) {
+ return 0;
+ }
+
+ buf[0] = 0xB0 | (_channel & 0xf);
+ buf[1] = 0x20;
+ buf[2] = _bank & 0x7f;
+
+ return 3;
+}
+
+size_t
+MIDISceneChange::get_program_message (uint8_t* buf, size_t size) const
+{
+ if (size < 2 || _program < 0) {
+ return 0;
+ }
+
+ buf[0] = 0xC0 | (_channel & 0xf);
+ buf[1] = _program & 0x7f;
+
+ return 2;
+}
+
+XMLNode&
+MIDISceneChange::get_state ()
+{
+ char buf[32];
+ XMLNode* node = new XMLNode (SceneChange::xml_node_name);
+
+ node->add_property (X_("type"), X_("MIDI"));
+ snprintf (buf, sizeof (buf), "%d", (int) _program);
+ node->add_property (X_("id"), id().to_s());
+ snprintf (buf, sizeof (buf), "%d", (int) _program);
+ node->add_property (X_("program"), buf);
+ snprintf (buf, sizeof (buf), "%d", (int) _bank);
+ node->add_property (X_("bank"), buf);
+ snprintf (buf, sizeof (buf), "%d", (int) _channel);
+ node->add_property (X_("channel"), buf);
+
+ return *node;
+}
+
+int
+MIDISceneChange::set_state (const XMLNode& node, int /* version-ignored */)
+{
+ if (!set_id (node)) {
+ return -1;
+ }
+
+ const XMLProperty* prop;
+
+ if ((prop = node.property (X_("program"))) == 0) {
+ return -1;
+ }
+ _program = atoi (prop->value());
+
+ if ((prop = node.property (X_("bank"))) == 0) {
+ return -1;
+ }
+ _bank = atoi (prop->value());
+
+ if ((prop = node.property (X_("channel"))) == 0) {
+ return -1;
+ }
+ _channel = atoi (prop->value());
+
+ return 0;
+}
diff --git a/libs/ardour/midi_scene_changer.cc b/libs/ardour/midi_scene_changer.cc
new file mode 100644
index 0000000000..fcc20b850f
--- /dev/null
+++ b/libs/ardour/midi_scene_changer.cc
@@ -0,0 +1,329 @@
+/*
+ Copyright (C) 2014 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.
+
+*/
+
+#include "evoral/MIDIEvent.hpp"
+#include "midi++/channel.h"
+#include "midi++/parser.h"
+#include "midi++/port.h"
+
+#include "ardour/async_midi_port.h"
+#include "ardour/event_type_map.h"
+#include "ardour/midi_port.h"
+#include "ardour/midi_scene_change.h"
+#include "ardour/midi_scene_changer.h"
+#include "ardour/session.h"
+
+#include "i18n.h"
+
+using namespace ARDOUR;
+
+MIDISceneChanger::MIDISceneChanger (Session& s)
+ : SceneChanger (s)
+ , _recording (true)
+ , last_bank_message_time (-1)
+ , last_program_message_time (-1)
+ , last_delivered_program (-1)
+ , last_delivered_bank (-1)
+
+{
+ _session.locations()->changed.connect_same_thread (*this, boost::bind (&MIDISceneChanger::locations_changed, this, _1));
+ Location::scene_changed.connect_same_thread (*this, boost::bind (&MIDISceneChanger::gather, this));
+}
+
+MIDISceneChanger::~MIDISceneChanger ()
+{
+}
+
+void
+MIDISceneChanger::locations_changed (Locations::Change)
+{
+ gather ();
+}
+
+/** Use the session's list of locations to collect all patch changes.
+ *
+ * This is called whenever the locations change in anyway.
+ */
+void
+MIDISceneChanger::gather ()
+{
+ const Locations::LocationList& locations (_session.locations()->list());
+ boost::shared_ptr<SceneChange> sc;
+
+ Glib::Threads::RWLock::WriterLock lm (scene_lock);
+
+ scenes.clear ();
+
+ for (Locations::LocationList::const_iterator l = locations.begin(); l != locations.end(); ++l) {
+
+ if ((sc = (*l)->scene_change()) != 0) {
+
+ boost::shared_ptr<MIDISceneChange> msc = boost::dynamic_pointer_cast<MIDISceneChange> (sc);
+
+ if (msc) {
+ scenes.insert (std::make_pair ((*l)->start(), msc));
+ }
+ }
+ }
+}
+
+void
+MIDISceneChanger::rt_deliver (MidiBuffer& mbuf, framepos_t when, boost::shared_ptr<MIDISceneChange> msc)
+{
+ uint8_t buf[4];
+ size_t cnt;
+
+ if ((cnt = msc->get_bank_msb_message (buf, sizeof (buf))) > 0) {
+ mbuf.push_back (when, cnt, buf);
+
+ if ((cnt = msc->get_bank_lsb_message (buf, sizeof (buf))) > 0) {
+ mbuf.push_back (when, cnt, buf);
+ }
+
+ last_delivered_bank = msc->bank();
+ }
+
+ if ((cnt = msc->get_program_message (buf, sizeof (buf))) > 0) {
+ mbuf.push_back (when, cnt, buf);
+
+ last_delivered_program = msc->program();
+ }
+}
+
+void
+MIDISceneChanger::non_rt_deliver (boost::shared_ptr<MIDISceneChange> msc)
+{
+ uint8_t buf[4];
+ size_t cnt;
+ boost::shared_ptr<AsyncMIDIPort> aport = boost::dynamic_pointer_cast<AsyncMIDIPort>(output_port);
+
+ /* We use zero as the timestamp for these messages because we are in a
+ non-RT/process context. Using zero means "deliver them as early as
+ possible" (practically speaking, in the next process callback).
+ */
+
+ if ((cnt = msc->get_bank_msb_message (buf, sizeof (buf))) > 0) {
+ aport->write (buf, cnt, 0);
+
+ if ((cnt = msc->get_bank_lsb_message (buf, sizeof (buf))) > 0) {
+ aport->write (buf, cnt, 0);
+ }
+
+ last_delivered_bank = msc->bank();
+ }
+
+ if ((cnt = msc->get_program_message (buf, sizeof (buf))) > 0) {
+ aport->write (buf, cnt, 0);
+ last_delivered_program = msc->program();
+ }
+}
+
+void
+MIDISceneChanger::run (framepos_t start, framepos_t end)
+{
+ if (!output_port || recording() || !_session.transport_rolling()) {
+ return;
+ }
+
+ Glib::Threads::RWLock::ReaderLock lm (scene_lock, Glib::Threads::TRY_LOCK);
+
+ if (!lm.locked()) {
+ return;
+ }
+
+ /* get lower bound of events to consider */
+
+ Scenes::const_iterator i = scenes.lower_bound (start);
+ MidiBuffer& mbuf (output_port->get_midi_buffer (end-start));
+
+ while (i != scenes.end()) {
+
+ if (i->first >= end) {
+ break;
+ }
+
+ rt_deliver (mbuf, i->first - start, i->second);
+
+ ++i;
+ }
+}
+
+void
+MIDISceneChanger::locate (framepos_t pos)
+{
+ boost::shared_ptr<MIDISceneChange> msc;
+ framepos_t when;
+
+ {
+ Glib::Threads::RWLock::ReaderLock lm (scene_lock);
+
+ if (scenes.empty()) {
+ return;
+ }
+
+ Scenes::const_iterator i = scenes.lower_bound (pos);
+
+ if (i != scenes.end()) {
+
+ if (i->first != pos) {
+ /* i points to first scene with position > pos, so back
+ * up, if possible.
+ */
+ if (i != scenes.begin()) {
+ --i;
+ } else {
+ return;
+ }
+ }
+ } else {
+ /* go back to the final scene and use it */
+ --i;
+ }
+
+ when = i->first;
+ msc = i->second;
+ }
+
+ if (msc->program() != last_delivered_program || msc->bank() != last_delivered_bank) {
+ non_rt_deliver (msc);
+ }
+}
+
+void
+MIDISceneChanger::set_input_port (MIDI::Port* mp)
+{
+ input_port = mp;
+
+ incoming_connections.drop_connections();
+
+ if (input_port) {
+
+ /* midi port is asynchronous. MIDI parsing will be carried out
+ * by the MIDI UI thread which will emit the relevant signals
+ * and thus invoke our callbacks as necessary.
+ */
+
+ for (int channel = 0; channel < 16; ++channel) {
+ input_port->parser()->channel_bank_change[channel].connect_same_thread (incoming_connections, boost::bind (&MIDISceneChanger::bank_change_input, this, _1, _2, channel));
+ input_port->parser()->channel_program_change[channel].connect_same_thread (incoming_connections, boost::bind (&MIDISceneChanger::program_change_input, this, _1, _2, channel));
+ }
+ }
+}
+
+void
+MIDISceneChanger::set_output_port (boost::shared_ptr<MidiPort> mp)
+{
+ output_port = mp;
+}
+
+void
+MIDISceneChanger::set_recording (bool yn)
+{
+ _recording = yn;
+}
+
+bool
+MIDISceneChanger::recording() const
+{
+ return _session.transport_rolling() && _session.get_record_enabled();
+}
+
+void
+MIDISceneChanger::bank_change_input (MIDI::Parser& parser, unsigned short, int)
+{
+ if (!recording()) {
+ return;
+ }
+
+ last_bank_message_time = parser.get_timestamp ();
+}
+
+void
+MIDISceneChanger::program_change_input (MIDI::Parser& parser, MIDI::byte program, int channel)
+{
+ framecnt_t time = parser.get_timestamp ();
+
+ last_program_message_time = time;
+
+ if (!recording()) {
+ jump_to (input_port->channel (channel)->bank(), program);
+ return;
+ }
+
+ Locations* locations (_session.locations ());
+ Location* loc;
+ bool new_mark = false;
+ framecnt_t slop = (framecnt_t) floor ((Config->get_inter_scene_gap_msecs() / 1000.0) * _session.frame_rate());
+
+ /* check for marker at current location */
+
+ loc = locations->mark_at (time, slop);
+
+ if (!loc) {
+ /* create a new marker at the desired position */
+
+ std::string new_name;
+
+ if (!locations->next_available_name (new_name, _("Scene "))) {
+ std::cerr << "No new marker name available\n";
+ return;
+ }
+
+ loc = new Location (_session, time, time, new_name, Location::IsMark);
+ new_mark = true;
+ }
+
+ unsigned short bank = input_port->channel (channel)->bank();
+
+ MIDISceneChange* msc =new MIDISceneChange (channel, bank, program & 0x7f);
+
+ loc->set_scene_change (boost::shared_ptr<MIDISceneChange> (msc));
+
+ /* this will generate a "changed" signal to be emitted by locations,
+ and we will call ::gather() to update our list of MIDI events.
+ */
+
+ if (new_mark) {
+ locations->add (loc);
+ }
+}
+
+void
+MIDISceneChanger::jump_to (int bank, int program)
+{
+ const Locations::LocationList& locations (_session.locations()->list());
+ boost::shared_ptr<SceneChange> sc;
+ framepos_t where = max_framepos;
+
+ for (Locations::LocationList::const_iterator l = locations.begin(); l != locations.end(); ++l) {
+
+ if ((sc = (*l)->scene_change()) != 0) {
+
+ boost::shared_ptr<MIDISceneChange> msc = boost::dynamic_pointer_cast<MIDISceneChange> (sc);
+
+ if (msc->bank() == bank && msc->program() == program && (*l)->start() < where) {
+ where = (*l)->start();
+ }
+ }
+ }
+
+ if (where != max_framepos) {
+ _session.request_locate (where);
+ }
+}
diff --git a/libs/ardour/midi_source.cc b/libs/ardour/midi_source.cc
index 880bad1c24..655222413a 100644
--- a/libs/ardour/midi_source.cc
+++ b/libs/ardour/midi_source.cc
@@ -20,7 +20,6 @@
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
-#include <poll.h>
#include <float.h>
#include <cerrno>
#include <ctime>
diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc
index d07076ea65..638ed05706 100644
--- a/libs/ardour/midi_track.cc
+++ b/libs/ardour/midi_track.cc
@@ -17,8 +17,7 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include <strings.h> // for ffs(3)
-
+#include "pbd/ffs.h"
#include "pbd/enumwriter.h"
#include "pbd/convert.h"
#include "evoral/midi_util.h"
@@ -315,7 +314,7 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame
if (!lm.locked()) {
boost::shared_ptr<MidiDiskstream> diskstream = midi_diskstream();
framecnt_t playback_distance = diskstream->calculate_playback_distance(nframes);
- if (can_internal_playback_seek(std::llabs(playback_distance))) {
+ if (can_internal_playback_seek(llabs(playback_distance))) {
/* TODO should declick, and/or note-off */
internal_playback_seek(playback_distance);
}
@@ -507,7 +506,7 @@ MidiTrack::filter_channels (BufferSet& bufs, ChannelMode mode, uint32_t mask)
}
break;
case ForceChannel:
- ev.set_channel (ffs (mask) - 1);
+ ev.set_channel (PBD::ffs (mask) - 1);
++e;
break;
case AllChannels:
@@ -548,7 +547,7 @@ MidiTrack::write_out_of_band_data (BufferSet& bufs, framepos_t /*start*/, framep
int
MidiTrack::export_stuff (BufferSet& /*bufs*/, framepos_t /*start_frame*/, framecnt_t /*nframes*/,
- boost::shared_ptr<Processor> /*endpoint*/, bool /*include_endpoint*/, bool /*forexport*/)
+ boost::shared_ptr<Processor> /*endpoint*/, bool /*include_endpoint*/, bool /*for_export*/, bool /*for_freeze*/)
{
return -1;
}
@@ -627,9 +626,9 @@ void
MidiTrack::MidiControl::set_value(double val)
{
bool valid = false;
- if (std::isinf(val)) {
+ if (isinf(val)) {
cerr << "MIDIControl value is infinity" << endl;
- } else if (std::isnan(val)) {
+ } else if (isnan(val)) {
cerr << "MIDIControl value is NaN" << endl;
} else if (val < _list->parameter().min()) {
cerr << "MIDIControl value is < " << _list->parameter().min() << endl;
diff --git a/libs/ardour/midi_ui.cc b/libs/ardour/midi_ui.cc
index b80370ec6a..e00ec587ec 100644
--- a/libs/ardour/midi_ui.cc
+++ b/libs/ardour/midi_ui.cc
@@ -52,7 +52,11 @@ MidiControlUI::MidiControlUI (Session& s)
MidiControlUI::~MidiControlUI ()
{
+ /* stop the thread */
+ quit ();
+ /* drop all ports as GIO::Sources */
clear_ports ();
+ /* we no longer exist */
_instance = 0;
}
@@ -77,7 +81,9 @@ MidiControlUI::midi_input_handler (IOCondition ioc, AsyncMIDIPort* port)
if (ioc & IO_IN) {
+#ifndef PLATFORM_WINDOWS
CrossThreadChannel::drain (port->selectable());
+#endif
DEBUG_TRACE (DEBUG::MidiIO, string_compose ("data available on %1\n", ((ARDOUR::Port*)port)->name()));
framepos_t now = _session.engine().sample_time();
@@ -116,6 +122,10 @@ MidiControlUI::reset_ports ()
if ((p = dynamic_cast<AsyncMIDIPort*> (_session.mmc_input_port()))) {
ports.push_back (p);
}
+
+ if ((p = dynamic_cast<AsyncMIDIPort*> (_session.scene_input_port()))) {
+ ports.push_back (p);
+ }
if (ports.empty()) {
return;
diff --git a/libs/ardour/mididm.cc b/libs/ardour/mididm.cc
new file mode 100644
index 0000000000..0888d154e9
--- /dev/null
+++ b/libs/ardour/mididm.cc
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2013-2014 Robin Gareus <robin@gareus.org>
+ *
+ * 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.
+ */
+
+#include "ardour/mididm.h"
+#include "ardour/port_engine.h"
+
+using namespace ARDOUR;
+
+MIDIDM::MIDIDM (framecnt_t sample_rate)
+ : _sample_rate (sample_rate)
+ , _monotonic_cnt (sample_rate)
+ , _last_signal_tme (0)
+ , _cnt_total (0)
+ , _dly_total (0)
+ , _min_delay (INT32_MAX)
+ , _max_delay (0)
+ , _avg_delay (0)
+ , _var_m (0)
+ , _var_s (0)
+{
+
+}
+
+int64_t
+MIDIDM::parse_mclk (uint8_t* buf, pframes_t timestamp) const
+{
+ /* calculate time difference */
+#define MODCLK (16384) // 1<<(2*7)
+ const int64_t tc = (_monotonic_cnt + timestamp) & 0x3fff; // MODCLK - 1;
+ const int64_t ti = ((buf[2] & 0x7f) << 7) | (buf[1] & 0x7f);
+ const int64_t tdiff = (MODCLK + tc - ti) % MODCLK;
+#ifdef DEBUG_MIDIDM
+ printf("MCLK DELAY: #%5"PRId64" dt:%6"PRId64" [spl] (%6"PRId64" - %8"PRId64") @(%8"PRId64" + %d)\n",
+ _cnt_total, tdiff, tc, ti, _monotonic_cnt, timestamp);
+#endif
+ return tdiff;
+}
+
+int64_t
+MIDIDM::parse_mtc (uint8_t* buf, pframes_t timestamp) const
+{
+#define MODTC (2097152) // 1<<(3*7)
+ const int64_t tc = (_monotonic_cnt + timestamp) & 0x001FFFFF;
+ const int64_t ti = (buf[5] & 0x7f)
+ | ((buf[6] & 0x7f) << 7)
+ | ((buf[7] & 0x7f) << 14)
+ | ((buf[8] & 0x7f) << 21);
+ const int64_t tdiff = (MODTC + tc - ti) % MODTC;
+#ifdef DEBUG_MIDIDM
+ printf("MTC DELAY: #%5"PRId64" dt:%6"PRId64" [spl] (%6"PRId64" - %8"PRId64") @(%8"PRId64" + %d)\n",
+ _cnt_total, tdiff, tc, ti, _monotonic_cnt, timestamp);
+#endif
+ return tdiff;
+}
+
+int MIDIDM::process (pframes_t nframes, PortEngine &pe, void *midi_in, void *midi_out)
+{
+ /* send midi event */
+ pe.midi_clear(midi_out);
+#ifndef USE_MTC // use 3-byte song position
+ uint8_t obuf[3];
+ obuf[0] = 0xf2;
+ obuf[1] = (_monotonic_cnt) & 0x7f;
+ obuf[2] = (_monotonic_cnt >> 7) & 0x7f;
+ pe.midi_event_put (midi_out, 0, obuf, 3);
+#else // sysex MTC frame
+ uint8_t obuf[10];
+ obuf[0] = 0xf0;
+ obuf[1] = 0x7f;
+ obuf[2] = 0x7f;
+ obuf[3] = 0x01;
+ obuf[4] = 0x01;
+ obuf[9] = 0xf7;
+ obuf[5] = (_monotonic_cnt ) & 0x7f;
+ obuf[6] = (_monotonic_cnt >> 7) & 0x7f;
+ obuf[7] = (_monotonic_cnt >> 14) & 0x7f;
+ obuf[8] = (_monotonic_cnt >> 21) & 0x7f;
+ pe.midi_event_put (midi_out, 0, obuf, 10);
+#endif
+
+ /* process incoming */
+ const pframes_t nevents = pe.get_midi_event_count (midi_in);
+#ifdef DEBUG_MIDIDM
+ printf("MIDI SEND: @%8"PRId64", recv: %d systime:%"PRId64"\n", _monotonic_cnt, nevents, g_get_monotonic_time());
+#endif
+ for (pframes_t n = 0; n < nevents; ++n) {
+ pframes_t timestamp;
+ size_t size;
+ uint8_t* buf;
+ int64_t tdiff;
+ pe.midi_event_get (timestamp, size, &buf, midi_in, n);
+
+ if (size == 3 && buf[0] == 0xf2 )
+ {
+ tdiff = parse_mclk(buf, timestamp);
+ } else if (size == 10 && buf[0] == 0xf0)
+ {
+ tdiff = parse_mtc(buf, timestamp);
+ }
+ else
+ {
+ continue;
+ }
+
+ _last_signal_tme = _monotonic_cnt;
+
+ /* running variance */
+ if (_cnt_total == 0) {
+ _var_m = tdiff;
+ } else {
+ const double var_m1 = _var_m;
+ _var_m = _var_m + ((double)tdiff - _var_m) / (double)(_cnt_total + 1);
+ _var_s = _var_s + ((double)tdiff - _var_m) * ((double)tdiff - var_m1);
+ }
+ /* average and mix/max */
+ ++_cnt_total;
+ _dly_total += tdiff;
+ _avg_delay = _dly_total / _cnt_total;
+ if (tdiff < _min_delay) _min_delay = tdiff;
+ if (tdiff > _max_delay) _max_delay = tdiff;
+ }
+
+ _monotonic_cnt += nframes;
+ return 0;
+}
diff --git a/libs/ardour/midiport_manager.cc b/libs/ardour/midiport_manager.cc
index 6de0436586..b1699ca5ab 100644
--- a/libs/ardour/midiport_manager.cc
+++ b/libs/ardour/midiport_manager.cc
@@ -40,8 +40,14 @@ MidiPortManager::~MidiPortManager ()
if (_midi_in) {
AudioEngine::instance()->unregister_port (_midi_in);
}
- if (_midi_in) {
- AudioEngine::instance()->unregister_port (_midi_in);
+ if (_midi_out) {
+ AudioEngine::instance()->unregister_port (_midi_out);
+ }
+ if (_scene_in) {
+ AudioEngine::instance()->unregister_port (_scene_in);
+ }
+ if (_scene_out) {
+ AudioEngine::instance()->unregister_port (_scene_out);
}
if (_mtc_input_port) {
AudioEngine::instance()->unregister_port (_mtc_input_port);
@@ -73,7 +79,10 @@ MidiPortManager::create_ports ()
_mmc_in = AudioEngine::instance()->register_input_port (DataType::MIDI, X_("MMC in"), true);
_mmc_out = AudioEngine::instance()->register_output_port (DataType::MIDI, X_("MMC out"), true);
-
+
+ _scene_in = AudioEngine::instance()->register_input_port (DataType::MIDI, X_("Scene in"), true);
+ _scene_out = AudioEngine::instance()->register_output_port (DataType::MIDI, X_("Scene out"), true);
+
/* XXX nasty type conversion needed because of the mixed inheritance
* required to integrate MIDI::IPMidiPort and ARDOUR::AsyncMIDIPort.
*
@@ -88,6 +97,9 @@ MidiPortManager::create_ports ()
_mmc_input_port = boost::dynamic_pointer_cast<AsyncMIDIPort>(_mmc_in).get();
_mmc_output_port = boost::dynamic_pointer_cast<AsyncMIDIPort>(_mmc_out).get();
+ _scene_input_port = boost::dynamic_pointer_cast<AsyncMIDIPort>(_scene_in).get();
+ _scene_output_port = boost::dynamic_pointer_cast<AsyncMIDIPort>(_scene_out).get();
+
/* Now register ports used for sync (MTC and MIDI Clock)
*/
@@ -129,6 +141,8 @@ MidiPortManager::set_midi_port_states (const XMLNodeList&nodes)
ports.insert (make_pair (_midi_output_port->name(), _midi_out));
ports.insert (make_pair (_mmc_input_port->name(), _mmc_in));
ports.insert (make_pair (_mmc_output_port->name(), _mmc_out));
+ ports.insert (make_pair (_scene_output_port->name(), _scene_out));
+ ports.insert (make_pair (_scene_input_port->name(), _scene_in));
for (XMLNodeList::const_iterator n = nodes.begin(); n != nodes.end(); ++n) {
if ((prop = (*n)->property (X_("name"))) == 0) {
@@ -159,6 +173,8 @@ MidiPortManager::get_midi_port_states () const
ports.insert (make_pair (_midi_output_port->name(), _midi_out));
ports.insert (make_pair (_mmc_input_port->name(), _mmc_in));
ports.insert (make_pair (_mmc_output_port->name(), _mmc_out));
+ ports.insert (make_pair (_scene_output_port->name(), _scene_out));
+ ports.insert (make_pair (_scene_input_port->name(), _scene_in));
for (PortMap::const_iterator p = ports.begin(); p != ports.end(); ++p) {
s.push_back (&p->second->get_state());
diff --git a/libs/ardour/mix.cc b/libs/ardour/mix.cc
index 3a873a8e50..220cd0660c 100644
--- a/libs/ardour/mix.cc
+++ b/libs/ardour/mix.cc
@@ -24,6 +24,8 @@
#include "ardour/runtime_functions.h"
#include <stdint.h>
+using std::min;
+using std::max;
using namespace ARDOUR;
#if defined (ARCH_X86) && defined (BUILD_SSE_OPTIMIZATIONS)
@@ -93,22 +95,22 @@ default_compute_peak (const ARDOUR::Sample * buf, pframes_t nsamples, float curr
}
void
-default_find_peaks (const ARDOUR::Sample * buf, pframes_t nframes, float *min, float *max)
+default_find_peaks (const ARDOUR::Sample * buf, pframes_t nframes, float *minf, float *maxf)
{
pframes_t i;
float a, b;
- a = *max;
- b = *min;
+ a = *maxf;
+ b = *minf;
for (i = 0; i < nframes; i++)
{
- a = fmax (buf[i], a);
- b = fmin (buf[i], b);
+ a = max (buf[i], a);
+ b = min (buf[i], b);
}
- *max = a;
- *min = b;
+ *maxf = a;
+ *minf = b;
}
void
diff --git a/libs/ardour/msvc/msvc_libardour.cc b/libs/ardour/msvc/msvc_libardour.cc
new file mode 100644
index 0000000000..bd186728ea
--- /dev/null
+++ b/libs/ardour/msvc/msvc_libardour.cc
@@ -0,0 +1,276 @@
+/*
+ Copyright (C) 2009 John Emmas
+
+ 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.
+
+*/
+
+#if (defined(PLATFORM_WINDOWS) && !defined(COMPILER_CYGWIN))
+#include <shlobj.h>
+#include <glibmm.h>
+#ifdef COMPILER_MSVC
+#pragma warning(disable:4996)
+#endif
+#else
+#include <glib.h>
+#endif
+
+#include <string.h>
+#include <stdlib.h>
+#include <ardour/msvc_libardour.h>
+
+namespace ARDOUR {
+
+//***************************************************************
+//
+// placeholder_for_non_msvc_specific_function()
+//
+// Description
+//
+// Returns:
+//
+// On Success:
+//
+// On Failure:
+//
+/* LIBARDOUR_API char* LIBARDOUR_APICALLTYPE
+ placeholder_for_non_msvc_specific_function()
+{
+char *pRet = buffer;
+
+ return (pRet);
+}
+*/
+
+} // namespace ARDOUR
+
+#ifdef COMPILER_MSVC
+
+#include <errno.h>
+
+namespace ARDOUR {
+
+//***************************************************************
+//
+// symlink()
+//
+// Emulates POSIX symlink() but creates a Windows shortcut. To
+// create a Windows shortcut the supplied shortcut name must end
+// in ".lnk"
+// Note that you can only create a shortcut in a folder for which
+// you have appropriate access rights. Note also that the folder
+// must already exist. If it doesn't exist or if you don't have
+// sufficient access rights to it, symlink() will generate an
+// error (in common with its POSIX counterpart).
+//
+// Returns:
+//
+// On Success: Zero
+// On Failure: -1 ('errno' will contain the specific error)
+//
+LIBARDOUR_API int LIBARDOUR_APICALLTYPE
+symlink(const char *dest, const char *shortcut, const char *working_directory /*= NULL */)
+{
+IShellLinkA *pISL = NULL;
+IPersistFile *ppf = NULL;
+int ret = (-1);
+
+ if ((NULL == dest) || (NULL == shortcut) || (strlen(shortcut) < 5) || (strlen(dest) == 0))
+ _set_errno(EINVAL);
+ else if ((strlen(shortcut) > _MAX_PATH) || (strlen(dest) > _MAX_PATH))
+ _set_errno(ENAMETOOLONG);
+ else if (Glib::file_test(shortcut, Glib::FILE_TEST_EXISTS))
+ _set_errno(EEXIST);
+ else
+ {
+ HRESULT hRet = 0;
+
+ if (SUCCEEDED (hRet = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pISL)))
+ {
+ if (SUCCEEDED (pISL->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf)))
+ {
+ char sc_path_lower_case[_MAX_PATH];
+ WCHAR shortcut_path[_MAX_PATH];
+
+ // Fail if the path isn't a shortcut
+ strcpy(sc_path_lower_case, shortcut);
+ strlwr(sc_path_lower_case);
+ const char *p = strlen(sc_path_lower_case) + sc_path_lower_case - 4;
+
+ if (0 == strcmp(p, ".lnk"))
+ {
+ HRESULT hr;
+
+ // We're apparently been given valid Windows shortcut name
+ MultiByteToWideChar (CP_ACP, MB_PRECOMPOSED, shortcut, -1, shortcut_path, _MAX_PATH);
+
+ // Create the shortcut
+ if (FAILED (hr = ppf->Load(shortcut_path, STGM_CREATE|STGM_READWRITE|STGM_SHARE_EXCLUSIVE)))
+ hr = ppf->Save(shortcut_path, TRUE);
+
+ if (S_OK == hr)
+ {
+ // Set its target path
+ if (S_OK == pISL->SetPath(dest))
+ {
+ // Set its working directory
+ if (working_directory)
+ p = working_directory;
+ else
+ p = "";
+
+ if (S_OK == pISL->SetWorkingDirectory(p))
+ {
+ // Set its 'Show' command
+ if (S_OK == pISL->SetShowCmd(SW_SHOWNORMAL))
+ {
+ // And finally, set its icon to the same file as the target.
+ // For the time being, don't fail if the target has no icon.
+ if (Glib::file_test(dest, Glib::FILE_TEST_IS_DIR))
+ pISL->SetIconLocation("%SystemRoot%\\system32\\shell32.dll", 1);
+ else
+ pISL->SetIconLocation(dest, 0);
+
+ if (S_OK == ppf->Save(shortcut_path, FALSE))
+ {
+ Sleep(1500);
+
+ ret = 0;
+ // _set_errno(0);
+ }
+ else
+ _set_errno(EACCES);
+ }
+ else
+ _set_errno(EACCES);
+ }
+ else
+ _set_errno(EACCES);
+ }
+ else
+ _set_errno(EACCES);
+ }
+ else
+ _set_errno(EBADF);
+ }
+ else
+ _set_errno(EACCES);
+ }
+ else
+ _set_errno(EBADF);
+ }
+ else
+ {
+ if (E_POINTER == hRet)
+ _set_errno(EINVAL);
+ else
+ _set_errno(EIO);
+ }
+ }
+
+ return (ret);
+}
+
+
+//***************************************************************
+//
+// readlink()
+//
+// Emulates POSIX readlink() but using Windows shortcuts
+// Doesn't (currently) resolve shortcuts to shortcuts. This would
+// be quite simple to incorporate but we'd need to check for
+// recursion (i.e. a shortcut that points to an earlier shortcut
+// in the same chain).
+//
+// Returns:
+//
+// On Success: Zero
+// On Failure: -1 ('errno' will contain the specific error)
+//
+LIBARDOUR_API int LIBARDOUR_APICALLTYPE
+readlink(const char *__restrict shortcut, char *__restrict buf, size_t bufsize)
+{
+IShellLinkA *pISL = NULL;
+IPersistFile *ppf = NULL;
+int ret = (-1);
+
+ if ((NULL == shortcut) || (NULL == buf) || (strlen(shortcut) < 5) || (bufsize == 0))
+ _set_errno(EINVAL);
+ else if ((bufsize > _MAX_PATH) || (strlen(shortcut) > _MAX_PATH))
+ _set_errno(ENAMETOOLONG);
+ else
+ {
+ HRESULT hRet = 0;
+
+ if (SUCCEEDED (hRet = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pISL)))
+ {
+ if (SUCCEEDED (pISL->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf)))
+ {
+ char target_path[_MAX_PATH];
+ WCHAR shortcut_path[_MAX_PATH];
+
+ // Fail if the path isn't a shortcut
+ strcpy(target_path, shortcut); // Use 'target_path' temporarily
+ strlwr(target_path);
+ const char *p = strlen(target_path) + target_path - 4;
+
+ if (0 == strcmp(p, ".lnk"))
+ {
+ // We're apparently pointing to a valid Windows shortcut
+ MultiByteToWideChar (CP_ACP, MB_PRECOMPOSED, shortcut, -1, shortcut_path, _MAX_PATH);
+
+ // Load the shortcut into our persistent file
+ if (SUCCEEDED (ppf->Load(shortcut_path, 0)))
+ {
+ // Read the target information from the shortcut object
+ if (S_OK == (pISL->GetPath (target_path, _MAX_PATH, NULL, SLGP_UNCPRIORITY)))
+ {
+ strncpy(buf, target_path, bufsize);
+ ret = ((ret = strlen(buf)) > bufsize) ? bufsize : ret;
+ // _set_errno(0);
+ }
+ else
+ _set_errno(EACCES);
+ }
+ else
+ _set_errno(EBADF);
+ }
+ else
+ _set_errno(EINVAL);
+ }
+ else
+ _set_errno(EBADF);
+ }
+ else
+ {
+ if (E_POINTER == hRet)
+ _set_errno(EINVAL);
+ else
+ _set_errno(EIO);
+ }
+
+ if (ppf)
+ ppf->Release();
+
+ if (pISL)
+ pISL->Release();
+ }
+
+ return (ret);
+}
+
+} // namespace ARDOUR
+
+#endif // COMPILER_MSVC
diff --git a/libs/ardour/mtc_slave.cc b/libs/ardour/mtc_slave.cc
index e9071af619..1a1c5f2bec 100644
--- a/libs/ardour/mtc_slave.cc
+++ b/libs/ardour/mtc_slave.cc
@@ -19,11 +19,11 @@
*/
#include <iostream>
#include <errno.h>
-#include <poll.h>
#include <sys/types.h>
#include <unistd.h>
#include "pbd/error.h"
+#include "pbd/pthread_utils.h"
#include "ardour/audioengine.h"
#include "ardour/debug.h"
@@ -32,6 +32,8 @@
#include "ardour/session.h"
#include "ardour/slave.h"
+#include <glibmm/timer.h>
+
#include "i18n.h"
using namespace std;
@@ -236,7 +238,7 @@ MTC_Slave::read_current (SafeTime *st) const
do {
if (tries == 10) {
error << _("MTC Slave: atomic read of current time failed, sleeping!") << endmsg;
- usleep (20);
+ Glib::usleep (20);
tries = 0;
}
*st = current;
@@ -299,7 +301,7 @@ MTC_Slave::update_mtc_qtr (Parser& /*p*/, int which_qtr, framepos_t now)
* when a full TC has been received
* OR on locate */
void
-MTC_Slave::update_mtc_time (const byte *msg, bool was_full, framepos_t now)
+MTC_Slave::update_mtc_time (const MIDI::byte *msg, bool was_full, framepos_t now)
{
busy_guard1++;
@@ -307,8 +309,7 @@ MTC_Slave::update_mtc_time (const byte *msg, bool was_full, framepos_t now)
to use a timestamp indicating when this MTC time was received. example: when we received
a locate command via MMC.
*/
-
- DEBUG_TRACE (DEBUG::MTC, string_compose ("MTC::update_mtc_time - TID:%1\n", ::pthread_self()));
+ DEBUG_TRACE (DEBUG::MTC, string_compose ("MTC::update_mtc_time - TID:%1\n", pthread_name()));
TimecodeFormat tc_format;
bool reset_tc = true;
@@ -488,7 +489,7 @@ MTC_Slave::update_mtc_status (MIDI::MTC_Status status)
/* XXX !!! thread safety ... called from MIDI I/O context
* on locate (via ::update_mtc_time())
*/
- DEBUG_TRACE (DEBUG::MTC, string_compose("MTC_Slave::update_mtc_status - TID:%1\n", ::pthread_self()));
+ DEBUG_TRACE (DEBUG::MTC, string_compose("MTC_Slave::update_mtc_status - TID:%1\n", pthread_name()));
return; // why was this fn needed anyway ? it just messes up things -> use reset.
busy_guard1++;
diff --git a/libs/ardour/panner_manager.cc b/libs/ardour/panner_manager.cc
index ec5b675731..906e979862 100644
--- a/libs/ardour/panner_manager.cc
+++ b/libs/ardour/panner_manager.cc
@@ -24,12 +24,13 @@
#include "pbd/error.h"
#include "pbd/compose.h"
-#include "pbd/pathscanner.h"
+#include "pbd/file_utils.h"
#include "pbd/stl_delete.h"
#include "ardour/debug.h"
#include "ardour/panner_manager.h"
-#include "ardour/panner_search_path.h"
+
+#include "ardour/search_paths.h"
#include "i18n.h"
@@ -62,28 +63,42 @@ PannerManager::instance ()
static bool panner_filter (const string& str, void */*arg*/)
{
-#ifdef __APPLE__
+#ifdef COMPILER_MSVC
+ /**
+ * Different build targets (Debug / Release etc) use different versions
+ * of the 'C' runtime (which can't be 'mixed & matched'). Therefore, in
+ * case the supplied search path contains multiple version(s) of a given
+ * panner module, only select the one(s) which match the current build
+ * target (otherwise, all hell will break loose !!)
+ */
+ #if defined (_DEBUG)
+ return str.length() > 12 && (str.find ("panner_") == 0) && (str.find ("D.dll") == (str.length() - 5));
+ #elif defined (RDC_BUILD)
+ return str.length() > 14 && (str.find ("panner_") == 0) && (str.find ("RDC.dll") == (str.length() - 7));
+ #elif defined (_WIN64)
+ return str.length() > 13 && (str.find ("panner_") == 0) && (str.find ("64.dll") == (str.length() - 6));
+ #else
+ return str.length() > 13 && (str.find ("panner_") == 0) && (str.find ("32.dll") == (str.length() - 6));
+ #endif
+#elif defined (__APPLE__)
return str[0] != '.' && (str.length() > 6 && str.find (".dylib") == (str.length() - 6));
#else
- return str[0] != '.' && (str.length() > 3 && str.find (".so") == (str.length() - 3));
+ return str[0] != '.' && (str.length() > 3 && (str.find (".so") == (str.length() - 3) || str.find (".dll") == (str.length() - 4)));
#endif
}
void
PannerManager::discover_panners ()
{
- PathScanner scanner;
- std::vector<std::string *> *panner_modules;
- std::string search_path = panner_search_path().to_string();
+ std::vector<std::string> panner_modules;
- DEBUG_TRACE (DEBUG::Panning, string_compose (_("looking for panners in %1\n"), search_path));
+ DEBUG_TRACE (DEBUG::Panning, string_compose (_("looking for panners in %1\n"), panner_search_path().to_string()));
- panner_modules = scanner (search_path, panner_filter, 0, false, true, 1, true);
+ find_files_matching_filter (panner_modules, panner_search_path(), panner_filter, 0, false, true, true);
- for (vector<std::string *>::iterator i = panner_modules->begin(); i != panner_modules->end(); ++i) {
- panner_discover (**i);
+ for (vector<std::string>::iterator i = panner_modules.begin(); i != panner_modules.end(); ++i) {
+ panner_discover (*i);
}
- vector_delete (panner_modules);
}
int
@@ -104,6 +119,8 @@ PannerManager::panner_discover (string path)
if (i == panner_info.end()) {
panner_info.push_back (pinfo);
DEBUG_TRACE (DEBUG::Panning, string_compose(_("Panner discovered: \"%1\" in %2\n"), pinfo->descriptor.name, path));
+ } else {
+ delete pinfo;
}
}
@@ -113,31 +130,33 @@ PannerManager::panner_discover (string path)
PannerInfo*
PannerManager::get_descriptor (string path)
{
- void *module;
+ Glib::Module* module = new Glib::Module(path);
PannerInfo* info = 0;
PanPluginDescriptor *descriptor = 0;
PanPluginDescriptor* (*dfunc)(void);
- const char *errstr;
+ void* func = 0;
- if ((module = dlopen (path.c_str(), RTLD_NOW)) == 0) {
- error << string_compose(_("PannerManager: cannot load module \"%1\" (%2)"), path, dlerror()) << endmsg;
+ if (!module) {
+ error << string_compose(_("PannerManager: cannot load module \"%1\" (%2)"), path,
+ Glib::Module::get_last_error()) << endmsg;
+ delete module;
return 0;
}
- dfunc = (PanPluginDescriptor* (*)(void)) dlsym (module, "panner_descriptor");
-
- if ((errstr = dlerror()) != 0) {
+ if (!module->get_symbol("panner_descriptor", func)) {
error << string_compose(_("PannerManager: module \"%1\" has no descriptor function."), path) << endmsg;
- error << errstr << endmsg;
- dlclose (module);
+ error << Glib::Module::get_last_error() << endmsg;
+ delete module;
return 0;
}
+ dfunc = (PanPluginDescriptor* (*)(void))func;
descriptor = dfunc();
+
if (descriptor) {
info = new PannerInfo (*descriptor, module);
} else {
- dlclose (module);
+ delete module;
}
return info;
diff --git a/libs/ardour/panner_search_path.cc b/libs/ardour/panner_search_path.cc
deleted file mode 100644
index 49349238e4..0000000000
--- a/libs/ardour/panner_search_path.cc
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- Copyright (C) 2007 Tim Mayberry
-
- 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.
-
-*/
-
-#include <glibmm/miscutils.h>
-
-#include "ardour/panner_search_path.h"
-#include "ardour/directory_names.h"
-#include "ardour/filesystem_paths.h"
-
-namespace {
- const char * const panner_env_variable_name = "ARDOUR_PANNER_PATH";
-} // anonymous
-
-using namespace PBD;
-
-namespace ARDOUR {
-
-SearchPath
-panner_search_path ()
-{
- SearchPath spath(user_config_directory ());
- spath += ardour_dll_directory ();
- spath.add_subdirectory_to_paths(panner_dir_name);
- spath += SearchPath(Glib::getenv(panner_env_variable_name));
- return spath;
-}
-
-} // namespace ARDOUR
diff --git a/libs/ardour/panner_shell.cc b/libs/ardour/panner_shell.cc
index 75543433c5..a4a9342816 100644
--- a/libs/ardour/panner_shell.cc
+++ b/libs/ardour/panner_shell.cc
@@ -119,8 +119,8 @@ PannerShell::configure_io (ChanCount in, ChanCount out)
PannerInfo* pi = PannerManager::instance().select_panner (in, out, _user_selected_panner_uri);
if (!pi) {
- cerr << "No panner found: check that panners are being discovered correctly during startup.\n";
- assert (pi);
+ fatal << _("No panner found: check that panners are being discovered correctly during startup.") << endmsg;
+ /*NOTREACHED*/
}
DEBUG_TRACE (DEBUG::Panning, string_compose (_("select panner: %1\n"), pi->descriptor.name.c_str()));
@@ -233,6 +233,16 @@ PannerShell::set_state (const XMLNode& node, int version)
_current_panner_uri = (*p)->descriptor.panner_uri;
_panner_gui_uri = (*p)->descriptor.gui_uri;
+ if (_is_send) {
+ if (!_panlinked) {
+ _pannable_internal->set_panner(_panner);
+ } else {
+ _force_reselect = true;
+ }
+ } else {
+ _pannable_route->set_panner(_panner);
+ }
+
if (_panner->set_state (**niter, version) == 0) {
return -1;
}
diff --git a/libs/ardour/pcm_utils.cc b/libs/ardour/pcm_utils.cc
index de3497d977..ae3bd4a4e0 100644
--- a/libs/ardour/pcm_utils.cc
+++ b/libs/ardour/pcm_utils.cc
@@ -17,8 +17,10 @@
*/
+#ifdef COMPILER_MSVC
+#include <ardourext/float_cast.h>
+#endif
#include "ardour/pcm_utils.h"
-
#include <cmath>
using namespace std;
diff --git a/libs/ardour/pi_controller.cc b/libs/ardour/pi_controller.cc
deleted file mode 100644
index a165aa9e40..0000000000
--- a/libs/ardour/pi_controller.cc
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- Copyright (C) 2008 Torben Hohn
-
- 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.
-*/
-
-#include <iostream>
-#include <cmath>
-#include <cstdlib>
-
-#include "ardour/pi_controller.h"
-
-static inline double hann(double x) {
- return 0.5 * (1.0 - cos(2 * M_PI * x));
-}
-
-PIController::PIController (double resample_factor, int fir_size)
-{
- resample_mean = resample_factor;
- static_resample_factor = resample_factor;
- offset_array = new double[fir_size];
- window_array = new double[fir_size];
- offset_differential_index = 0;
- offset_integral = 0.0;
- smooth_size = fir_size;
-
- for (int i = 0; i < fir_size; i++) {
- offset_array[i] = 0.0;
- window_array[i] = hann(double(i) / (double(fir_size) - 1.0));
- }
-
- // These values could be configurable
- catch_factor = 20000;
- catch_factor2 = 4000;
- pclamp = 150.0;
- controlquant = 10000.0;
- fir_empty = false;
-}
-
-PIController::~PIController ()
-{
- delete [] offset_array;
- delete [] window_array;
-}
-
-double
-PIController::get_ratio (int fill_level, int period_size)
-{
- double offset = fill_level;
- double this_catch_factor = catch_factor;
- double this_catch_factor2 = catch_factor2 * 4096.0/(double)period_size;
-
-
- // Save offset.
- if( fir_empty ) {
- for (int i = 0; i < smooth_size; i++) {
- offset_array[i] = offset;
- }
- fir_empty = false;
- } else {
- offset_array[(offset_differential_index++) % smooth_size] = offset;
- }
-
- // Build the mean of the windowed offset array basically fir lowpassing.
- smooth_offset = 0.0;
- for (int i = 0; i < smooth_size; i++) {
- smooth_offset += offset_array[(i + offset_differential_index - 1) % smooth_size] * window_array[i];
- }
- smooth_offset /= double(smooth_size);
-
- // This is the integral of the smoothed_offset
- offset_integral += smooth_offset;
-
- std::cerr << smooth_offset << " ";
-
- // Clamp offset : the smooth offset still contains unwanted noise which would go straigth onto the resample coeff.
- // It only used in the P component and the I component is used for the fine tuning anyways.
-
- if (fabs(smooth_offset) < pclamp)
- smooth_offset = 0.0;
-
- smooth_offset += (static_resample_factor - resample_mean) * this_catch_factor;
-
- // Ok, now this is the PI controller.
- // u(t) = K * (e(t) + 1/T \int e(t') dt')
- // Kp = 1/catch_factor and T = catch_factor2 Ki = Kp/T
- current_resample_factor
- = static_resample_factor - smooth_offset / this_catch_factor - offset_integral / this_catch_factor / this_catch_factor2;
-
- // Now quantize this value around resample_mean, so that the noise which is in the integral component doesnt hurt.
- current_resample_factor = floor((current_resample_factor - resample_mean) * controlquant + 0.5) / controlquant + resample_mean;
-
- // Calculate resample_mean so we can init ourselves to saner values.
- // resample_mean = 0.9999 * resample_mean + 0.0001 * current_resample_factor;
- resample_mean = (1.0-0.01) * resample_mean + 0.01 * current_resample_factor;
- std::cerr << fill_level << " " << smooth_offset << " " << offset_integral << " " << current_resample_factor << " " << resample_mean << "\n";
- return current_resample_factor;
-}
-
-void
-PIController::out_of_bounds()
-{
- int i;
- // Set the resample_rate... we need to adjust the offset integral, to do this.
- // first look at the PI controller, this code is just a special case, which should never execute once
- // everything is swung in.
- offset_integral = - (resample_mean - static_resample_factor) * catch_factor * catch_factor2;
- // Also clear the array. we are beginning a new control cycle.
- for (i = 0; i < smooth_size; i++) {
- offset_array[i] = 0.0;
- }
- fir_empty = false;
-}
-
-
-PIChaser::PIChaser() {
- pic = new PIController( 1.0, 16 );
- array_index = 0;
- for( int i=0; i<ESTIMATOR_SIZE; i++ ) {
- realtime_stamps[i] = 0;
- chasetime_stamps[i] = 0;
- }
-
- speed_threshold = 0.2;
- pos_threshold = 4000;
- want_locate_val = 0;
-}
-
-void
-PIChaser::reset() {
- array_index = 0;
- for( int i=0; i<ESTIMATOR_SIZE; i++ ) {
- realtime_stamps[i] = 0;
- chasetime_stamps[i] = 0;
- }
- pic->reset(1.0);
-}
-PIChaser::~PIChaser() {
- delete pic;
-}
-
-double
-PIChaser::get_ratio(framepos_t chasetime_measured, framepos_t chasetime, framepos_t slavetime_measured, framepos_t slavetime, bool in_control, int period_size ) {
-
- feed_estimator( chasetime_measured, chasetime );
- std::cerr << (double)chasetime_measured/48000.0 << " " << chasetime << " " << slavetime << " ";
- double crude = get_estimate();
- double fine;
- framepos_t massaged_chasetime = chasetime + (framepos_t)( (double)(slavetime_measured - chasetime_measured) * crude );
-
- fine = pic->get_ratio (slavetime - massaged_chasetime, period_size);
- if (in_control) {
- if (fabs(fine-crude) > crude*speed_threshold) {
- std::cout << "reset to " << crude << " fine = " << fine << "\n";
- pic->reset( crude );
- speed = crude;
- } else {
- speed = fine;
- }
-
- if (abs(chasetime-slavetime) > pos_threshold) {
- pic->reset( crude );
- speed = crude;
- want_locate_val = chasetime;
- std::cout << "we are off by " << chasetime-slavetime << " want_locate:" << chasetime << "\n";
- } else {
- want_locate_val = 0;
- }
- } else {
- std::cout << "not in control..." << crude << "\n";
- speed = crude;
- pic->reset( crude );
- }
-
- return speed;
-}
-
-void
-PIChaser::feed_estimator (framepos_t realtime, framepos_t chasetime ) {
- array_index += 1;
- realtime_stamps [ array_index%ESTIMATOR_SIZE ] = realtime;
- chasetime_stamps[ array_index%ESTIMATOR_SIZE ] = chasetime;
-}
-
-double
-PIChaser::get_estimate() {
- double est = 0;
- int num=0;
- int i;
- framepos_t n1_realtime;
- framepos_t n1_chasetime;
- for( i=(array_index + 1); i<=(array_index + ESTIMATOR_SIZE); i++ ) {
- if( realtime_stamps[(i)%ESTIMATOR_SIZE] ) {
- n1_realtime = realtime_stamps[(i)%ESTIMATOR_SIZE];
- n1_chasetime = chasetime_stamps[(i)%ESTIMATOR_SIZE];
- i+=1;
- break;
- }
- }
-
- for( ; i<=(array_index + ESTIMATOR_SIZE); i++ ) {
- if( realtime_stamps[(i)%ESTIMATOR_SIZE] ) {
- if( (realtime_stamps[(i)%ESTIMATOR_SIZE] - n1_realtime) > 200 ) {
- framepos_t n_realtime = realtime_stamps[(i)%ESTIMATOR_SIZE];
- framepos_t n_chasetime = chasetime_stamps[(i)%ESTIMATOR_SIZE];
- est += ((double)( n_chasetime - n1_chasetime ))
- / ((double)( n_realtime - n1_realtime ));
- n1_realtime = n_realtime;
- n1_chasetime = n_chasetime;
- num += 1;
- }
- }
- }
-
- if(num)
- return est/(double)num;
- else
- return 0.0;
-}
diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc
index bb79801c9f..ef768cad96 100644
--- a/libs/ardour/playlist.cc
+++ b/libs/ardour/playlist.cc
@@ -1997,11 +1997,11 @@ Playlist::find_next_region (framepos_t frame, RegionPoint point, int dir)
freeze ();
/* add the added regions */
- for (RegionListProperty::ChangeContainer::iterator i = change.added.begin(); i != change.added.end(); ++i) {
+ for (RegionListProperty::ChangeContainer::const_iterator i = change.added.begin(); i != change.added.end(); ++i) {
add_region_internal ((*i), (*i)->position());
}
/* remove the removed regions */
- for (RegionListProperty::ChangeContainer::iterator i = change.removed.begin(); i != change.removed.end(); ++i) {
+ for (RegionListProperty::ChangeContainer::const_iterator i = change.removed.begin(); i != change.removed.end(); ++i) {
remove_region (*i);
}
@@ -2488,7 +2488,7 @@ Playlist::uses_source (boost::shared_ptr<const Source> src) const
{
RegionReadLock rlock (const_cast<Playlist*> (this));
- for (set<boost::shared_ptr<Region> >::iterator r = all_regions.begin(); r != all_regions.end(); ++r) {
+ for (set<boost::shared_ptr<Region> >::const_iterator r = all_regions.begin(); r != all_regions.end(); ++r) {
if ((*r)->uses_source (src)) {
return true;
}
@@ -2533,7 +2533,7 @@ Playlist::region_by_id (const ID& id) const
{
/* searches all regions ever added to this playlist */
- for (set<boost::shared_ptr<Region> >::iterator i = all_regions.begin(); i != all_regions.end(); ++i) {
+ for (set<boost::shared_ptr<Region> >::const_iterator i = all_regions.begin(); i != all_regions.end(); ++i) {
if ((*i)->id() == id) {
return *i;
}
@@ -2809,7 +2809,14 @@ Playlist::combine (const RegionList& r)
pl->in_partition = true;
- for (RegionList::const_iterator i = r.begin(); i != r.end(); ++i) {
+ /* sort by position then layer.
+ * route_time_axis passes 'selected_regions' - which is not sorted.
+ * here we need the top-most first, then every layer's region sorted by position.
+ */
+ RegionList sorted(r);
+ sorted.sort(RegionSortByLayerAndPosition());
+
+ for (RegionList::const_iterator i = sorted.begin(); i != sorted.end(); ++i) {
/* copy the region */
@@ -3050,6 +3057,7 @@ Playlist::uncombine (boost::shared_ptr<Region> target)
for (vector<boost::shared_ptr<Region> >::iterator i = originals.begin(); i != originals.end(); ++i) {
add_region ((*i), (*i)->position());
+ set_layer((*i), (*i)->layer());
}
in_partition = false;
diff --git a/libs/ardour/plugin.cc b/libs/ardour/plugin.cc
index 9b2170c349..11d859ed8c 100644
--- a/libs/ardour/plugin.cc
+++ b/libs/ardour/plugin.cc
@@ -27,12 +27,16 @@
#include <cstdlib>
#include <cstdio> // so libraptor doesn't complain
#include <cmath>
+#ifndef COMPILER_MSVC
#include <dirent.h>
+#endif
#include <sys/stat.h>
#include <cerrno>
#include <utility>
+#ifdef HAVE_LRDF
#include <lrdf.h>
+#endif
#include "pbd/compose.h"
#include "pbd/error.h"
diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc
index ae018fb2a3..5279a36962 100644
--- a/libs/ardour/plugin_insert.cc
+++ b/libs/ardour/plugin_insert.cc
@@ -352,6 +352,9 @@ PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t of
}
}
+ bufs.set_count(ChanCount::max(bufs.count(), in_streams));
+ bufs.set_count(ChanCount::max(bufs.count(), out_streams));
+
/* Note that we've already required that plugins
be able to handle in-place processing.
*/
@@ -452,13 +455,13 @@ PluginInsert::silence (framecnt_t nframes)
}
void
-PluginInsert::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t nframes, bool)
+PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t /*end_frame*/, pframes_t nframes, bool)
{
if (_pending_active) {
/* run as normal if we are active or moving from inactive to active */
- if (_session.transport_rolling()) {
- automation_run (bufs, nframes);
+ if (_session.transport_rolling() || _session.bounce_processing()) {
+ automation_run (bufs, start_frame, nframes);
} else {
connect_and_run (bufs, nframes, 0, false);
}
@@ -535,10 +538,10 @@ PluginInsert::get_parameter (Evoral::Parameter param)
}
void
-PluginInsert::automation_run (BufferSet& bufs, pframes_t nframes)
+PluginInsert::automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes)
{
Evoral::ControlEvent next_event (0, 0.0f);
- framepos_t now = _session.transport_frame ();
+ framepos_t now = start;
framepos_t end = now + nframes;
framecnt_t offset = 0;
@@ -973,6 +976,22 @@ PluginInsert::set_state(const XMLNode& node, int version)
boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
+ /* treat linux and windows VST plugins equivalent if they have the same uniqueID
+ * allow to move sessions windows <> linux */
+#ifdef LXVST_SUPPORT
+ if (plugin == 0 && type == ARDOUR::Windows_VST) {
+ type = ARDOUR::LXVST;
+ plugin = find_plugin (_session, prop->value(), type);
+ }
+#endif
+
+#ifdef WINDOWS_VST_SUPPORT
+ if (plugin == 0 && type == ARDOUR::LXVST) {
+ type = ARDOUR::Windows_VST;
+ plugin = find_plugin (_session, prop->value(), type);
+ }
+#endif
+
if (plugin == 0) {
error << string_compose(
_("Found a reference to a plugin (\"%1\") that is unknown.\n"
diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc
index df1b7fc441..e596c67634 100644
--- a/libs/ardour/plugin_manager.cc
+++ b/libs/ardour/plugin_manager.cc
@@ -25,27 +25,33 @@
#include <sys/types.h>
#include <cstdio>
-#include <lrdf.h>
-#include <dlfcn.h>
#include <cstdlib>
#include <fstream>
+#ifdef HAVE_LRDF
+#include <lrdf.h>
+#endif
+
#ifdef WINDOWS_VST_SUPPORT
+#include "ardour/vst_info_file.h"
#include "fst.h"
#include "pbd/basename.h"
#include <cstring>
#endif // WINDOWS_VST_SUPPORT
#ifdef LXVST_SUPPORT
+#include "ardour/vst_info_file.h"
#include "ardour/linux_vst_support.h"
#include "pbd/basename.h"
#include <cstring>
#endif //LXVST_SUPPORT
+#include <glib/gstdio.h>
#include <glibmm/miscutils.h>
+#include <glibmm/pattern.h>
-#include "pbd/pathscanner.h"
#include "pbd/whitespace.h"
+#include "pbd/file_utils.h"
#include "ardour/debug.h"
#include "ardour/filesystem_paths.h"
@@ -55,6 +61,8 @@
#include "ardour/plugin_manager.h"
#include "ardour/rc_configuration.h"
+#include "ardour/search_paths.h"
+
#ifdef LV2_SUPPORT
#include "ardour/lv2_plugin.h"
#endif
@@ -77,14 +85,17 @@
#include "i18n.h"
+#include "ardour/debug.h"
+
using namespace ARDOUR;
using namespace PBD;
using namespace std;
PluginManager* PluginManager::_instance = 0;
+std::string PluginManager::scanner_bin_path = "";
PluginManager&
-PluginManager::instance()
+PluginManager::instance()
{
if (!_instance) {
_instance = new PluginManager;
@@ -98,10 +109,17 @@ PluginManager::PluginManager ()
, _ladspa_plugin_info(0)
, _lv2_plugin_info(0)
, _au_plugin_info(0)
+ , _cancel_scan(false)
+ , _cancel_timeout(false)
{
char* s;
string lrdf_path;
+ string scan_p = Glib::build_filename(ARDOUR::ardour_dll_directory(), "fst");
+ if (!PBD::find_file ( PBD::Searchpath(scan_p), "ardour-vst-scanner", scanner_bin_path)) {
+ PBD::warning << "VST scanner app (ardour-vst-scanner) not found in path " << scan_p << endmsg;
+ }
+
load_statuses ();
if ((s = getenv ("LADSPA_RDF_PATH"))){
@@ -126,36 +144,38 @@ PluginManager::PluginManager ()
}
#endif /* Native LinuxVST support*/
- if ((s = getenv ("LADSPA_PATH"))) {
- ladspa_path = s;
- }
-
if ((s = getenv ("VST_PATH"))) {
windows_vst_path = s;
} else if ((s = getenv ("VST_PLUGINS"))) {
windows_vst_path = s;
}
+ if (windows_vst_path.length() == 0) {
+ windows_vst_path = vst_search_path ();
+ }
+
if ((s = getenv ("LXVST_PATH"))) {
lxvst_path = s;
} else if ((s = getenv ("LXVST_PLUGINS"))) {
lxvst_path = s;
}
- if (_instance == 0) {
- _instance = this;
+ if (lxvst_path.length() == 0) {
+ lxvst_path = "/usr/local/lib64/lxvst:/usr/local/lib/lxvst:/usr/lib64/lxvst:/usr/lib/lxvst:"
+ "/usr/local/lib64/linux_vst:/usr/local/lib/linux_vst:/usr/lib64/linux_vst:/usr/lib/linux_vst:"
+ "/usr/lib/vst:/usr/local/lib/vst";
}
- /* the plugin manager is constructed too early to use Profile */
+ /* first time setup, use 'default' path */
+ if (Config->get_plugin_path_lxvst() == X_("@default@")) {
+ Config->set_plugin_path_lxvst(get_default_lxvst_path());
+ }
+ if (Config->get_plugin_path_vst() == X_("@default@")) {
+ Config->set_plugin_path_vst(get_default_windows_vst_path());
+ }
- if (getenv ("ARDOUR_SAE")) {
- ladspa_plugin_whitelist.push_back (1203); // single band parametric
- ladspa_plugin_whitelist.push_back (1772); // caps compressor
- ladspa_plugin_whitelist.push_back (1913); // fast lookahead limiter
- ladspa_plugin_whitelist.push_back (1075); // simple RMS expander
- ladspa_plugin_whitelist.push_back (1061); // feedback delay line (max 5s)
- ladspa_plugin_whitelist.push_back (1216); // gverb
- ladspa_plugin_whitelist.push_back (2150); // tap pitch shifter
+ if (_instance == 0) {
+ _instance = this;
}
BootMessage (_("Discovering Plugins"));
@@ -166,123 +186,154 @@ PluginManager::~PluginManager()
{
}
-
void
-PluginManager::refresh ()
+PluginManager::refresh (bool cache_only)
{
DEBUG_TRACE (DEBUG::PluginManager, "PluginManager::refresh\n");
+ _cancel_scan = false;
+ BootMessage (_("Scanning LADSPA Plugins"));
ladspa_refresh ();
#ifdef LV2_SUPPORT
+ BootMessage (_("Scanning LV2 Plugins"));
lv2_refresh ();
#endif
#ifdef WINDOWS_VST_SUPPORT
if (Config->get_use_windows_vst()) {
- windows_vst_refresh ();
+ BootMessage (_("Scanning Windows VST Plugins"));
+ windows_vst_refresh (cache_only);
}
#endif // WINDOWS_VST_SUPPORT
#ifdef LXVST_SUPPORT
if(Config->get_use_lxvst()) {
- lxvst_refresh();
+ BootMessage (_("Scanning Linux VST Plugins"));
+ lxvst_refresh(cache_only);
}
#endif //Native linuxVST SUPPORT
#ifdef AUDIOUNIT_SUPPORT
+ BootMessage (_("Scanning AU Plugins"));
au_refresh ();
#endif
+ BootMessage (_("Plugin Scan Complete..."));
PluginListChanged (); /* EMIT SIGNAL */
+ PluginScanMessage(X_("closeme"), "", false);
+ _cancel_scan = false;
}
void
-PluginManager::ladspa_refresh ()
+PluginManager::cancel_plugin_scan ()
{
- if (_ladspa_plugin_info)
- _ladspa_plugin_info->clear ();
- else
- _ladspa_plugin_info = new ARDOUR::PluginInfoList ();
+ _cancel_scan = true;
+}
- static const char *standard_paths[] = {
- "/usr/local/lib64/ladspa",
- "/usr/local/lib/ladspa",
- "/usr/lib64/ladspa",
- "/usr/lib/ladspa",
- "/Library/Audio/Plug-Ins/LADSPA",
- ""
- };
+void
+PluginManager::cancel_plugin_timeout ()
+{
+ _cancel_timeout = true;
+}
- /* allow LADSPA_PATH to augment, not override standard locations */
+void
+PluginManager::clear_vst_cache ()
+{
+ // see also libs/ardour/vst_info_file.cc - vstfx_infofile_path()
+#ifdef WINDOWS_VST_SUPPORT
+ {
+ vector<string> fsi_files;
+ find_files_matching_regex (fsi_files, Config->get_plugin_path_vst(), "\\.fsi$");
+ for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
+ ::g_unlink(i->c_str());
+ }
+ }
+#endif
- /* Only add standard locations to ladspa_path if it doesn't
- * already contain them. Check for trailing G_DIR_SEPARATOR too.
- */
+#ifdef LXVST_SUPPORT
+ {
+ vector<string> fsi_files;
+ find_files_matching_regex (fsi_files, Config->get_plugin_path_lxvst(), "\\.fsi$");
+ for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
+ ::g_unlink(i->c_str());
+ }
+ }
+#endif
- int i;
- for (i = 0; standard_paths[i][0]; i++) {
- size_t found = ladspa_path.find(standard_paths[i]);
- if (found != ladspa_path.npos) {
- switch (ladspa_path[found + strlen(standard_paths[i])]) {
- case ':' :
- case '\0':
- continue;
- case G_DIR_SEPARATOR :
- if (ladspa_path[found + strlen(standard_paths[i]) + 1] == ':' ||
- ladspa_path[found + strlen(standard_paths[i]) + 1] == '\0') {
- continue;
- }
- }
+#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
+ {
+ string personal = get_personal_vst_info_cache_dir();
+ vector<string> fsi_files;
+ find_files_matching_regex (fsi_files, personal, "\\.fsi$");
+ for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
+ ::g_unlink(i->c_str());
}
- if (!ladspa_path.empty())
- ladspa_path += ":";
+ }
+#endif
+}
- ladspa_path += standard_paths[i];
+void
+PluginManager::clear_vst_blacklist ()
+{
+#ifdef WINDOWS_VST_SUPPORT
+ {
+ vector<string> fsi_files;
+ find_files_matching_regex (fsi_files, Config->get_plugin_path_vst(), "\\.fsb$");
+ for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
+ ::g_unlink(i->c_str());
+ }
+ }
+#endif
+#ifdef LXVST_SUPPORT
+ {
+ vector<string> fsi_files;
+ find_files_matching_regex (fsi_files, Config->get_plugin_path_lxvst(), "\\.fsb$");
+ for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
+ ::g_unlink(i->c_str());
+ }
}
+#endif
- DEBUG_TRACE (DEBUG::PluginManager, string_compose ("LADSPA: search along: [%1]\n", ladspa_path));
+#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
+ {
+ string personal = get_personal_vst_blacklist_dir();
- ladspa_discover_from_path (ladspa_path);
+ vector<string> fsi_files;
+ find_files_matching_regex (fsi_files, personal, "\\.fsb$");
+ for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
+ ::g_unlink(i->c_str());
+ }
+ }
+#endif
}
-
-int
-PluginManager::add_ladspa_directory (string path)
+void
+PluginManager::ladspa_refresh ()
{
- if (ladspa_discover_from_path (path) == 0) {
- ladspa_path += ':';
- ladspa_path += path;
- return 0;
+ if (_ladspa_plugin_info) {
+ _ladspa_plugin_info->clear ();
+ } else {
+ _ladspa_plugin_info = new ARDOUR::PluginInfoList ();
}
- return -1;
-}
-static bool ladspa_filter (const string& str, void */*arg*/)
-{
- /* Not a dotfile, has a prefix before a period, suffix is "so" */
+ /* allow LADSPA_PATH to augment, not override standard locations */
- return str[0] != '.' && (str.length() > 3 && str.find (".so") == (str.length() - 3));
-}
+ /* Only add standard locations to ladspa_path if it doesn't
+ * already contain them. Check for trailing G_DIR_SEPARATOR too.
+ */
-int
-PluginManager::ladspa_discover_from_path (string /*path*/)
-{
- PathScanner scanner;
- vector<string *> *plugin_objects;
- vector<string *>::iterator x;
- int ret = 0;
+ vector<string> ladspa_modules;
- plugin_objects = scanner (ladspa_path, ladspa_filter, 0, false, true);
+ DEBUG_TRACE (DEBUG::PluginManager, string_compose ("LADSPA: search along: [%1]\n", ladspa_search_path().to_string()));
- if (plugin_objects) {
- for (x = plugin_objects->begin(); x != plugin_objects->end (); ++x) {
- ladspa_discover (**x);
- }
+ find_files_matching_pattern (ladspa_modules, ladspa_search_path (), "*.so");
+ find_files_matching_pattern (ladspa_modules, ladspa_search_path (), "*.dylib");
+ find_files_matching_pattern (ladspa_modules, ladspa_search_path (), "*.dll");
- vector_delete (plugin_objects);
+ for (vector<std::string>::iterator i = ladspa_modules.begin(); i != ladspa_modules.end(); ++i) {
+ ARDOUR::PluginScanMessage(_("LADSPA"), *i, false);
+ ladspa_discover (*i);
}
-
- return ret;
}
static bool rdf_filter (const string &str, void* /*arg*/)
@@ -315,10 +366,9 @@ PluginManager::add_lxvst_presets()
void
PluginManager::add_presets(string domain)
{
-
- PathScanner scanner;
- vector<string *> *presets;
- vector<string *>::iterator x;
+#ifdef HAVE_LRDF
+ vector<string> presets;
+ vector<string>::iterator x;
char* envvar;
if ((envvar = getenv ("HOME")) == 0) {
@@ -326,64 +376,64 @@ PluginManager::add_presets(string domain)
}
string path = string_compose("%1/.%2/rdf", envvar, domain);
- presets = scanner (path, rdf_filter, 0, false, true);
+ find_files_matching_filter (presets, path, rdf_filter, 0, false, true);
- if (presets) {
- for (x = presets->begin(); x != presets->end (); ++x) {
- string file = "file:" + **x;
- if (lrdf_read_file(file.c_str())) {
- warning << string_compose(_("Could not parse rdf file: %1"), *x) << endmsg;
- }
+ for (x = presets.begin(); x != presets.end (); ++x) {
+ string file = "file:" + *x;
+ if (lrdf_read_file(file.c_str())) {
+ warning << string_compose(_("Could not parse rdf file: %1"), *x) << endmsg;
}
-
- vector_delete (presets);
}
+
+#endif
}
void
PluginManager::add_lrdf_data (const string &path)
{
- PathScanner scanner;
- vector<string *>* rdf_files;
- vector<string *>::iterator x;
+#ifdef HAVE_LRDF
+ vector<string> rdf_files;
+ vector<string>::iterator x;
- rdf_files = scanner (path, rdf_filter, 0, false, true);
+ find_files_matching_filter (rdf_files, path, rdf_filter, 0, false, true);
- if (rdf_files) {
- for (x = rdf_files->begin(); x != rdf_files->end (); ++x) {
- const string uri(string("file://") + **x);
+ for (x = rdf_files.begin(); x != rdf_files.end (); ++x) {
+ const string uri(string("file://") + *x);
- if (lrdf_read_file(uri.c_str())) {
- warning << "Could not parse rdf file: " << uri << endmsg;
- }
+ if (lrdf_read_file(uri.c_str())) {
+ warning << "Could not parse rdf file: " << uri << endmsg;
}
-
- vector_delete (rdf_files);
}
+#endif
}
int
PluginManager::ladspa_discover (string path)
{
- void *module;
+ DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Checking for LADSPA plugin at %1\n", path));
+
+ Glib::Module module(path);
const LADSPA_Descriptor *descriptor;
LADSPA_Descriptor_Function dfunc;
- const char *errstr;
+ void* func = 0;
- if ((module = dlopen (path.c_str(), RTLD_NOW)) == 0) {
- error << string_compose(_("LADSPA: cannot load module \"%1\" (%2)"), path, dlerror()) << endmsg;
+ if (!module) {
+ error << string_compose(_("LADSPA: cannot load module \"%1\" (%2)"),
+ path, Glib::Module::get_last_error()) << endmsg;
return -1;
}
- dfunc = (LADSPA_Descriptor_Function) dlsym (module, "ladspa_descriptor");
- if ((errstr = dlerror()) != 0) {
+ if (!module.get_symbol("ladspa_descriptor", func)) {
error << string_compose(_("LADSPA: module \"%1\" has no descriptor function."), path) << endmsg;
- error << errstr << endmsg;
- dlclose (module);
+ error << Glib::Module::get_last_error() << endmsg;
return -1;
}
+ dfunc = (LADSPA_Descriptor_Function)func;
+
+ DEBUG_TRACE (DEBUG::PluginManager, string_compose ("LADSPA plugin found at %1\n", path));
+
for (uint32_t i = 0; ; ++i) {
if ((descriptor = dfunc (i)) == 0) {
break;
@@ -437,6 +487,8 @@ PluginManager::ladspa_discover (string path)
if(!found){
_ladspa_plugin_info->push_back (info);
}
+
+ DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Found LADSPA plugin, name: %1, Inputs: %2, Outputs: %3\n", info->name, info->n_inputs, info->n_outputs));
}
// GDB WILL NOT LIKE YOU IF YOU DO THIS
@@ -448,6 +500,7 @@ PluginManager::ladspa_discover (string path)
string
PluginManager::get_ladspa_category (uint32_t plugin_id)
{
+#ifdef HAVE_LRDF
char buf[256];
lrdf_statement pattern;
@@ -505,6 +558,9 @@ PluginManager::get_ladspa_category (uint32_t plugin_id)
} else {
return label;
}
+#else
+ return ("Unknown");
+#endif
}
#ifdef LV2_SUPPORT
@@ -531,7 +587,7 @@ PluginManager::au_refresh ()
#ifdef WINDOWS_VST_SUPPORT
void
-PluginManager::windows_vst_refresh ()
+PluginManager::windows_vst_refresh (bool cache_only)
{
if (_windows_vst_plugin_info) {
_windows_vst_plugin_info->clear ();
@@ -539,25 +595,10 @@ PluginManager::windows_vst_refresh ()
_windows_vst_plugin_info = new ARDOUR::PluginInfoList();
}
- if (windows_vst_path.length() == 0) {
- windows_vst_path = "/usr/local/lib/vst:/usr/lib/vst";
- }
-
- windows_vst_discover_from_path (windows_vst_path);
-}
-
-int
-PluginManager::add_windows_vst_directory (string path)
-{
- if (windows_vst_discover_from_path (path) == 0) {
- windows_vst_path += ':';
- windows_vst_path += path;
- return 0;
- }
- return -1;
+ windows_vst_discover_from_path (Config->get_plugin_path_vst(), cache_only);
}
-static bool windows_vst_filter (const string& str, void *arg)
+static bool windows_vst_filter (const string& str, void * /*arg*/)
{
/* Not a dotfile, has a prefix before a period, suffix is "dll" */
@@ -565,71 +606,95 @@ static bool windows_vst_filter (const string& str, void *arg)
}
int
-PluginManager::windows_vst_discover_from_path (string path)
+PluginManager::windows_vst_discover_from_path (string path, bool cache_only)
{
- PathScanner scanner;
- vector<string *> *plugin_objects;
- vector<string *>::iterator x;
+ vector<string> plugin_objects;
+ vector<string>::iterator x;
int ret = 0;
DEBUG_TRACE (DEBUG::PluginManager, string_compose ("detecting Windows VST plugins along %1\n", path));
- plugin_objects = scanner (windows_vst_path, windows_vst_filter, 0, false, true);
-
- if (plugin_objects) {
- for (x = plugin_objects->begin(); x != plugin_objects->end (); ++x) {
- windows_vst_discover (**x);
- }
+ find_files_matching_filter (plugin_objects, Config->get_plugin_path_vst(), windows_vst_filter, 0, false, true);
- vector_delete (plugin_objects);
+ for (x = plugin_objects.begin(); x != plugin_objects.end (); ++x) {
+ ARDOUR::PluginScanMessage(_("VST"), *x, !cache_only && !cancelled());
+ windows_vst_discover (*x, cache_only || cancelled());
}
return ret;
}
int
-PluginManager::windows_vst_discover (string path)
+PluginManager::windows_vst_discover (string path, bool cache_only)
{
- VSTInfo* finfo;
- char buf[32];
+ DEBUG_TRACE (DEBUG::PluginManager, string_compose ("windows_vst_discover '%1'\n", path));
- if ((finfo = fst_get_info (const_cast<char *> (path.c_str()))) == 0) {
- warning << "Cannot get Windows VST information from " << path << endmsg;
+ _cancel_timeout = false;
+ vector<VSTInfo*> * finfos = vstfx_get_info_fst (const_cast<char *> (path.c_str()),
+ cache_only ? VST_SCAN_CACHE_ONLY : VST_SCAN_USE_APP);
+
+ if (finfos->empty()) {
+ DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Cannot get Windows VST information from '%1'\n", path));
return -1;
}
- if (!finfo->canProcessReplacing) {
- warning << string_compose (_("VST plugin %1 does not support processReplacing, and so cannot be used in %2 at this time"),
- finfo->name, PROGRAM_NAME)
- << endl;
- }
+ uint32_t discovered = 0;
+ for (vector<VSTInfo *>::iterator x = finfos->begin(); x != finfos->end(); ++x) {
+ VSTInfo* finfo = *x;
+ char buf[32];
- PluginInfoPtr info (new WindowsVSTPluginInfo);
+ if (!finfo->canProcessReplacing) {
+ warning << string_compose (_("VST plugin %1 does not support processReplacing, and so cannot be used in %2 at this time"),
+ finfo->name, PROGRAM_NAME)
+ << endl;
+ continue;
+ }
- /* what a joke freeware VST is */
+ PluginInfoPtr info (new WindowsVSTPluginInfo);
- if (!strcasecmp ("The Unnamed plugin", finfo->name)) {
- info->name = PBD::basename_nosuffix (path);
- } else {
- info->name = finfo->name;
- }
+ /* what a joke freeware VST is */
+
+ if (!strcasecmp ("The Unnamed plugin", finfo->name)) {
+ info->name = PBD::basename_nosuffix (path);
+ } else {
+ info->name = finfo->name;
+ }
- snprintf (buf, sizeof (buf), "%d", finfo->UniqueID);
- info->unique_id = buf;
- info->category = "VST";
- info->path = path;
- info->creator = finfo->creator;
- info->index = 0;
- info->n_inputs.set_audio (finfo->numInputs);
- info->n_outputs.set_audio (finfo->numOutputs);
- info->n_inputs.set_midi (finfo->wantMidi ? 1 : 0);
- info->type = ARDOUR::Windows_VST;
+ snprintf (buf, sizeof (buf), "%d", finfo->UniqueID);
+ info->unique_id = buf;
+ info->category = "VST";
+ info->path = path;
+ info->creator = finfo->creator;
+ info->index = 0;
+ info->n_inputs.set_audio (finfo->numInputs);
+ info->n_outputs.set_audio (finfo->numOutputs);
+ info->n_inputs.set_midi ((finfo->wantMidi&1) ? 1 : 0);
+ info->n_outputs.set_midi ((finfo->wantMidi&2) ? 1 : 0);
+ info->type = ARDOUR::Windows_VST;
+
+ // TODO: check dup-IDs (lxvst AND windows vst)
+ bool duplicate = false;
+
+ if (!_windows_vst_plugin_info->empty()) {
+ for (PluginInfoList::iterator i =_windows_vst_plugin_info->begin(); i != _windows_vst_plugin_info->end(); ++i) {
+ if ((info->type == (*i)->type)&&(info->unique_id == (*i)->unique_id)) {
+ warning << "Ignoring duplicate Windows VST plugin " << info->name << "\n";
+ duplicate = true;
+ break;
+ }
+ }
+ }
- _windows_vst_plugin_info->push_back (info);
- fst_free_info (finfo);
+ if (!duplicate) {
+ DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Windows VST plugin ID '%1'\n", info->unique_id));
+ _windows_vst_plugin_info->push_back (info);
+ discovered++;
+ }
+ }
- return 0;
+ vstfx_free_info_list (finfos);
+ return discovered > 0 ? 0 : -1;
}
#endif // WINDOWS_VST_SUPPORT
@@ -637,7 +702,7 @@ PluginManager::windows_vst_discover (string path)
#ifdef LXVST_SUPPORT
void
-PluginManager::lxvst_refresh ()
+PluginManager::lxvst_refresh (bool cache_only)
{
if (_lxvst_plugin_info) {
_lxvst_plugin_info->clear ();
@@ -645,24 +710,7 @@ PluginManager::lxvst_refresh ()
_lxvst_plugin_info = new ARDOUR::PluginInfoList();
}
- if (lxvst_path.length() == 0) {
- lxvst_path = "/usr/local/lib64/lxvst:/usr/local/lib/lxvst:/usr/lib64/lxvst:/usr/lib/lxvst:"
- "/usr/local/lib64/linux_vst:/usr/local/lib/linux_vst:/usr/lib64/linux_vst:/usr/lib/linux_vst:"
- "/usr/lib/vst:/usr/local/lib/vst";
- }
-
- lxvst_discover_from_path (lxvst_path);
-}
-
-int
-PluginManager::add_lxvst_directory (string path)
-{
- if (lxvst_discover_from_path (path) == 0) {
- lxvst_path += ':';
- lxvst_path += path;
- return 0;
- }
- return -1;
+ lxvst_discover_from_path (Config->get_plugin_path_lxvst(), cache_only);
}
static bool lxvst_filter (const string& str, void *)
@@ -673,87 +721,102 @@ static bool lxvst_filter (const string& str, void *)
}
int
-PluginManager::lxvst_discover_from_path (string path)
+PluginManager::lxvst_discover_from_path (string path, bool cache_only)
{
- PathScanner scanner;
- vector<string *> *plugin_objects;
- vector<string *>::iterator x;
+ vector<string> plugin_objects;
+ vector<string>::iterator x;
int ret = 0;
- DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Discovering linuxVST plugins along %1\n", path));
+#ifndef NDEBUG
+ (void) path;
+#endif
- plugin_objects = scanner (lxvst_path, lxvst_filter, 0, false, true);
+ DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Discovering linuxVST plugins along %1\n", path));
- if (plugin_objects) {
- for (x = plugin_objects->begin(); x != plugin_objects->end (); ++x) {
- lxvst_discover (**x);
- }
+ find_files_matching_filter (plugin_objects, Config->get_plugin_path_lxvst(), lxvst_filter, 0, false, true);
- vector_delete (plugin_objects);
+ for (x = plugin_objects.begin(); x != plugin_objects.end (); ++x) {
+ ARDOUR::PluginScanMessage(_("LXVST"), *x, !cache_only && !cancelled());
+ lxvst_discover (*x, cache_only || cancelled());
}
return ret;
}
int
-PluginManager::lxvst_discover (string path)
+PluginManager::lxvst_discover (string path, bool cache_only)
{
- VSTInfo* finfo;
- char buf[32];
-
DEBUG_TRACE (DEBUG::PluginManager, string_compose ("checking apparent LXVST plugin at %1\n", path));
- if ((finfo = vstfx_get_info (const_cast<char *> (path.c_str()))) == 0) {
+ _cancel_timeout = false;
+ vector<VSTInfo*> * finfos = vstfx_get_info_lx (const_cast<char *> (path.c_str()),
+ cache_only ? VST_SCAN_CACHE_ONLY : VST_SCAN_USE_APP);
+
+ if (finfos->empty()) {
+ DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Cannot get Linux VST information from '%1'\n", path));
return -1;
}
- if (!finfo->canProcessReplacing) {
- warning << string_compose (_("linuxVST plugin %1 does not support processReplacing, and so cannot be used in %2 at this time"),
- finfo->name, PROGRAM_NAME)
- << endl;
- }
+ uint32_t discovered = 0;
+ for (vector<VSTInfo *>::iterator x = finfos->begin(); x != finfos->end(); ++x) {
+ VSTInfo* finfo = *x;
+ char buf[32];
- PluginInfoPtr info(new LXVSTPluginInfo);
+ if (!finfo->canProcessReplacing) {
+ warning << string_compose (_("linuxVST plugin %1 does not support processReplacing, and so cannot be used in %2 at this time"),
+ finfo->name, PROGRAM_NAME)
+ << endl;
+ continue;
+ }
- if (!strcasecmp ("The Unnamed plugin", finfo->name)) {
- info->name = PBD::basename_nosuffix (path);
- } else {
- info->name = finfo->name;
- }
-
-
- snprintf (buf, sizeof (buf), "%d", finfo->UniqueID);
- info->unique_id = buf;
- info->category = "linuxVSTs";
- info->path = path;
- info->creator = finfo->creator;
- info->index = 0;
- info->n_inputs.set_audio (finfo->numInputs);
- info->n_outputs.set_audio (finfo->numOutputs);
- info->n_inputs.set_midi (finfo->wantMidi ? 1 : 0);
- info->type = ARDOUR::LXVST;
-
- /* Make sure we don't find the same plugin in more than one place along
- the LXVST_PATH We can't use a simple 'find' because the path is included
- in the PluginInfo, and that is the one thing we can be sure MUST be
- different if a duplicate instance is found. So we just compare the type
- and unique ID (which for some VSTs isn't actually unique...)
- */
-
- if (!_lxvst_plugin_info->empty()) {
- for (PluginInfoList::iterator i =_lxvst_plugin_info->begin(); i != _lxvst_plugin_info->end(); ++i) {
- if ((info->type == (*i)->type)&&(info->unique_id == (*i)->unique_id)) {
- warning << "Ignoring duplicate Linux VST plugin " << info->name << "\n";
- vstfx_free_info(finfo);
- return 0;
+ PluginInfoPtr info(new LXVSTPluginInfo);
+
+ if (!strcasecmp ("The Unnamed plugin", finfo->name)) {
+ info->name = PBD::basename_nosuffix (path);
+ } else {
+ info->name = finfo->name;
+ }
+
+
+ snprintf (buf, sizeof (buf), "%d", finfo->UniqueID);
+ info->unique_id = buf;
+ info->category = "linuxVSTs";
+ info->path = path;
+ info->creator = finfo->creator;
+ info->index = 0;
+ info->n_inputs.set_audio (finfo->numInputs);
+ info->n_outputs.set_audio (finfo->numOutputs);
+ info->n_inputs.set_midi ((finfo->wantMidi&1) ? 1 : 0);
+ info->n_outputs.set_midi ((finfo->wantMidi&2) ? 1 : 0);
+ info->type = ARDOUR::LXVST;
+
+ /* Make sure we don't find the same plugin in more than one place along
+ the LXVST_PATH We can't use a simple 'find' because the path is included
+ in the PluginInfo, and that is the one thing we can be sure MUST be
+ different if a duplicate instance is found. So we just compare the type
+ and unique ID (which for some VSTs isn't actually unique...)
+ */
+
+ // TODO: check dup-IDs with windowsVST, too
+ bool duplicate = false;
+ if (!_lxvst_plugin_info->empty()) {
+ for (PluginInfoList::iterator i =_lxvst_plugin_info->begin(); i != _lxvst_plugin_info->end(); ++i) {
+ if ((info->type == (*i)->type)&&(info->unique_id == (*i)->unique_id)) {
+ warning << "Ignoring duplicate Linux VST plugin " << info->name << "\n";
+ duplicate = true;
+ break;
+ }
}
}
+
+ if (!duplicate) {
+ _lxvst_plugin_info->push_back (info);
+ discovered++;
+ }
}
-
- _lxvst_plugin_info->push_back (info);
- vstfx_free_info (finfo);
- return 0;
+ vstfx_free_info_list (finfos);
+ return discovered > 0 ? 0 : -1;
}
#endif // LXVST_SUPPORT
@@ -929,8 +992,7 @@ ARDOUR::PluginInfoList&
PluginManager::lxvst_plugin_info ()
{
#ifdef LXVST_SUPPORT
- if (!_lxvst_plugin_info)
- lxvst_refresh();
+ assert(_lxvst_plugin_info);
return *_lxvst_plugin_info;
#else
return _empty_plugin_info;
@@ -940,8 +1002,7 @@ PluginManager::lxvst_plugin_info ()
ARDOUR::PluginInfoList&
PluginManager::ladspa_plugin_info ()
{
- if (!_ladspa_plugin_info)
- ladspa_refresh();
+ assert(_ladspa_plugin_info);
return *_ladspa_plugin_info;
}
@@ -949,8 +1010,7 @@ ARDOUR::PluginInfoList&
PluginManager::lv2_plugin_info ()
{
#ifdef LV2_SUPPORT
- if (!_lv2_plugin_info)
- lv2_refresh();
+ assert(_lv2_plugin_info);
return *_lv2_plugin_info;
#else
return _empty_plugin_info;
@@ -961,8 +1021,7 @@ ARDOUR::PluginInfoList&
PluginManager::au_plugin_info ()
{
#ifdef AUDIOUNIT_SUPPORT
- if (!_au_plugin_info)
- au_refresh();
+ assert(_au_plugin_info);
return *_au_plugin_info;
#else
return _empty_plugin_info;
diff --git a/libs/ardour/po/cs.po b/libs/ardour/po/cs.po
index 9554921194..31203f8a92 100644
--- a/libs/ardour/po/cs.po
+++ b/libs/ardour/po/cs.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-11-05 11:11-0500\n"
+"POT-Creation-Date: 2014-02-10 17:53+0100\n"
"PO-Revision-Date: 2013-06-13 22:47+0200\n"
"Last-Translator: Pavel Fric <pavelfric@seznam.cz>\n"
"Language-Team: Czech <kde-i18n-doc@kde.org>\n"
@@ -21,73 +21,73 @@ msgstr ""
msgid "Fader"
msgstr "ProlínaÄ"
-#: audio_diskstream.cc:244
+#: audio_diskstream.cc:242
msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
msgstr "AudioDiskstream: Seznam skladeb \"%1\" není seznamem zvukových skladeb"
-#: audio_diskstream.cc:296
+#: audio_diskstream.cc:294
msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
"AudioDiskstream %1: není žádný seznam skladeb, který by bylo lze kopírovat!"
-#: audio_diskstream.cc:848 audio_diskstream.cc:858
+#: audio_diskstream.cc:846 audio_diskstream.cc:856
msgid ""
"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
msgstr ""
"AudioDiskstream %1: PÅ™i doplňování nelze Äíst %2 ze seznamu skladeb u snímku "
"%3"
-#: audio_diskstream.cc:1014
+#: audio_diskstream.cc:1012
msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr "AudioDiskstream %1: Nelze Äíst %2 ze seznamu skladeb u snímku %3"
-#: audio_diskstream.cc:1383 audio_diskstream.cc:1400
+#: audio_diskstream.cc:1381 audio_diskstream.cc:1398
msgid "AudioDiskstream %1: cannot write to disk"
msgstr "AudioDiskstream %1: Nelze zapisovat na disk"
-#: audio_diskstream.cc:1443
+#: audio_diskstream.cc:1441
msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
msgstr "AudioDiskstream %1: Zachycená data nelze zapisovat na disk!"
-#: audio_diskstream.cc:1537
+#: audio_diskstream.cc:1535
msgid "%1: could not create region for complete audio file"
msgstr "%1: Nepodařilo se vytvořit oblast pro úplný zvukový soubor"
-#: audio_diskstream.cc:1571
+#: audio_diskstream.cc:1569
msgid "AudioDiskstream: could not create region for captured audio!"
msgstr ""
"AudioDiskstream: Nepodařilo se vytvořit oblast pro zaznamenaný zvukový "
"materiál!"
-#: audio_diskstream.cc:1679
+#: audio_diskstream.cc:1677
msgid "programmer error: %1"
msgstr "Chyba v programování: %1"
-#: audio_diskstream.cc:1905
+#: audio_diskstream.cc:1903
msgid "AudioDiskstream: channel %1 out of range"
msgstr "AudioDiskstream: Kanál %1 pÅ™ekroÄení rozsahu"
-#: audio_diskstream.cc:1919 midi_diskstream.cc:1210
+#: audio_diskstream.cc:1917 midi_diskstream.cc:1209
msgid "%1:%2 new capture file not initialized correctly"
msgstr "%1:%2 nový záznamový soubor neinicializován správně"
-#: audio_diskstream.cc:2200
+#: audio_diskstream.cc:2198
msgid "%1: cannot restore pending capture source file %2"
msgstr "%1: Nelze obnovit předběžný záznamový zdrojový soubor %2"
-#: audio_diskstream.cc:2222
+#: audio_diskstream.cc:2220
msgid "%1: incorrect number of pending sources listed - ignoring them all"
msgstr ""
"%1: Seznam obsahuje nesprávný poÄet pÅ™edběžných zdrojů - vÅ¡echny jsou "
"přehlíženy"
-#: audio_diskstream.cc:2246
+#: audio_diskstream.cc:2244
msgid "%1: cannot create whole-file region from pending capture sources"
msgstr ""
"%1: Z předběžných záznamových zdrojů nelze vytvořit žádnou oblast pro úplný "
"soubor"
-#: audio_library.cc:71
+#: audio_library.cc:81
msgid "Could not open %1. Audio Library not saved"
msgstr "Nepodařilo se otevřít %1. Zvuková knihovna nebyla uložena"
@@ -131,11 +131,11 @@ msgstr "Špatně utvořený XML v zavedeném seznamu skladeb"
msgid "Audio Playlists (unused)"
msgstr "Seznamy zvukových skladeb (nepoužívané)"
-#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529
+#: audio_playlist_source.cc:171 audiosource.cc:891 file_source.cc:520
#: midi_playlist_source.cc:144 midi_playlist_source.cc:152
-#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643
-#: rb_effect.cc:333 session.cc:2619 session.cc:2652 session.cc:3797
-#: session_handle.cc:87 sndfilesource.cc:121
+#: midi_playlist_source.cc:159 midi_source.cc:370 plugin_insert.cc:634
+#: rb_effect.cc:333 session.cc:2636 session.cc:2669 session.cc:3814
+#: session_handle.cc:87 sndfilesource.cc:122
msgid "programming error: %1"
msgstr "Chyba v programování: %1"
@@ -163,23 +163,23 @@ msgstr ""
"\n"
"Kanály: "
-#: audio_track.cc:167
+#: audio_track.cc:161
msgid "Unknown bundle \"%1\" listed for input of %2"
msgstr "Neznámý kabel \"%1\" uvedený pro vstup %2"
-#: audio_track.cc:169
+#: audio_track.cc:163
msgid "in 1"
msgstr "in 1"
-#: audio_track.cc:170
+#: audio_track.cc:164
msgid "No input bundles available as a replacement"
msgstr "Nejsou žádné vhodné vstupní kabely jako náhrada"
-#: audio_track.cc:174
+#: audio_track.cc:168
msgid "Bundle %1 was not available - \"in 1\" used instead"
msgstr "Kabel %1 nebyl dostupný - místo něj se používá \"in 1\""
-#: audio_track.cc:183
+#: audio_track.cc:177
msgid "improper input channel list in XML node (%1)"
msgstr "Uzel XML (%1) obsahuje nevhodný seznam vstupních kanálů"
@@ -203,23 +203,23 @@ msgstr "Nelze nahrát přídavný modul VAMP \"%1\""
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr "Přídavný modul VAMP \"%1\" se nepodařilo nahrát"
-#: audioengine.cc:488
+#: audioengine.cc:495
msgid "looking for backends in %1\n"
msgstr ""
-#: audioengine.cc:511
+#: audioengine.cc:518
msgid "AudioEngine: cannot load module \"%1\" (%2)"
msgstr ""
-#: audioengine.cc:517
+#: audioengine.cc:524
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr ""
-#: audioengine.cc:589
+#: audioengine.cc:596
msgid "Could not create backend for %1: %2"
msgstr ""
-#: audioregion.cc:1643
+#: audioregion.cc:1651
msgid ""
"You have requested an operation that requires audio analysis.\n"
"\n"
@@ -244,11 +244,11 @@ msgstr ""
"Tento dialog se znovu nezobrazí. Ale můžete si při této a budoucích "
"operacích s urÄením pÅ™echodných dat vÅ¡imnout lehkého zpoždÄ›ní.\n"
-#: audiosource.cc:199
+#: audiosource.cc:210
msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
msgstr "Nelze přejmenovat vrcholový soubor pro %1 z %2 na %3 (%4)"
-#: audiosource.cc:226
+#: audiosource.cc:239
msgid "AudioSource: cannot stat peakfile \"%1\""
msgstr "AudioSource: Vrcholový soubor \"%1\" není zjevný"
@@ -256,49 +256,70 @@ msgstr "AudioSource: Vrcholový soubor \"%1\" není zjevný"
msgid "cannot read sample data for unscaled peak computation"
msgstr "Nelze pÅ™eÄíst vzorkovací data neÅ¡kálovaný výpoÄet vrcholů"
-#: audiosource.cc:387
+#: audiosource.cc:386
msgid "AudioSource: cannot open peakpath (a) \"%1\" (%2)"
msgstr "AudioSource: Nelze otevřít cestu pro vrcholy (a) \"%1\" (%2)"
-#: audiosource.cc:463
+#: audiosource.cc:395 audiosource.cc:473
+msgid ""
+"AudioSource: could not seek to correct location in peak file \"%1\" (%2)"
+msgstr ""
+
+#: audiosource.cc:453
msgid "AudioSource: cannot open peakpath (b) \"%1\" (%2)"
msgstr "AudioSource: Nelze otevřít cestu pro vrcholy (b) \"%1\" (%2)"
-#: audiosource.cc:587
+#: audiosource.cc:567
msgid ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
msgstr ""
"AudioSource[%1]: Ätení vrcholu - Nelze pÅ™eÄíst %2 vzorky pÅ™i posunu %3 %4(%5)"
-#: audiosource.cc:667
+#: audiosource.cc:634
msgid "%1: could not write read raw data for peak computation (%2)"
msgstr ""
"%1: NepodaÅ™ilo se pÅ™eÄíst/zapsat nezpracovaná data pro výpoÄet vrcholů (%2)"
-#: audiosource.cc:706
+#: audiosource.cc:672
msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
msgstr "AudioSource: Nelze otevřít cestu pro vrcholy (c) \"%1\" (%2)"
-#: audiosource.cc:773 audiosource.cc:886
+#: audiosource.cc:739 audiosource.cc:861
+msgid "%1: could not seek in peak file data (%2)"
+msgstr ""
+
+#: audiosource.cc:744 audiosource.cc:870
msgid "%1: could not write peak file data (%2)"
msgstr "%1: Nepodařilo se zapsat vrcholová data do souboru (%2)"
-#: audiosource.cc:924
+#: audiosource.cc:903
msgid "could not truncate peakfile %1 to %2 (error: %3)"
msgstr "Nepodařilo se zkrátit vrcholový soubor %1 na %2 (Chyba: %3)"
-#: auditioner.cc:87
+#: auditioner.cc:95
+msgid "Falling back to Reasonable Synth for Midi Audition"
+msgstr ""
+
+#: auditioner.cc:97
+msgid "No synth for midi-audition found."
+msgstr ""
+
+#: auditioner.cc:152
msgid "no outputs available for auditioner - manual connection required"
msgstr "Pro poslech nejsou dostupné žádné výstupy - požadováno ruÄní pÅ™ipojení"
-#: auditioner.cc:135
-msgid "Auditioning of non-audio regions not yet supported"
-msgstr "Poslech nezvukových oblastí ještě není podporován"
-
-#: auditioner.cc:160
+#: auditioner.cc:392 auditioner.cc:438
msgid "Cannot setup auditioner processing flow for %1 channels"
msgstr "Nelze nastavit signálový tok poslechu pro %1 kanály"
+#: auditioner.cc:426
+msgid "Failed to load synth for MIDI-Audition."
+msgstr ""
+
+#: auditioner.cc:445
+msgid "Auditioning of regions other than Audio or Midi is not supported."
+msgstr ""
+
#: automatable.cc:81
msgid "Automation node has no path property"
msgstr "Uzel automatizace nemá žádnou vlastnost \"cesta\""
@@ -337,24 +358,24 @@ msgstr ""
"Seznam automatizace: Uzel XML s názvem %1, nepředán \"AutomationList\" - "
"přehlíží se"
-#: butler.cc:91
+#: butler.cc:80
msgid "Cannot create transport request signal pipe (%1)"
msgstr ""
"Nelze vytvořit vedení signálu pro požadavky na přehrávání (transport) (%1)"
-#: butler.cc:97 butler.cc:103
+#: butler.cc:86 butler.cc:92
msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)"
msgstr "UI: Nelze nastavit O_NONBLOCK pro vedení požadavku sluhy (%1)"
-#: butler.cc:109
+#: butler.cc:124
msgid "Session: could not create butler thread"
msgstr "Sezení: Nepodařilo se vytvořit vlákno sluhy"
-#: butler.cc:156
+#: butler.cc:165
msgid "poll on butler request pipe failed (%1)"
msgstr "průzkum na vedení požadavku sluhy se nezdařil (%1)"
-#: butler.cc:163
+#: butler.cc:172
msgid "Error on butler thread request pipe: fd=%1 err=%2"
msgstr "Chyba ve vedení požadavku vlákna sluhy: fd=%1 err=%2"
@@ -362,55 +383,55 @@ msgstr "Chyba ve vedení požadavku vlákna sluhy: fd=%1 err=%2"
msgid "Error reading from butler request pipe"
msgstr "Chyba pÅ™i Ätení vedení požadavku sluhy"
-#: butler.cc:248
+#: butler.cc:301
msgid "Butler read ahead failure on dstream %1"
msgstr "Chyba pÅ™i Ätení sluhy u dstream %1"
-#: butler.cc:285
+#: butler.cc:338
msgid "Butler write-behind failure on dstream %1"
msgstr "Chyba při zápisu sluhy u dstream %1"
-#: control_protocol_manager.cc:134
+#: control_protocol_manager.cc:164
msgid "control protocol name \"%1\" has no descriptor"
msgstr "Název kontrolního protokolu \"%1\" nemá žádný popis"
-#: control_protocol_manager.cc:141
+#: control_protocol_manager.cc:171
msgid "control protocol name \"%1\" could not be initialized"
msgstr "Kontrolní protokol \"%1\" se nepodařilo inicializovat"
-#: control_protocol_manager.cc:201
+#: control_protocol_manager.cc:237
msgid "Instantiating mandatory control protocol %1"
msgstr "Doložení povinného kontrolního protokolu %1"
-#: control_protocol_manager.cc:222
+#: control_protocol_manager.cc:258
msgid "looking for control protocols in %1\n"
msgstr "Hledání kontrolního protokolu v %1\n"
-#: control_protocol_manager.cc:247
+#: control_protocol_manager.cc:283
msgid "Control protocol %1 not usable"
msgstr "Kontrolní protokol %1 nepoužitelný"
-#: control_protocol_manager.cc:264
+#: control_protocol_manager.cc:300
msgid "Control surface protocol discovered: \"%1\"\n"
msgstr "Protokol pro kontrolní povrch odkryt: \"%1\"\n"
-#: control_protocol_manager.cc:282
+#: control_protocol_manager.cc:318
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
msgstr "ControlProtocolManager: Nelze nahrát modul \"%1\" (%2)"
-#: control_protocol_manager.cc:290
+#: control_protocol_manager.cc:324
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr "ControlProtocolManager: Modul \"%1\" nemá žádnou funkci k popisu"
-#: cycle_timer.cc:38
+#: cycle_timer.cc:40
msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
msgstr "CycleTimer::get_mhz(): Nelze otevřít /proc/cpuinfo"
-#: cycle_timer.cc:50
+#: cycle_timer.cc:52
msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo"
msgstr "CycleTimer::get_mhz(): Nelze nalézt takt CPU (MHz) v /proc/cpuinfo"
-#: cycle_timer.cc:73
+#: cycle_timer.cc:75
msgid "cannot locate cpu MHz in /proc/cpuinfo"
msgstr "Nelze nalézt takt CPU (MHz) v /proc/cpuinfo"
@@ -418,7 +439,7 @@ msgstr "Nelze nalézt takt CPU (MHz) v /proc/cpuinfo"
msgid "audio"
msgstr "Zvuk"
-#: data_type.cc:28 session.cc:1791 session.cc:1794
+#: data_type.cc:28 session.cc:1808 session.cc:1811
msgid "MIDI"
msgstr "MIDI"
@@ -426,15 +447,15 @@ msgstr "MIDI"
msgid "unknown"
msgstr "Neznámý"
-#: delivery.cc:114
+#: delivery.cc:118
msgid "main outs"
msgstr "Hlavní výstupy"
-#: delivery.cc:117 send.cc:61
+#: delivery.cc:121 send.cc:62
msgid "listen"
msgstr "Poslech"
-#: diskstream.cc:303
+#: diskstream.cc:302
msgid "Location \"%1\" not valid for track loop (start >= end)"
msgstr "ÄŒasový bod \"%1\" pro smyÄku stopy neplatný (ZaÄátek >= Konec)"
@@ -448,24 +469,24 @@ msgstr ""
msgid "Export failed: %1"
msgstr "Vyvedení se nezdařilo: %1"
-#: export_filename.cc:118
+#: export_filename.cc:119
msgid "Existing export folder for this session (%1) does not exist - ignored"
msgstr ""
"Stávající složka pro vyvedení pro toto sezení (%1) neexistuje - přehlíží se"
-#: export_filename.cc:229
+#: export_filename.cc:230
msgid "No Time"
msgstr "Žádný Äas"
-#: export_filename.cc:238
+#: export_filename.cc:239
msgid "Invalid time format"
msgstr "Neplatný Äasový formát"
-#: export_filename.cc:247
+#: export_filename.cc:248
msgid "No Date"
msgstr "Žádné datum"
-#: export_filename.cc:262
+#: export_filename.cc:263
msgid "Invalid date format"
msgstr "Neplatný formát data"
@@ -533,7 +554,7 @@ msgstr "Trojúhelníkový"
msgid "Rectangular"
msgstr "Obdélníkový"
-#: export_formats.cc:52 session.cc:5014 session.cc:5030
+#: export_formats.cc:52 session.cc:5006 session.cc:5022
msgid "None"
msgstr "Žádný"
@@ -573,15 +594,15 @@ msgstr "Vzorkovací formát Vorbis"
msgid "No sample format"
msgstr "Žádný vzorkovací formát"
-#: export_handler.cc:335
+#: export_handler.cc:343
msgid "Editor: cannot open \"%1\" as export file for CD marker file"
msgstr "Editor: Nelze otevřít \"%1\" jako soubor vyvedení pro znaÄku CD"
-#: export_handler.cc:417 export_handler.cc:420
+#: export_handler.cc:425 export_handler.cc:428
msgid "an error occured while writing a TOC/CUE file: %1"
msgstr "Při zápisu souboru TOC/CUE se vyskytla chyba:%1"
-#: export_handler.cc:642 export_handler.cc:700
+#: export_handler.cc:650 export_handler.cc:708
msgid "Cannot convert %1 to Latin-1 text"
msgstr "Nelze převést %1 na kódování Latin-1"
@@ -644,7 +665,7 @@ msgid ""
msgstr ""
"% podporuje jen %2 kanály, ale ve vašem nastavení kanálů se nachází %3 kanál"
-#: file_source.cc:198 session_state.cc:2807
+#: file_source.cc:198 session_state.cc:2843
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr "Je již 1000 souborů s názvem, jako je %1; verzování skonÄeno"
@@ -653,31 +674,29 @@ msgstr "Je již 1000 souborů s názvem, jako je %1; verzování skonÄeno"
msgid "cannot rename file source from %1 to %2 (%3)"
msgstr "Nelze přejmenovat zdroj souboru z %1 na %2 (%3)"
-#: file_source.cc:250 file_source.cc:378
+#: file_source.cc:248 file_source.cc:372
msgid "FileSource: search path not set"
msgstr "Zdroj souboru: Cesta hledání nenastavena"
-#: file_source.cc:313 file_source.cc:448
-msgid "Filesource: cannot find required file (%1): while searching %2"
-msgstr "Zdroj souboru: Nelze najít požadovaný soubor (%1) při prohledávání %2"
+#: file_source.cc:309 file_source.cc:439
+msgid "Filesource: cannot find required file (%1)"
+msgstr ""
-#: file_source.cc:440
+#: file_source.cc:432
msgid ""
-"FileSource: \"%1\" is ambigous when searching %2\n"
+"FileSource: \"%1\" is ambigous when searching\n"
"\t"
msgstr ""
-"Zdroj souboru: \"%1\" je pÅ™i prohledávání %2 nejednoznaÄný\n"
-"\t"
-#: file_source.cc:494
+#: file_source.cc:484
msgid "Filesource: cannot find required file (%1): %2"
msgstr "Zdroj souboru: Nelze najít požadovaný soubor (%1): %2"
-#: file_source.cc:501
+#: file_source.cc:492
msgid "Filesource: cannot check for existing file (%1): %2"
msgstr "Zdroj souboru: U souboru (%1) nelze ověřit, zda existuje: %2"
-#: file_source.cc:535
+#: file_source.cc:526
msgid ""
"Programming error! %1 tried to rename a file over another file! It's safe to "
"continue working, but please report this to the developers."
@@ -686,7 +705,7 @@ msgstr ""
"existujícím názvem! Můžete bezpeÄnÄ› pracovat dál, ale nahlaÅ¡te to, prosím, "
"vývojářům."
-#: file_source.cc:540
+#: file_source.cc:531
msgid "cannot rename file %1 to %2 (%3)"
msgstr "Nelze přejmenovat soubor %1 na %2 (%3)"
@@ -702,15 +721,15 @@ msgstr ""
"Adresář pro nastavení %1 již existuje, není ale žádný adresář/složka - nelze "
"spustit"
-#: filesystem_paths.cc:91
+#: filesystem_paths.cc:96
msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
msgstr "PromÄ›nná prostÅ™edí ARDOUR_DLL_PATH není nastavena - ukonÄuje se\n"
-#: filesystem_paths.cc:107
+#: filesystem_paths.cc:125
msgid "ARDOUR_CONFIG_PATH not set in environment - exiting\n"
msgstr "PromÄ›nná prostÅ™edí ARDOUR_CONFIG_PATH není nastavena - ukonÄuje se\n"
-#: filesystem_paths.cc:127
+#: filesystem_paths.cc:148
msgid "ARDOUR_DATA_PATH not set in environment - exiting\n"
msgstr "PromÄ›nná prostÅ™edí ARDOUR_DATA_PATH není nastavena - ukonÄuje se\n"
@@ -722,89 +741,85 @@ msgstr "Filtr: Chyba při vytváření názvu pro nový soubor z %1"
msgid "filter: error creating new file %1 (%2)"
msgstr "Filtr: Chyba při vytváření nového souboru %1 (%2)"
-#: find_session.cc:51
-msgid "Could not resolve path: %1 (%2)"
-msgstr "Nepodařilo se vyřešit cestu: %1 (%2)"
-
-#: find_session.cc:63
+#: find_session.cc:59
msgid "cannot check session path %1 (%2)"
msgstr "Nelze ověřit cestu sezení %1 (%2)"
-#: find_session.cc:89
+#: find_session.cc:85
msgid "cannot check statefile %1 (%2)"
msgstr "Nelze ověřit soubor sezení %1 (%2)"
-#: find_session.cc:125
+#: find_session.cc:121
msgid "%1 is not a snapshot file"
msgstr "%1 není souborem se snímkem"
-#: find_session.cc:142
+#: find_session.cc:138
msgid "cannot determine current working directory (%1)"
msgstr "Nelze urÄit nynÄ›jší pracovní adresář (%1)"
-#: find_session.cc:159
+#: find_session.cc:155
msgid "unknown file type for session %1"
msgstr "Neznámý typ souboru pro sezení %1"
-#: globals.cc:207
+#: globals.cc:216
msgid "Could not set system open files limit to \"unlimited\""
msgstr ""
"Nepodařilo se nastavit systémové omezení pro otevřené soubory na \"neomezeno"
"\""
-#: globals.cc:209
+#: globals.cc:218
msgid "Could not set system open files limit to %1"
msgstr "Nepodařilo se nastavit systémové omezení pro otevřené soubory na %1"
-#: globals.cc:213
+#: globals.cc:222
msgid "Your system is configured to limit %1 to only %2 open files"
msgstr "Vaše systémové nastavení omezuje %1 na jen %2 otevřené soubory"
-#: globals.cc:217
+#: globals.cc:226
msgid "Could not get system open files limit (%1)"
msgstr "Nepodařilo se dostat systémové omezení pro otevřené soubory (%1)"
-#: globals.cc:268
+#: globals.cc:280
msgid "Loading configuration"
msgstr "Nahrává se nastavení"
-#: import.cc:207
+#: import.cc:208
msgid "Could not find a source for %1 even though we are updating this file!"
msgstr "Nepodařilo se najít zdroj pro %1, i když se tento soubor aktualizuje!"
-#: import.cc:236
+#: import.cc:237
msgid "Unable to create file %1 during import"
msgstr "Soubor %1 nelze během zavádění vytvořit"
-#: import.cc:262
+#: import.cc:263
msgid "Resampling %1 from %2kHz to %3kHz"
msgstr "Převzorkování %1 z %2 kHz na %3 kHz"
-#: import.cc:268
+#: import.cc:269
msgid "Copying %1"
msgstr "Kopíruje se %1"
-#: import.cc:446
+#: import.cc:455
msgid "Track %1 of %2 contained no usable MIDI data"
msgstr "Stopa %1 z %2 neobsahovala žádná užiteÄná data MIDI"
-#: import.cc:453
+#: import.cc:462
msgid "MIDI file %1 was not readable (no reason available)"
msgstr "Soubor MIDI %1 nebyl Äitelný (žádná příÄina se nedá urÄit)"
-#: import.cc:499
+#: import.cc:508
msgid "Import: cannot open input sound file \"%1\""
msgstr "Zavedení: Nelze otevřít vstupní zvukový soubor \"%1\""
-#: import.cc:510
+#: import.cc:519
msgid "Import: error opening MIDI file"
msgstr "Zavedení: Chyba při otevírání souboru MIDI"
-#: import.cc:549
+#: import.cc:558
msgid "Loading MIDI file %1"
msgstr "Nahrává se soubor MIDI %1"
-#: import.cc:614
+#: import.cc:623
msgid "Failed to remove some files after failed/cancelled import operation"
msgstr ""
"Nepodařilo se odstranit některé soubory po nezdařeném/přerušeném zavedení"
@@ -817,120 +832,124 @@ msgstr "Neznámý"
msgid "preset %1 (bank %2)"
msgstr "Přednastavení %1 (banka %2)"
-#: internal_send.cc:278 internal_send.cc:279
+#: internal_send.cc:300 internal_send.cc:301
msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
msgstr "%1 - Nelze najít stopu/sběrnici s ID %2 ke spojení s"
-#: io.cc:208
+#: io.cc:209
msgid "IO: cannot disconnect port %1 from %2"
msgstr "IO: Přípojku %1 nelze oddělit od %2"
-#: io.cc:343 io.cc:428
+#: io.cc:344 io.cc:431
msgid "IO: cannot register input port %1"
msgstr "IO: Nelze zapsat vstupní přípojku %1"
-#: io.cc:348 io.cc:433
+#: io.cc:349 io.cc:436
msgid "IO: cannot register output port %1"
msgstr "IO: Nelze zapsat výstupní přípojku %1"
-#: io.cc:591 io.cc:647
+#: io.cc:598 io.cc:654
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr "Nesprávný uzel XML \"%1\" odevzdán objektu IO"
-#: io.cc:706
+#: io.cc:713
msgid "in"
msgstr "vst"
-#: io.cc:706
+#: io.cc:713
msgid "out"
msgstr "výst"
-#: io.cc:707
+#: io.cc:714
msgid "input"
msgstr "Vstup"
-#: io.cc:707
+#: io.cc:714
msgid "output"
msgstr "Výstup"
-#: io.cc:717
+#: io.cc:724
msgid "Unknown bundle \"%1\" listed for %2 of %3"
msgstr "Neznámý kabel \"%1\"uvedený pro %2 %3"
-#: io.cc:783
+#: io.cc:790
msgid "Bundle %1 was not available - \"%2\" used instead"
msgstr "Kabel %1 nebyl dostupný - místo něj se používá \"%2\" "
-#: io.cc:786
+#: io.cc:793
msgid "No %1 bundles available as a replacement"
msgstr "Žádné %1 kabely dostupné jako náhrada"
-#: io.cc:889
+#: io.cc:896
msgid "%1: cannot create I/O ports"
msgstr "%1: Nelze vytvořit přípojky vstup/výstup"
-#: io.cc:1017 io.cc:1121
+#: io.cc:1024 io.cc:1128
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr "IO: Špatně utvořený řetězec v uzlu XML pro vstupy \"%1\""
-#: io.cc:1022 io.cc:1126
+#: io.cc:1029 io.cc:1133
msgid "bad input string in XML node \"%1\""
msgstr "IO: Špatný řetězec pro vstup v uzlu XML \"%1\""
-#: io.cc:1060
+#: io.cc:1067
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr "IO: Špatně utvořený řetězec v uzlu XML pro výstupy \"%1\""
-#: io.cc:1065
+#: io.cc:1072
msgid "IO: bad output string in XML node \"%1\""
msgstr "IO: Špatný řetězec pro výstup v uzlu XML \"%1\""
-#: io.cc:1411
+#: io.cc:1417
#, c-format
msgid "%s %u"
msgstr "%s %u"
-#: io.cc:1458
+#: io.cc:1464
#, c-format
msgid "%s in"
msgstr "%s vstup"
-#: io.cc:1460
+#: io.cc:1466
#, c-format
msgid "%s out"
msgstr "%s výstup"
-#: io.cc:1535 session.cc:686 session.cc:715
+#: io.cc:1541 session.cc:689 session.cc:718
msgid "mono"
msgstr "Mono"
-#: io.cc:1537 session.cc:699 session.cc:729
+#: io.cc:1543 session.cc:702 session.cc:732
msgid "L"
msgstr "L"
-#: io.cc:1537 session.cc:701 session.cc:731
+#: io.cc:1543 session.cc:704 session.cc:734
msgid "R"
msgstr "P"
-#: io.cc:1539 io.cc:1545
+#: io.cc:1545 io.cc:1551
#, c-format
msgid "%d"
msgstr "%d"
-#: ladspa_plugin.cc:86
+#: ladspa_plugin.cc:93
+msgid "LADSPA: Unable to open module: "
+msgstr ""
+
+#: ladspa_plugin.cc:99
msgid "LADSPA: module has no descriptor function."
msgstr "LADSPA: Modul nemá žádnou funkci popisu"
-#: ladspa_plugin.cc:91
+#: ladspa_plugin.cc:106
msgid "LADSPA: plugin has gone away since discovery!"
msgstr "LADSPA: Přídavný modul už není více nalezitelný!"
-#: ladspa_plugin.cc:98
+#: ladspa_plugin.cc:113
msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
msgstr ""
"LADSPA: \"%1\" nemůže být použit, neboť nedělá žádný \"inplace processing\""
-#: ladspa_plugin.cc:297
+#: ladspa_plugin.cc:311
msgid ""
"illegal parameter number used with plugin \"%1\". This may indicate a change "
"in the plugin design, and presets may be invalid"
@@ -938,35 +957,31 @@ msgstr ""
"Å patné Äíslo parametru pro přídavný modul \"%1\". To může znaÄit zmÄ›nu v "
"návrhupřídavného modulu, a přednastavení jsou případně neplatná"
-#: ladspa_plugin.cc:376 ladspa_plugin.cc:426
+#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr "Špatný uzel poslán LadspaPlugin::set_state"
-#: ladspa_plugin.cc:391 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
msgid "LADSPA: no ladspa port number"
msgstr "LADSPA: Žádné Äíslo přípojky LADSPA"
-#: ladspa_plugin.cc:397 ladspa_plugin.cc:446
+#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
msgid "LADSPA: no ladspa port data"
msgstr "LADSPA: Žádná data přípojky LADSPA"
-#: ladspa_plugin.cc:717
-msgid "LADSPA: cannot load module from \"%1\""
-msgstr "LADSPA: Nelze nahrát modul z \"%1\""
-
-#: ladspa_plugin.cc:827
+#: ladspa_plugin.cc:840
msgid "Could not locate HOME. Preset not removed."
msgstr "Nepodařilo se najít HOME. Přednastavení neodstraněno."
-#: ladspa_plugin.cc:864 ladspa_plugin.cc:870
+#: ladspa_plugin.cc:879 ladspa_plugin.cc:885
msgid "Could not create %1. Preset not saved. (%2)"
msgstr "Nepodařilo se vytvořit %1. Přednastavení neuloženo. (%2)"
-#: ladspa_plugin.cc:877
+#: ladspa_plugin.cc:892
msgid "Error saving presets file %1."
msgstr "Chyba při ukládání souboru s přednastavením %1."
-#: ladspa_plugin.cc:915
+#: ladspa_plugin.cc:934
msgid "Could not locate HOME. Preset not saved."
msgstr "Nepodařilo se najít HOME. Přednastavení neuloženo."
@@ -1006,7 +1021,7 @@ msgstr "Locations: Pokus o použití neznámé polohy jako vybrané polohy"
msgid "incorrect XML mode passed to Locations::set_state"
msgstr "Nesprávný uzel XML předán dál Locations::set_state"
-#: location.cc:842 session.cc:4516 session_state.cc:1031
+#: location.cc:842 session.cc:4533 session_state.cc:1025
msgid "session"
msgstr "Sezení"
@@ -1071,42 +1086,41 @@ msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
msgstr "Rychlost snímkování sezení a LTC se liší: LTC: %1 Sezení: %2."
#: ltc_slave.cc:591
-#, c-format
msgid "flywheel"
msgstr "SetrvaÄník"
-#: midi_diskstream.cc:167
+#: midi_diskstream.cc:166
msgid ""
"%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
msgstr ""
"%1: ZmÄ›na nastavení vstupu/výstupu %4 použije %2, ale poÄet kanálů je %3"
-#: midi_diskstream.cc:219
+#: midi_diskstream.cc:218
msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
msgstr "MidiDiskstream: Seznam skladeb \"%1\" není seznamem skladeb MIDI"
-#: midi_diskstream.cc:270
+#: midi_diskstream.cc:269
msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
"MidiDiskstream %1: není žádný seznam skladeb, který by bylo lze kopírovat!"
-#: midi_diskstream.cc:699
+#: midi_diskstream.cc:698
msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr "MidiDiskstream %1: Nelze Äíst %2 ze seznamu skladeb u snímku %3"
-#: midi_diskstream.cc:834
+#: midi_diskstream.cc:833
msgid "MidiDiskstream %1: cannot write to disk"
msgstr "MidiDiskstream %1: Nelze zapisovat na disk"
-#: midi_diskstream.cc:868
+#: midi_diskstream.cc:867
msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
msgstr "MidiDiskstream %1: Zachycená data nelze zapisovat na disk!"
-#: midi_diskstream.cc:955
+#: midi_diskstream.cc:954
msgid "%1: could not create region for complete midi file"
msgstr "%1: Nepodařilo se vytvořit oblast pro úplný soubor MIDI"
-#: midi_diskstream.cc:992
+#: midi_diskstream.cc:991
msgid "MidiDiskstream: could not create region for captured midi!"
msgstr ""
"MidiDiskstream: Nepodařilo se vytvořit oblast pro zaznamenaný materiál MIDI!"
@@ -1119,27 +1133,27 @@ msgstr "Nenalezeno žádné NoteID pro změnu vlastnosti \"note\" - přehlíží
msgid "No SysExID found for sys-ex property change - ignored"
msgstr "Nenalezeno žádné SysExID pro změnu vlastnosti \"sys-ex\" - přehlíží se"
-#: midi_model.cc:2010
+#: midi_model.cc:2012
msgid "transpose"
msgstr "Převést"
-#: midi_patch_manager.cc:126
+#: midi_patch_manager.cc:127
msgid "Duplicate MIDI device `%1' in `%2' ignored"
msgstr "Zdvojení zařízení MIDI `%1' v `%2' se přehlíží"
-#: midi_source.cc:125
+#: midi_source.cc:124
msgid "Missing parameter property on InterpolationStyle"
msgstr "Chybějící vlastnost \"parameter\" u InterpolationStyle"
-#: midi_source.cc:132
+#: midi_source.cc:131
msgid "Missing style property on InterpolationStyle"
msgstr "Chybějící vlastnost \"style\" u InterpolationStyle"
-#: midi_source.cc:144
+#: midi_source.cc:143
msgid "Missing parameter property on AutomationState"
msgstr "Chybějící vlastnost \"parameter\" u AutomationState"
-#: midi_source.cc:151
+#: midi_source.cc:150
msgid "Missing state property on AutomationState"
msgstr "Chybějící vlastnost \"state\" u AutomationState"
@@ -1183,11 +1197,11 @@ msgstr "Ovládání polarity"
msgid "solo control"
msgstr "Ovládání sóla"
-#: mtc_slave.cc:238
+#: mtc_slave.cc:240
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr "MTC Slave: Chyba pÅ™i atomickém Ätení nynÄ›jšího Äasu, spánek!"
-#: mtc_slave.cc:361
+#: mtc_slave.cc:362
msgid ""
"Unknown rate/drop value %1 in incoming MTC stream, session values used "
"instead"
@@ -1195,11 +1209,11 @@ msgstr ""
"Neznámá hodnota %1 pro rychlost snímkování/zahozené snímky v příchozím "
"datovém proudu MTC, místo ní se používají hodnoty sezení"
-#: mtc_slave.cc:381
+#: mtc_slave.cc:382
msgid "Session framerate adjusted from %1 TO: MTC's %2."
msgstr "Rychlost snímkování sezení změněna z %1 na MTC: %2"
-#: mtc_slave.cc:395
+#: mtc_slave.cc:396
msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
msgstr "Rychlost snímkování sezení a MTC se neshodují: MTC: %1 %2:%3."
@@ -1259,33 +1273,37 @@ msgstr "Kopírovat oblast s pevnÄ› stanoveným Äasem"
msgid "Pannable given XML data for %1 - ignored"
msgstr "Cíli vyvážení předána data XML pro %1 - přehlíží se"
-#: panner_manager.cc:76
-msgid "looking for panners in %1"
-msgstr "Hledání vyvážení v %1"
+#: panner_manager.cc:80
+msgid "looking for panners in %1\n"
+msgstr ""
-#: panner_manager.cc:100
-msgid "Panner discovered: \"%1\" in %2"
-msgstr "Vyvážení nalezeno: \"%1\" v %2"
+#: panner_manager.cc:108
+msgid "Panner discovered: \"%1\" in %2\n"
+msgstr ""
-#: panner_manager.cc:117
+#: panner_manager.cc:125
msgid "PannerManager: cannot load module \"%1\" (%2)"
msgstr "SprávceVyvážení: Nelze nahrát modul \"%1\" (%2)"
-#: panner_manager.cc:124
+#: panner_manager.cc:132
msgid "PannerManager: module \"%1\" has no descriptor function."
msgstr "SprávceVyvážení: Modul \"%1\" nemá žádnou funkci popisu"
-#: panner_manager.cc:187
+#: panner_manager.cc:219
msgid "no panner discovered for in/out = %1/%2"
msgstr "Nenalezeno žádné vyvážení pro vstupy/výstupy %1/%2"
-#: panner_shell.cc:179
+#: panner_shell.cc:126
+msgid "select panner: %1\n"
+msgstr ""
+
+#: panner_shell.cc:245
msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
msgstr ""
"Ve stavu vyvážení nalezen neznámý přídavný modul pro vyvážení \"%1\" - "
"přehlíží se"
-#: panner_shell.cc:185
+#: panner_shell.cc:251
msgid "panner plugin node has no type information!"
msgstr "Uzel přídavného modulu pro vyvážení nemá žádnou informaci o typu!"
@@ -1305,19 +1323,19 @@ msgstr "Žádné ID seznamu skladeb v XML zdroje seznamu skladeb!"
msgid "Could not construct playlist for PlaylistSource from session data!"
msgstr "Nepodařilo se sestavit seznam skladeb ze zdrojových dat sezení!"
-#: plugin.cc:324
+#: plugin.cc:328
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin.cc:398
+#: plugin.cc:402
msgid ""
"Saving plugin settings is not supported in this build of %1. Consider paying "
"for the full version"
msgstr ""
-#: plugin_insert.cc:598
+#: plugin_insert.cc:589
msgid "programming error: "
msgstr "Chyba v programování:"
@@ -1354,23 +1372,23 @@ msgid "PluginInsert: automatable control %1 not found - ignored"
msgstr ""
"PluginInsert: automatizovatelný prvek ovládání %1 nenalezen - přehlíží se"
-#: plugin_manager.cc:161
+#: plugin_manager.cc:165
msgid "Discovering Plugins"
msgstr "Hledání přídavných modulů"
-#: plugin_manager.cc:335
+#: plugin_manager.cc:286
msgid "Could not parse rdf file: %1"
msgstr "Nepodařilo se zpracovat soubor RDF: %1"
-#: plugin_manager.cc:374
+#: plugin_manager.cc:330
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr "LADSPA: Nelze nahrát modul \"%1\" (%2)"
-#: plugin_manager.cc:381
+#: plugin_manager.cc:337
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr "LADSPA: Modul \"%1\" nemá žádnou funkci popisu."
-#: plugin_manager.cc:602
+#: plugin_manager.cc:567
msgid ""
"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
"at this time"
@@ -1378,7 +1396,7 @@ msgstr ""
"Přídavný modul VST %1 nepodporuje processReplacing a z toho důvodu jej nyní "
"nelze v %2 použít"
-#: plugin_manager.cc:709
+#: plugin_manager.cc:680
msgid ""
"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
"in %2 at this time"
@@ -1386,16 +1404,16 @@ msgstr ""
"Přídavný modul linuxVST %1 nepodporuje processReplacing a z toho důvodu jej "
"nyní nelze v %2 použít"
-#: plugin_manager.cc:870
+#: plugin_manager.cc:841
msgid "unknown plugin status type \"%1\" - all entries ignored"
msgstr ""
"Neznámý typ stavu přídavného modulu\"%1\" - všechny záznamy se přehlíží"
-#: plugin_manager.cc:887
+#: plugin_manager.cc:858
msgid "unknown plugin type \"%1\" - ignored"
msgstr "Neznámý typ přídavného modulu \"%1\" - přehlíží se"
-#: port.cc:410
+#: port.cc:412
msgid "could not reregister %1"
msgstr "Nepodařilo se znovu zaregistrovat %1"
@@ -1403,11 +1421,11 @@ msgstr "Nepodařilo se znovu zaregistrovat %1"
msgid "insert %1"
msgstr "Vložit %1"
-#: port_insert.cc:198
+#: port_insert.cc:197
msgid "XML node describing port insert is missing the `type' field"
msgstr "Uzlu XML k popisu přípojky chybí pole \"type\""
-#: port_insert.cc:203
+#: port_insert.cc:202
msgid "non-port insert XML used for port plugin insert"
msgstr ""
"XML pro vložení ne-přípojky použito ke vložení přídavného modulu přípojky"
@@ -1442,11 +1460,11 @@ msgstr "AudioEngine: Nelze spojit %1 (%2) s %3 (%4)"
msgid "Re-establising port %1 failed"
msgstr ""
-#: processor.cc:207
+#: processor.cc:208
msgid "No %1 property flag in element %2"
msgstr "Žádný příznak pro vlastnost \"%1\" v prvku %2"
-#: processor.cc:216
+#: processor.cc:217
msgid "No child node with active property"
msgstr "Žádný uzel potomka s vlastností \"Äinný\""
@@ -1514,11 +1532,11 @@ msgstr "%1 spojen-%2.1 (%3)"
msgid "cannot create new name for region \"%1\""
msgstr "Nelze vytvořit nový název pro oblast \"%1\""
-#: resampled_source.cc:98
+#: resampled_source.cc:102
msgid "Import: %1"
msgstr "Zavedení: %1"
-#: resampled_source.cc:128
+#: resampled_source.cc:132 srcfilesource.cc:76
msgid "Import: src_new() failed : %1"
msgstr "Zavedení: Chyba v src_new() : %1"
@@ -1526,30 +1544,30 @@ msgstr "Zavedení: Chyba v src_new() : %1"
msgid "return %1"
msgstr "Vrácená hodnota: %1"
-#: route.cc:1075 route.cc:2528
+#: route.cc:1081 route.cc:2541
msgid "unknown Processor type \"%1\"; ignored"
msgstr "Neznámý typ procesoru \"%1\"; přehlíží se"
-#: route.cc:1087
+#: route.cc:1093
msgid "processor could not be created. Ignored."
msgstr "Procesor se nepodařilo vytvořit. Přehlíží se."
-#: route.cc:1962 route.cc:2187
+#: route.cc:1975 route.cc:2200
msgid "Bad node sent to Route::set_state() [%1]"
msgstr "Špatný uzel poslán Route::set_state() [%1]"
-#: route.cc:2022
+#: route.cc:2035
msgid "Pannable state found for route (%1) without a panner!"
msgstr ""
"Nalezen stav cíle vyvážení pro cestu (%1), aniž by bylo nalezeno vyvážení!"
-#: route.cc:2096 route.cc:2100 route.cc:2301 route.cc:2305
+#: route.cc:2109 route.cc:2113 route.cc:2314 route.cc:2318
msgid "badly formed order key string in state file! [%1] ... ignored."
msgstr ""
"Å patnÄ› utvoÅ™ený Å™etÄ›zec znaků pro klÃ­Ä poÅ™adí roztřídÄ›ní v souboru sezení! "
"[%1] ... Přehlíží se."
-#: route.cc:2311
+#: route.cc:2324
msgid "Converting deprecated order key for %1 using Editor order %2"
msgstr ""
@@ -1565,15 +1583,15 @@ msgstr "tempoize: Chyba pÅ™i Ätení dat z %1 v %2 (žádáno %3, obdrženo %4)"
msgid "error writing tempo-adjusted data to %1"
msgstr "Chyba při zápisu dat s upraveným tempem do %1"
-#: send.cc:59
+#: send.cc:60
msgid "aux %1"
msgstr "Pomocné (Aux) %1"
-#: send.cc:63
+#: send.cc:64
msgid "send %1"
msgstr "Poslání (send) %1"
-#: send.cc:65
+#: send.cc:66
msgid "programming error: send created using role %1"
msgstr "Chyba v programování: Poslání vytvořeno pomocí role %1"
@@ -1597,60 +1615,60 @@ msgstr ""
msgid "Set up standard connections"
msgstr "Nastavit standardní spojení"
-#: session.cc:635
+#: session.cc:638
msgid "could not setup Click I/O"
msgstr "Nepodařilo se nastavit vstup/výstup metronomu"
-#: session.cc:683
+#: session.cc:686
#, c-format
msgid "out %<PRIu32>"
msgstr "Výstup %<PRIu32>"
-#: session.cc:697
+#: session.cc:700
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr "Výstup %<PRIu32>+%<PRIu32>"
-#: session.cc:712
+#: session.cc:715
#, c-format
msgid "in %<PRIu32>"
msgstr "Vstup %<PRIu32>"
-#: session.cc:726
+#: session.cc:729
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr "Vstup %<PRIu32>+%<PRIu32>"
-#: session.cc:790
+#: session.cc:793
msgid "cannot connect master output %1 to %2"
msgstr "Nelze spojit hlavní výstup %1 s %2"
-#: session.cc:849
+#: session.cc:862
msgid "monitor"
msgstr "Sledování"
-#: session.cc:894
+#: session.cc:907
msgid "cannot connect control input %1 to %2"
msgstr "Nelze spojit vstup ovládání %1 s %2"
-#: session.cc:914
+#: session.cc:927
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr "Upřednostňovaný vstup/výstup pro sledovací sběrnici (%1) nelze najít"
-#: session.cc:945
+#: session.cc:958
msgid "cannot connect control output %1 to %2"
msgstr "Nelze spojit výstup ovládání %1 s %2"
-#: session.cc:1009
+#: session.cc:1026
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr "Nelze vytvořit poslechový systém: Žádný poslech oblastí není možný"
-#: session.cc:1193
+#: session.cc:1210
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
"Sezení: Tuto polohu nelze pro automatický pÅ™epis použít (ZaÄátek <= Konec) "
-#: session.cc:1233
+#: session.cc:1250
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
@@ -1658,15 +1676,15 @@ msgstr ""
"Tuto polohu nelze pro automatickou smyÄku použít, protože nemá žádnou, nebo "
"má zápornou délku"
-#: session.cc:1547
+#: session.cc:1564
msgid "feedback loop setup between %1 and %2"
msgstr "SmyÄka zpÄ›tné vazby rozpoznána mezi %1 a %2"
-#: session.cc:1843
+#: session.cc:1860
msgid "Session: could not create new midi track."
msgstr "Sezení: Nepodařilo se vytvořit novou stopu MIDI"
-#: session.cc:1849
+#: session.cc:1866
msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks."
@@ -1674,75 +1692,75 @@ msgstr ""
"Nejsou dostupné další přípojky JACK. Pokud potřebujete tolik stop, musíte "
"zastavit %1 a spustit JACK znovu s více přípojkami."
-#: session.cc:2026 session.cc:2029
+#: session.cc:2043 session.cc:2046
msgid "Audio"
msgstr "Zvuk"
-#: session.cc:2053 session.cc:2061 session.cc:2138 session.cc:2146
+#: session.cc:2070 session.cc:2078 session.cc:2155 session.cc:2163
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr "Nelze nastavit %1 nastavení vstup/%2 výstup pro novou zvukovou stopu"
-#: session.cc:2084
+#: session.cc:2101
msgid "Session: could not create new audio track."
msgstr "Sezení: Nepodařilo se vytvořit novou zvukovou stopu"
-#: session.cc:2116 session.cc:2119
+#: session.cc:2133 session.cc:2136
msgid "Bus"
msgstr "Sběrnice"
-#: session.cc:2169
+#: session.cc:2186
msgid "Session: could not create new audio route."
msgstr "Sezení: Nepodařilo se vytvořit novou zvukovou cestu"
-#: session.cc:2228 session.cc:2238
+#: session.cc:2245 session.cc:2255
msgid "Session: UINT_MAX routes? impossible!"
msgstr "Sezení: Cesty UINT_MAX? Nemožné!"
-#: session.cc:2260
+#: session.cc:2277
msgid "Session: cannot create track/bus from template description"
msgstr "Sezení: Nelze vytvořit stopu/sběrnici z popisu předlohy"
-#: session.cc:2286
+#: session.cc:2303
msgid "Session: could not create new route from template"
msgstr "Sezení: Nepodařilo se vytvořit novou cestu z předlohy"
-#: session.cc:2315
+#: session.cc:2332
msgid "Adding new tracks/busses failed"
msgstr "Chyba při přidávání nové stopy/sběrnice"
-#: session.cc:3419
+#: session.cc:3436
msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename"
msgstr "OSUDOVà CHYBA! Nepodařilo se najít vhodnou verzi %1 pro přejmenování"
-#: session.cc:3539 session.cc:3597
+#: session.cc:3556 session.cc:3614
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr "Již je %1 nahrávek pro %2, což je příliš mnoho."
-#: session.cc:3987
+#: session.cc:4004
msgid "send ID %1 appears to be in use already"
msgstr "Zdá se, že ID poslání (send) %1, se již používá"
-#: session.cc:3999
+#: session.cc:4016
msgid "aux send ID %1 appears to be in use already"
msgstr "Zdá se, že ID pomocného-poslání (aux-send) %1, se již používá"
-#: session.cc:4011
+#: session.cc:4028
msgid "return ID %1 appears to be in use already"
msgstr "Zdá se, že ID vrácení (return) %1, se již používá"
-#: session.cc:4023
+#: session.cc:4040
msgid "insert ID %1 appears to be in use already"
msgstr "Zdá se, že ID vložení (insert) %1, se již používá"
-#: session.cc:4150
+#: session.cc:4167
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr "Nelze zapsat oblast s Konec <= ZaÄátek (napÅ™. %1 <= %2)"
-#: session.cc:4179
+#: session.cc:4196
msgid "too many bounced versions of playlist \"%1\""
msgstr "Příliš mnoho odhozených verzí seznamu skladeb \"%1\""
-#: session.cc:4189
+#: session.cc:4206
msgid "cannot create new audio file \"%1\" for %2"
msgstr "Nelze vytvořit nový zvukový soubor \"%1\" pro %2"
@@ -1781,7 +1799,7 @@ msgstr "Nelze vytvořit adresář se sezením v cestě %1. Chyba: %2"
msgid "Session subdirectory does not exist at path %1"
msgstr "Adresář se sezením v cestě %1 neexistuje"
-#: session_events.cc:184
+#: session_events.cc:185
msgid "Session: cannot have two events of type %1 at the same frame (%2)."
msgstr "Sezení: Není možné mít ve stejném snímku (%2) dvě události typu %1."
@@ -1793,7 +1811,7 @@ msgstr "%1: Polohu souboru %2 nelze vyhledat pro vyvedení"
msgid "Export ended unexpectedly: %1"
msgstr "Vyvedení skonÄilo neoÄekávanÄ›: %1"
-#: session_ltc.cc:222
+#: session_ltc.cc:221
msgid ""
"LTC encoder: invalid framerate - LTC encoding is disabled for the remainder "
"of this session."
@@ -1801,7 +1819,7 @@ msgstr ""
"Kodér LTC: Neplatná rychlost snímkování - Kódování LTC je pro zbývající Äást "
"tohoto sezení zakázáno."
-#: session_midi.cc:520
+#: session_midi.cc:519
msgid "Session: cannot send quarter-frame MTC message (%1)"
msgstr "Sezení: Nelze poslat quarter-frame MTC (%1)"
@@ -1813,92 +1831,88 @@ msgstr "Sezení: Nelze vytvořit seznam skladeb z popisu XML"
msgid "Session: error in no roll for %1"
msgstr "Sezení: Chyba v no_roll pro %1"
-#: session_process.cc:1157
+#: session_process.cc:1159
msgid "Programming error: illegal event type in process_event (%1)"
msgstr "Chyba v programování: Neplatný typ události v process_event (%1)"
-#: session_state.cc:140
-msgid "Could not use path %1 (%2)"
-msgstr "Nepodařilo se použít cestu %1 (%2)"
-
-#: session_state.cc:184
+#: session_state.cc:178
msgid "solo cut control (dB)"
msgstr "Nastavení Solo Cut (dB)"
-#: session_state.cc:208
+#: session_state.cc:202
msgid "Set block size and sample rate"
msgstr "Nastavit velikost bloku a vzorkovací kmitoÄet"
-#: session_state.cc:213
+#: session_state.cc:207
msgid "Using configuration"
msgstr "Používané nastavení"
-#: session_state.cc:325
+#: session_state.cc:319
msgid "Reset Remote Controls"
msgstr "Nastavit dálkové ovládání znovu"
-#: session_state.cc:417
+#: session_state.cc:411
msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
msgstr "Sezení: Nelze vytvořit složku Peakfile \"%1\" (%2)"
-#: session_state.cc:424
+#: session_state.cc:418
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr "Sezení: Nelze vytvořit adresář sezení pro zvuková data \"%1\" (%2)"
-#: session_state.cc:431
+#: session_state.cc:425
msgid "Session: cannot create session midi dir \"%1\" (%2)"
msgstr "Sezení: Nelze vytvořit adresář sezení pro MIDI \"%1\" (%2)"
-#: session_state.cc:438
+#: session_state.cc:432
msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
msgstr ""
"Sezení: Nelze vytvořit odpadkový koš sezení pro zahozený zvuk \"%1\" (%2)"
-#: session_state.cc:445
+#: session_state.cc:439
msgid "Session: cannot create session export folder \"%1\" (%2)"
msgstr "Sezení: Nelze vytvořit složku sezení pro vyvedené soubory \"%1\" (%2)"
-#: session_state.cc:452
+#: session_state.cc:446
msgid "Session: cannot create session analysis folder \"%1\" (%2)"
msgstr "Sezení: Nelze vytvořit složku sezení pro data rozboru \"%1\" (%2)"
-#: session_state.cc:459
+#: session_state.cc:453
msgid "Session: cannot create session plugins folder \"%1\" (%2)"
msgstr "Sezení: Nelze vytvořit složku sezení pro přídavné moduly \"%1\" (%2)"
-#: session_state.cc:466
+#: session_state.cc:460
msgid "Session: cannot create session externals folder \"%1\" (%2)"
msgstr "Sezení: Nelze vytvořit složku sezení pro vnější \"%1\" (%2)"
-#: session_state.cc:480
+#: session_state.cc:474
msgid "Session: cannot create session folder \"%1\" (%2)"
msgstr "Sezení: Nelze vytvořit složku sezení \"%1\" (%2)"
-#: session_state.cc:514
+#: session_state.cc:508
msgid "Could not open %1 for writing session template"
msgstr "Nepodařilo se otevřít %1 pro zápis předlohy sezení"
-#: session_state.cc:520
+#: session_state.cc:514
msgid "Could not open session template %1 for reading"
msgstr "NepodaÅ™ilo se otevřít pÅ™edlohu sezení %1 pro Ätení"
-#: session_state.cc:539
+#: session_state.cc:533
msgid "master"
msgstr "Master"
-#: session_state.cc:600
+#: session_state.cc:594
msgid "Could not remove pending capture state at path \"%1\" (%2)"
msgstr "Nepodařilo se odstranit předběžný stav nahrávání v cestě \"%1\" (%2)"
-#: session_state.cc:624
+#: session_state.cc:618
msgid "could not rename snapshot %1 to %2 (%3)"
msgstr "Nepodařilo se přejmenovat snímek obrazovky %1 na %2 (%3)"
-#: session_state.cc:652
+#: session_state.cc:646
msgid "Could not remove session file at path \"%1\" (%2)"
msgstr "Nepodařilo se odstranit soubor se sezením v cestě \"%1\" (%2)"
-#: session_state.cc:669
+#: session_state.cc:663
msgid ""
"the %1 audio engine is not connected and state saving would lose all I/O "
"connections. Session not saved"
@@ -1906,134 +1920,134 @@ msgstr ""
"Zvukový stroj %1 není spojen, a při ukládání stavu by došlo ke ztrátě všech "
"spojení vstup/výstup. Sezení neuloženo"
-#: session_state.cc:720
+#: session_state.cc:714
msgid "state could not be saved to %1"
msgstr "Stav se do %1 uložit nepodařilo"
-#: session_state.cc:722 session_state.cc:733
+#: session_state.cc:716 session_state.cc:727
msgid "Could not remove temporary session file at path \"%1\" (%2)"
msgstr "NepodaÅ™ilo se odstranit doÄasný soubor se sezením v cestÄ› \"%1\" (%2)"
-#: session_state.cc:730
-msgid "could not rename temporary session file %1 to %2"
-msgstr "NepodaÅ™ilo se pÅ™ejmenovat doÄasný soubor se sezením %1 na %2"
+#: session_state.cc:724
+msgid "could not rename temporary session file %1 to %2 (%3)"
+msgstr ""
-#: session_state.cc:798
+#: session_state.cc:792
msgid "%1: session file \"%2\" doesn't exist!"
msgstr "%1: Soubor se sezením \"%2\" neexistuje!"
-#: session_state.cc:810
+#: session_state.cc:804
msgid "Could not understand session file %1"
msgstr "Nepodařilo se porozumět souboru se sezením\"%1\""
-#: session_state.cc:819
+#: session_state.cc:813
msgid "Session file %1 is not a session"
msgstr "Soubor se sezením %1 není sezením"
-#: session_state.cc:1125
+#: session_state.cc:1119
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr "Chyba v programování: Sezení: Nesprávný uzel XML poslán set_state()"
-#: session_state.cc:1179
+#: session_state.cc:1173
msgid "Session: XML state has no options section"
msgstr "Sezení: XML nemá žádnou Äást \"options\""
-#: session_state.cc:1184
+#: session_state.cc:1178
msgid "Session: XML state has no metadata section"
msgstr "Sezení: XML nemá žádnou Äást \"metadata\""
-#: session_state.cc:1195
+#: session_state.cc:1189
msgid "Session: XML state has no sources section"
msgstr "Sezení: XML nemá žádnou Äást \"sources\""
-#: session_state.cc:1202
+#: session_state.cc:1196
msgid "Session: XML state has no Tempo Map section"
msgstr "Sezení: XML nemá žádnou Äást \"Tempo Map\""
-#: session_state.cc:1209
+#: session_state.cc:1203
msgid "Session: XML state has no locations section"
msgstr "Sezení: XML nemá žádnou Äást \"locations\""
-#: session_state.cc:1235
+#: session_state.cc:1229
msgid "Session: XML state has no Regions section"
msgstr "Sezení: XML nemá žádnou Äást \"Regions\""
-#: session_state.cc:1242
+#: session_state.cc:1236
msgid "Session: XML state has no playlists section"
msgstr "Sezení: XML nemá žádnou Äást \"playlists\""
-#: session_state.cc:1262
+#: session_state.cc:1256
msgid "Session: XML state has no bundles section"
msgstr "Sezení: XML nemá žádnou Äást \"bundles\""
-#: session_state.cc:1274
+#: session_state.cc:1268
msgid "Session: XML state has no diskstreams section"
msgstr "Sezení: XML nemá žádnou Äást \"diskstreams\""
-#: session_state.cc:1282
+#: session_state.cc:1276
msgid "Session: XML state has no routes section"
msgstr "Sezení: XML nemá žádnou Äást \"routes\""
-#: session_state.cc:1294
+#: session_state.cc:1288
msgid "Session: XML state has no route groups section"
msgstr "Sezení: XML nemá žádnou Äást \"route groups\""
-#: session_state.cc:1303
+#: session_state.cc:1297
msgid "Session: XML state has no edit groups section"
msgstr "Sezení: XML nemá žádnou Äást \"edit groups\""
-#: session_state.cc:1310
+#: session_state.cc:1304
msgid "Session: XML state has no mix groups section"
msgstr "Sezení: XML nemá žádnou Äást \"mix groups\""
-#: session_state.cc:1318
+#: session_state.cc:1312
msgid "Session: XML state has no click section"
msgstr "Sezení: XML nemá žádnou Äást \"click\""
-#: session_state.cc:1360
+#: session_state.cc:1354
msgid "Session: cannot create Route from XML description."
msgstr "Sezení: Nelze vytvořit cestu z popisu XML"
-#: session_state.cc:1364
+#: session_state.cc:1358
msgid "Loaded track/bus %1"
msgstr "Byla nahrána stopa/sběrnice %1"
-#: session_state.cc:1462
+#: session_state.cc:1456
msgid "Could not find diskstream for route"
msgstr "Nepodařilo se najít Diskstream pro cestu"
-#: session_state.cc:1516
+#: session_state.cc:1510
msgid "Session: cannot create Region from XML description."
msgstr "Sezení: Nelze vytvořit oblast z popisu XML"
-#: session_state.cc:1520
+#: session_state.cc:1514
msgid "Can not load state for region '%1'"
msgstr "Nelze nahrát stav pro oblast '%1'"
-#: session_state.cc:1556
+#: session_state.cc:1550
msgid "Regions in compound description not found (ID's %1 and %2): ignored"
msgstr "Oblasti ve spojeném popisu nenalezeny (ID %1 a %2): přehlíží se"
-#: session_state.cc:1584
+#: session_state.cc:1578
msgid "Nested source has no ID info in session file! (ignored)"
msgstr ""
"Vnořený zdroj nemá v souboru se sezením žádné informace ID! (přehlíží se)"
-#: session_state.cc:1596
+#: session_state.cc:1590
msgid "Cannot reconstruct nested source for region %1"
msgstr "Nelze obnovit vnořený zdroj pro oblast %1"
-#: session_state.cc:1658
+#: session_state.cc:1652
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr "Sezení: Uzel XML k popisu zvukové oblasti je neúplný (chybí zdroj)"
-#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707
+#: session_state.cc:1660 session_state.cc:1681 session_state.cc:1701
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
"Sezení: Uzel XML k popisu zvukové oblasti odkazuje na ID neznámého zdroje =%1"
-#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713
+#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
@@ -2041,7 +2055,7 @@ msgstr ""
"Sezení: Uzel XML k popisu zvukové oblasti odkazuje na ID nezvukového zdroje ="
"%1"
-#: session_state.cc:1736
+#: session_state.cc:1730
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
@@ -2049,23 +2063,23 @@ msgstr ""
"Sezení: Uzlu XML k popisu zvukové oblasti chybí některé hlavní zdroje; "
"přehlíží se"
-#: session_state.cc:1770
+#: session_state.cc:1764
msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
msgstr "Sezení: Uzel XML k popisu oblasti MIDI je neúplný (chybí zdroj)"
-#: session_state.cc:1778
+#: session_state.cc:1772
msgid ""
"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
msgstr ""
"Sezení: Uzel XML k popisu oblasti MIDI odkazuje na ID neznámého zdroje =%1"
-#: session_state.cc:1784
+#: session_state.cc:1778
msgid ""
"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
msgstr ""
"Sezení: Uzel XML k popisu oblasti MIDI odkazuje na ID ne-MIDI zdroje =%1"
-#: session_state.cc:1852
+#: session_state.cc:1846
msgid ""
"cannot create new file from region name \"%1\" with ident = \"%2\": too many "
"existing files with similar names"
@@ -2073,110 +2087,106 @@ msgstr ""
"Nelze vytvořit nový soubor z názvu oblasti \"%1\" s ident = \"%2\": Je "
"příliš mnoho souborů s podobnými názvy"
-#: session_state.cc:1875
+#: session_state.cc:1869
msgid "Session: cannot create Source from XML description."
msgstr "Sezení: Nelze vytvořit zdroj z popisu XML"
-#: session_state.cc:1909
+#: session_state.cc:1903
msgid "A sound file is missing. It will be replaced by silence."
msgstr "Chybí zvukový soubor. Bude nahrazen tichem."
-#: session_state.cc:1932
+#: session_state.cc:1926
msgid "Found a sound file that cannot be used by %1. Talk to the progammers."
msgstr ""
"Byl nalezen zvukový soubor, který není použitelný %1. Promluvte si s "
"programátory."
-#: session_state.cc:1949
+#: session_state.cc:1943
msgid "Could not create templates directory \"%1\" (%2)"
msgstr "Nepodařilo se vytvořit adresář s předlohami \"%1\" (%2)"
-#: session_state.cc:1962
+#: session_state.cc:1956
msgid "Template \"%1\" already exists - new version not created"
msgstr "Předloha \"%1\" již existuje - nová verze nebyla vytvořena"
-#: session_state.cc:1968
+#: session_state.cc:1962
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr "Nepodařilo se vytvořit adresář pro předlohu sezení \"%1\" (%2)"
-#: session_state.cc:1978
+#: session_state.cc:1972
msgid "template not saved"
msgstr "Předloha neuložena"
-#: session_state.cc:1988
+#: session_state.cc:1982
msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
msgstr ""
"Nepodařilo se vytvořit adresář pro stav přídavného modulu předlohy sezení "
"\"%1\" (%2)"
-#: session_state.cc:2183
+#: session_state.cc:2225
msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr "Nalezen neznámý uzel \"%1\" v seznamu svazků souboru sezení"
-#: session_state.cc:2725 session_state.cc:2731
-msgid "Cannot expand path %1 (%2)"
-msgstr "Nelze rozšířit cestu %1 (%2)"
-
-#: session_state.cc:2784
+#: session_state.cc:2820
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr "Sezení: Nelze vytvořit odpadkový koš pro zahozen soubory \"%1\" (%2)"
-#: session_state.cc:2823
+#: session_state.cc:2859
msgid "cannot rename unused file source from %1 to %2 (%3)"
msgstr "Nelze přejmenovat nepoužívaný souborový zdroj z %1 na %2 (%3)"
-#: session_state.cc:2841
+#: session_state.cc:2877
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr "Nelze odstranit vrcholový soubor %1 pro %2 (%3)"
-#: session_state.cc:3143
+#: session_state.cc:3179
msgid "could not backup old history file, current history not saved"
msgstr ""
"NepodaÅ™ilo se vytvoÅ™it zálohu starého souboru se seznamem Äinností, nynÄ›jší "
"historie neuložena"
-#: session_state.cc:3156
+#: session_state.cc:3192
msgid "history could not be saved to %1"
msgstr "NepodaÅ™ilo se uložit seznam Äinností do %1"
-#: session_state.cc:3159
+#: session_state.cc:3195
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr ""
"NepodaÅ™ilo se odstranit soubor se seznamem Äinností v cestÄ› \"%1\" (%2)"
-#: session_state.cc:3163
+#: session_state.cc:3199
msgid "could not restore history file from backup %1 (%2)"
msgstr "NepodaÅ™ilo se obnovit soubor se seznamem Äinností ze zálohy %1 (%2)"
-#: session_state.cc:3188
+#: session_state.cc:3224
msgid "%1: no history file \"%2\" for this session."
msgstr "%1: Žádný soubor se seznamem Äinností \"%2\" pro toto sezení."
-#: session_state.cc:3194
+#: session_state.cc:3230
msgid "Could not understand session history file \"%1\""
msgstr "NepodaÅ™ilo se porozumÄ›t souboru se seznamem Äinností sezení \"%1\""
-#: session_state.cc:3236
+#: session_state.cc:3272
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr "Nepodařilo se najít MidiSource pro NoteDiffCommand"
-#: session_state.cc:3247
+#: session_state.cc:3283
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr "Nepodařilo se najít MidiSource pro SysExDiffCommand"
-#: session_state.cc:3258
+#: session_state.cc:3294
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr "Nepodařilo se najít MidiSource pro PatchChangeDiffCommand"
-#: session_state.cc:3266
+#: session_state.cc:3302
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr "Nepodařilo se rozpoznat žádný příkaz v uzlu XML \"%1\"."
-#: session_state.cc:3502
+#: session_state.cc:3538
msgid "Session: unknown diskstream type in XML"
msgstr "Sezení: Neznámý typ Diskstream v XML"
-#: session_state.cc:3507
+#: session_state.cc:3543
msgid "Session: could not load diskstream via XML state"
msgstr "Sezení: Nepodařilo se nahrát Diskstream pomocí stavu XML"
@@ -2204,122 +2214,122 @@ msgstr ""
"Celkové ovládání výšky tónu při proměnlivé rychlosti přehrávání není možné, "
"dokud je %1 spojen s transportem JACK."
-#: smf_source.cc:252
+#: smf_source.cc:262
msgid "Unable to read event prefix, corrupt MIDI ring"
msgstr "Nelze pÅ™eÄíst pÅ™edponu události, poÅ¡kozen okraj MIDI"
-#: smf_source.cc:265
+#: smf_source.cc:275
msgid "Event has time and size but no body, corrupt MIDI ring"
msgstr "Událost má Äas a velikost, ale nemá tÄ›lo, poÅ¡kozen okraj MIDI"
-#: smf_source.cc:271
+#: smf_source.cc:281
msgid "Event time is before MIDI source position"
msgstr "Čas události je před polohou zdroje MIDI"
-#: smf_source.cc:306 smf_source.cc:345
+#: smf_source.cc:316 smf_source.cc:355
msgid "Skipping event with unordered time %1"
msgstr "PÅ™eskakuje se událost s neuspořádaným Äasem %1"
-#: smf_source.cc:410
+#: smf_source.cc:420
msgid "cannot open MIDI file %1 for write"
msgstr "Nelze otevřít soubor MIDI %1 pro zápis"
-#: sndfile_helpers.cc:32
+#: sndfile_helpers.cc:34
msgid "WAV"
msgstr "WAV"
-#: sndfile_helpers.cc:33
+#: sndfile_helpers.cc:35
msgid "AIFF"
msgstr "AIFF"
-#: sndfile_helpers.cc:34
+#: sndfile_helpers.cc:36
msgid "CAF"
msgstr "CAF"
-#: sndfile_helpers.cc:35
+#: sndfile_helpers.cc:37
msgid "W64 (64 bit WAV)"
msgstr "W64 (64 bit WAV)"
-#: sndfile_helpers.cc:36
+#: sndfile_helpers.cc:38
msgid "FLAC"
msgstr "FLAC"
-#: sndfile_helpers.cc:37
+#: sndfile_helpers.cc:39
msgid "Ogg/Vorbis"
msgstr "Ogg/Vorbis"
-#: sndfile_helpers.cc:38
+#: sndfile_helpers.cc:40
msgid "raw (no header)"
msgstr "raw (no header)"
-#: sndfile_helpers.cc:43
+#: sndfile_helpers.cc:45
msgid ".wav"
msgstr ".wav"
-#: sndfile_helpers.cc:44
+#: sndfile_helpers.cc:46
msgid ".aiff"
msgstr ".aiff"
-#: sndfile_helpers.cc:45
+#: sndfile_helpers.cc:47
msgid ".caf"
msgstr ".caf"
-#: sndfile_helpers.cc:46
+#: sndfile_helpers.cc:48
msgid ".w64"
msgstr ".w64"
-#: sndfile_helpers.cc:47
+#: sndfile_helpers.cc:49
msgid ".flac"
msgstr ".flac"
-#: sndfile_helpers.cc:48
+#: sndfile_helpers.cc:50
msgid ".ogg"
msgstr ".ogg"
-#: sndfile_helpers.cc:49
+#: sndfile_helpers.cc:51
msgid ".raw"
msgstr ".raw"
-#: sndfile_helpers.cc:64
+#: sndfile_helpers.cc:66
msgid "Signed 16 bit PCM"
msgstr "Signed 16 bit PCM"
-#: sndfile_helpers.cc:65
+#: sndfile_helpers.cc:67
msgid "Signed 24 bit PCM"
msgstr "Signed 24 bit PCM"
-#: sndfile_helpers.cc:66
+#: sndfile_helpers.cc:68
msgid "Signed 32 bit PCM"
msgstr "Signed 32 bit PCM"
-#: sndfile_helpers.cc:67
+#: sndfile_helpers.cc:69
msgid "Signed 8 bit PCM"
msgstr "Signed 8 bit PCM"
-#: sndfile_helpers.cc:68
+#: sndfile_helpers.cc:70
msgid "32 bit float"
msgstr "32 bit float"
-#: sndfile_helpers.cc:81
+#: sndfile_helpers.cc:83
msgid "Little-endian (Intel)"
msgstr "Little-endian (Intel)"
-#: sndfile_helpers.cc:82
+#: sndfile_helpers.cc:84
msgid "Big-endian (PowerPC)"
msgstr "Big-endian (PowerPC)"
-#: sndfilesource.cc:201
+#: sndfilesource.cc:210
msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
msgstr "SndFileSource: Nelze otevřít soubor \"%1\" pro %2 (%3)"
-#: sndfilesource.cc:209
+#: sndfilesource.cc:218
msgid ""
"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
"number"
msgstr ""
"SndFileSource: Soubor obsahuje jen %1 kanály, %2 je neplatným poÄtem kanálů"
-#: sndfilesource.cc:255 sndfilesource.cc:571 sndfilesource.cc:595
+#: sndfilesource.cc:264 sndfilesource.cc:604 sndfilesource.cc:628
msgid ""
"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
"for this file"
@@ -2327,68 +2337,72 @@ msgstr ""
"Nelze nastavit informace o přenosu pro zvukový soubor %1 (%2); Zahazují se "
"informace o přenosu pro tento soubor"
-#: sndfilesource.cc:302
+#: sndfilesource.cc:311
msgid "could not allocate file %1 for reading."
msgstr "NepodaÅ™ilo se pÅ™idÄ›lit soubor %1 pro Ätení."
-#: sndfilesource.cc:337
+#: sndfilesource.cc:346
msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
msgstr "SndFileSource: Nepodařil se vyhledat v %2 snímku %1 (%3)"
-#: sndfilesource.cc:347
+#: sndfilesource.cc:356
msgid ""
"SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
msgstr ""
"SndFileSource: @ %1 NepodaÅ™il se Äíst %2 uvnitÅ™ %3 (%4) (len = %5, ret byl "
"%6)"
-#: sndfilesource.cc:391 sndfilesource.cc:420
+#: sndfilesource.cc:400 sndfilesource.cc:429
msgid "attempt to write a non-writable audio file source (%1)"
msgstr ""
"Pokus o zápis zvukového zdrojového souboru chráněného proti zápisu (%1)"
-#: sndfilesource.cc:396 utils.cc:510 utils.cc:534 utils.cc:548 utils.cc:567
+#: sndfilesource.cc:405 utils.cc:547 utils.cc:571 utils.cc:585 utils.cc:604
msgid "programming error: %1 %2"
msgstr "Chyba v programování: %1 %2"
-#: sndfilesource.cc:523
+#: sndfilesource.cc:532 sndfilesource.cc:562
msgid "attempt to flush a non-writable audio file source (%1)"
msgstr ""
"Pokus o uklizení zvukového zdrojového souboru chráněného proti zápisu (%1)"
-#: sndfilesource.cc:528
+#: sndfilesource.cc:537 sndfilesource.cc:557
msgid "attempt to flush an un-opened audio file source (%1)"
msgstr "Pokus o uklizení neotevřeného zvukového zdrojového souboru (%1)"
-#: sndfilesource.cc:534
+#: sndfilesource.cc:543
msgid "could not allocate file %1 to write header"
msgstr "NepodaÅ™ilo se pÅ™idÄ›lit soubor %1 pro zapsání hlaviÄky souboru"
-#: sndfilesource.cc:548
+#: sndfilesource.cc:568
+msgid "could not allocate file %1 to flush contents"
+msgstr ""
+
+#: sndfilesource.cc:581
msgid ""
"attempt to store broadcast info in a non-writable audio file source (%1)"
msgstr ""
"Pokus o zápis informace o přenosu do zvukového zdrojového souboru chráněného "
"proti zápisu (%1)"
-#: sndfilesource.cc:553
+#: sndfilesource.cc:586
msgid "attempt to set BWF info for an un-opened audio file source (%1)"
msgstr ""
"Pokus o nastavení informace BWF v neotevřeném zvukovém zdrojovém souboru (%1)"
-#: sndfilesource.cc:614
+#: sndfilesource.cc:647
msgid "%1: cannot seek to %2 (libsndfile error: %3)"
msgstr "%1: Nelze vyhledat %2 (Chyba libsndfile: %3)"
-#: sndfilesource.cc:727
+#: sndfilesource.cc:760
msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
msgstr "SndFileSource: \"%1\" Å¡patná vrácená hodnota Ätení: %2 z %5 (%3: %4)"
-#: sndfilesource.cc:740 sndfilesource.cc:790 sndfilesource.cc:797
+#: sndfilesource.cc:773 sndfilesource.cc:823 sndfilesource.cc:830
msgid "SndFileSource: \"%1\" bad write (%2)"
msgstr "SndFileSource: \"%1\" špatný postup zápisu (%2)"
-#: sndfilesource.cc:820
+#: sndfilesource.cc:853
msgid ""
"Filesource: start time is already set for existing file (%1): Cannot change "
"start time."
@@ -2396,18 +2410,22 @@ msgstr ""
"Filesource: ZaÄáteÄní Äas pro existující soubor je již nastaven (%1): "
"ZaÄáteÄní Äas nelze zmÄ›nit."
-#: speakers.cc:239
+#: speakers.cc:280
msgid "Speaker information is missing azimuth - speaker ignored"
msgstr "Údaj pro reproduktor postrádá azimut - reproduktor se přehlíží"
-#: speakers.cc:245
+#: speakers.cc:286
msgid "Speaker information is missing elevation - speaker ignored"
msgstr "Údaj pro reproduktor postrádá vyvýšení - reproduktor se přehlíží"
-#: speakers.cc:251
+#: speakers.cc:292
msgid "Speaker information is missing distance - speaker ignored"
msgstr "Údaj pro reproduktor postrádá vzdálenost - reproduktor se přehlíží"
+#: srcfilesource.cc:135
+msgid "SrcFileSource: %1"
+msgstr ""
+
#: tape_file_matcher.cc:46
msgid "Cannot compile tape track regexp for use (%1)"
msgstr "Regulární výraz stopy pásky nelze vyhodnotit k užívání (%1)"
@@ -2568,54 +2586,89 @@ msgstr "Uzel pro kanál nemá žádnou vlastnost \"type\""
msgid "Node for Port has no \"name\" property"
msgstr "Uzel pro přípojku nemá žádnou vlastnost \"name\""
-#: utils.cc:358 utils.cc:382
+#: utils.cc:395 utils.cc:419
msgid "Splice"
msgstr "Spojit"
-#: utils.cc:360 utils.cc:375
+#: utils.cc:397 utils.cc:412
msgid "Slide"
msgstr "Vsunout"
-#: utils.cc:362 utils.cc:378
+#: utils.cc:399 utils.cc:415
msgid "Lock"
msgstr "Zamknout"
-#: utils.cc:365
+#: utils.cc:402
msgid "programming error: unknown edit mode string \"%1\""
msgstr "Chyba v programování: neznámý řetězec pro režim úprav \"%1\""
-#: utils.cc:389 utils.cc:421
+#: utils.cc:426 utils.cc:458
msgid "MIDI Timecode"
msgstr "Časový kód MIDI"
-#: utils.cc:389 utils.cc:419
+#: utils.cc:426 utils.cc:456
msgid "MTC"
msgstr "MTC"
-#: utils.cc:393 utils.cc:428
+#: utils.cc:430 utils.cc:465
msgid "MIDI Clock"
msgstr "Hodiny MIDI"
-#: utils.cc:397 utils.cc:415 utils.cc:435
+#: utils.cc:434 utils.cc:452 utils.cc:472
msgid "JACK"
msgstr "JACK"
-#: utils.cc:401
+#: utils.cc:438
msgid "programming error: unknown sync source string \"%1\""
msgstr "Chyba v programování: neznámý řetězec pro zdroj seřízení \"%1\""
-#: utils.cc:426
+#: utils.cc:463
msgid "M-Clock"
msgstr "M-Clock"
-#: utils.cc:432
+#: utils.cc:469
msgid "LTC"
msgstr "LTC"
-#: utils.cc:602
+#: utils.cc:639
msgid "programming error: unknown native header format: %1"
msgstr "Chyba v programování: neznámý nativní formát hlaviÄky: %1"
-#: utils.cc:617
+#: utils.cc:654
msgid "cannot open directory %1 (%2)"
msgstr "Nelze otevřít adresář %1 (%2)"
+
+#~ msgid "Auditioning of non-audio regions not yet supported"
+#~ msgstr "Poslech nezvukových oblastí ještě není podporován"
+
+#~ msgid "Filesource: cannot find required file (%1): while searching %2"
+#~ msgstr ""
+#~ "Zdroj souboru: Nelze najít požadovaný soubor (%1) při prohledávání %2"
+
+#~ msgid ""
+#~ "FileSource: \"%1\" is ambigous when searching %2\n"
+#~ "\t"
+#~ msgstr ""
+#~ "Zdroj souboru: \"%1\" je pÅ™i prohledávání %2 nejednoznaÄný\n"
+#~ "\t"
+
+#~ msgid "Could not resolve path: %1 (%2)"
+#~ msgstr "Nepodařilo se vyřešit cestu: %1 (%2)"
+
+#~ msgid "LADSPA: cannot load module from \"%1\""
+#~ msgstr "LADSPA: Nelze nahrát modul z \"%1\""
+
+#~ msgid "looking for panners in %1"
+#~ msgstr "Hledání vyvážení v %1"
+
+#~ msgid "Panner discovered: \"%1\" in %2"
+#~ msgstr "Vyvážení nalezeno: \"%1\" v %2"
+
+#~ msgid "Could not use path %1 (%2)"
+#~ msgstr "Nepodařilo se použít cestu %1 (%2)"
+
+#~ msgid "could not rename temporary session file %1 to %2"
+#~ msgstr "NepodaÅ™ilo se pÅ™ejmenovat doÄasný soubor se sezením %1 na %2"
+
+#~ msgid "Cannot expand path %1 (%2)"
+#~ msgstr "Nelze rozšířit cestu %1 (%2)"
diff --git a/libs/ardour/po/de.po b/libs/ardour/po/de.po
index 8cf15b4488..523a11835b 100644
--- a/libs/ardour/po/de.po
+++ b/libs/ardour/po/de.po
@@ -1,13 +1,13 @@
# Copyright (C) YEAR "Paul Davis"
# This file is distributed under the same license as the PACKAGE package.
#
-# Edgar Aichinger <edgar.aichinger@aon.at>, 2013.
+# Edgar Aichinger <edgar.aichinger@aon.at>, 2013, 2014.
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-11-05 11:11-0500\n"
-"PO-Revision-Date: 2013-09-26 16:32+0200\n"
+"POT-Creation-Date: 2014-02-10 17:53+0100\n"
+"PO-Revision-Date: 2014-02-10 18:07+0100\n"
"Last-Translator: Edgar Aichinger <edogawa@aon.at>\n"
"Language-Team: German <ardour-dev@lists.ardour.org>\n"
"Language: de\n"
@@ -21,74 +21,74 @@ msgstr ""
msgid "Fader"
msgstr "Fader"
-#: audio_diskstream.cc:244
+#: audio_diskstream.cc:242
msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
msgstr ""
"AudioDiskstream: Wiedergabeliste \"%1\" ist keine Audio-Wiedergabeliste"
-#: audio_diskstream.cc:296
+#: audio_diskstream.cc:294
msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
"AudioDiskstream %1: es gibt keine Wiedergabeliste, die kopiert werden kann!"
-#: audio_diskstream.cc:848 audio_diskstream.cc:858
+#: audio_diskstream.cc:846 audio_diskstream.cc:856
msgid ""
"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
msgstr ""
"AudioDiskstream %1: Kann während des Befüllens %2 nicht aus Wiedergabeliste "
"bei Frame %3 lesen"
-#: audio_diskstream.cc:1014
+#: audio_diskstream.cc:1012
msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
"AudioDiskstream %1: Kann %2 nicht aus Wiedergabeliste bei Frame %3 lesen"
-#: audio_diskstream.cc:1383 audio_diskstream.cc:1400
+#: audio_diskstream.cc:1381 audio_diskstream.cc:1398
msgid "AudioDiskstream %1: cannot write to disk"
msgstr "AudioDiskstream %1: Kann nicht auf Disk schreiben"
-#: audio_diskstream.cc:1443
+#: audio_diskstream.cc:1441
msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
msgstr "AudioDiskstream %1: Kann aufgenommene Daten nicht auf Disk schreiben!"
-#: audio_diskstream.cc:1537
+#: audio_diskstream.cc:1535
msgid "%1: could not create region for complete audio file"
msgstr "%1: konnte keine Region für die komplette Audiodatei erzeugen"
-#: audio_diskstream.cc:1571
+#: audio_diskstream.cc:1569
msgid "AudioDiskstream: could not create region for captured audio!"
msgstr ""
"AudioDiskstream: konnte keine Region für das aufgenommene Audiomaterial "
"erzeugen!"
-#: audio_diskstream.cc:1679
+#: audio_diskstream.cc:1677
msgid "programmer error: %1"
msgstr "Programmierfehler: %1"
-#: audio_diskstream.cc:1905
+#: audio_diskstream.cc:1903
msgid "AudioDiskstream: channel %1 out of range"
msgstr "AudioDiskstream: Kanal %1 Bereichsüberschreitung"
-#: audio_diskstream.cc:1919 midi_diskstream.cc:1210
+#: audio_diskstream.cc:1917 midi_diskstream.cc:1209
msgid "%1:%2 new capture file not initialized correctly"
msgstr "%1:%2 neue Aufnahmedatei nicht korrekt initialisiert"
-#: audio_diskstream.cc:2200
+#: audio_diskstream.cc:2198
msgid "%1: cannot restore pending capture source file %2"
msgstr "%1: kann vorläufige Aufnahme-Quelldatei %2 nicht wiederherstellen"
-#: audio_diskstream.cc:2222
+#: audio_diskstream.cc:2220
msgid "%1: incorrect number of pending sources listed - ignoring them all"
msgstr ""
"%1: Liste enthält falsche Anzahl vorläufiger Quellen - alle werden ignoriert"
-#: audio_diskstream.cc:2246
+#: audio_diskstream.cc:2244
msgid "%1: cannot create whole-file region from pending capture sources"
msgstr ""
"%1: kann aus vorläufigen Aufnahmequellen keine Region für die komplette "
"Datei erzeugen"
-#: audio_library.cc:71
+#: audio_library.cc:81
msgid "Could not open %1. Audio Library not saved"
msgstr "Konnte %1 nicht öffnen. Die Audio-Bibliothek wurde nicht gesichert"
@@ -134,11 +134,11 @@ msgstr "schlecht geformtes XML in importierter Wiedergabeliste"
msgid "Audio Playlists (unused)"
msgstr "Audio-Wiedergabelisten (unbenutzt)"
-#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529
+#: audio_playlist_source.cc:171 audiosource.cc:891 file_source.cc:520
#: midi_playlist_source.cc:144 midi_playlist_source.cc:152
-#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643
-#: rb_effect.cc:333 session.cc:2619 session.cc:2652 session.cc:3797
-#: session_handle.cc:87 sndfilesource.cc:121
+#: midi_playlist_source.cc:159 midi_source.cc:370 plugin_insert.cc:634
+#: rb_effect.cc:333 session.cc:2636 session.cc:2669 session.cc:3814
+#: session_handle.cc:87 sndfilesource.cc:122
msgid "programming error: %1"
msgstr "Programmierfehler: %1"
@@ -166,23 +166,23 @@ msgstr ""
"\n"
"Kanäle: "
-#: audio_track.cc:167
+#: audio_track.cc:161
msgid "Unknown bundle \"%1\" listed for input of %2"
msgstr "Unbekanntes Bündel \"%1\" für Eingang von %2 genannt"
-#: audio_track.cc:169
+#: audio_track.cc:163
msgid "in 1"
msgstr "in 1"
-#: audio_track.cc:170
+#: audio_track.cc:164
msgid "No input bundles available as a replacement"
msgstr "Es gibt keine als Ersatz geeigneten Eingangs-Bündel"
-#: audio_track.cc:174
+#: audio_track.cc:168
msgid "Bundle %1 was not available - \"in 1\" used instead"
msgstr "Bündel %1 war nicht verfügbar - verwende statt dessen \"in 1\""
-#: audio_track.cc:183
+#: audio_track.cc:177
msgid "improper input channel list in XML node (%1)"
msgstr "XML-Knoten (%1) enthält ungeeignete Liste der Eingangskanäle"
@@ -206,23 +206,23 @@ msgstr "kann VAMP-Plugin \"%1\" nicht laden"
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr "VAMP-Plugin \"%1\" konnte nicht geladen werden"
-#: audioengine.cc:488
+#: audioengine.cc:495
msgid "looking for backends in %1\n"
msgstr "Suche nach Backends in %1\n"
-#: audioengine.cc:511
+#: audioengine.cc:518
msgid "AudioEngine: cannot load module \"%1\" (%2)"
msgstr "AudioEngine: kann Modul \"%1\" nicht laden (%2)"
-#: audioengine.cc:517
+#: audioengine.cc:524
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr "AudioEngine: Backend an \"%1\" hat keine Beschreibungsfunktion."
-#: audioengine.cc:589
+#: audioengine.cc:596
msgid "Could not create backend for %1: %2"
msgstr "Konnte Backend für %1 nicht erzeugen: %2"
-#: audioregion.cc:1643
+#: audioregion.cc:1651
msgid ""
"You have requested an operation that requires audio analysis.\n"
"\n"
@@ -248,11 +248,11 @@ msgstr ""
"und zukünftigen Operation(en) zur Transienten-Bestimmung eine leichte "
"Verzögerung bemerken.\n"
-#: audiosource.cc:199
+#: audiosource.cc:210
msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
msgstr "kann Peakfile für %1 nicht von %2 auf %3 umbenennen (%4)"
-#: audiosource.cc:226
+#: audiosource.cc:239
msgid "AudioSource: cannot stat peakfile \"%1\""
msgstr "AudioSource: Peakfile \"%1\" nicht auffindbar"
@@ -260,49 +260,72 @@ msgstr "AudioSource: Peakfile \"%1\" nicht auffindbar"
msgid "cannot read sample data for unscaled peak computation"
msgstr "kann Sampledaten für unskalierte Peaks-Berechnung nicht lesen"
-#: audiosource.cc:387
+#: audiosource.cc:386
msgid "AudioSource: cannot open peakpath (a) \"%1\" (%2)"
msgstr "AudioSource: kann Pfad für Peaks (a) \"%1\" nicht öffnen (%2)"
-#: audiosource.cc:463
+#: audiosource.cc:395 audiosource.cc:473
+msgid ""
+"AudioSource: could not seek to correct location in peak file \"%1\" (%2)"
+msgstr ""
+"AudioSource: konnte in der Peakdatei \"%1\" nicht an die korrekte Stelle "
+"springen (%2)"
+
+#: audiosource.cc:453
msgid "AudioSource: cannot open peakpath (b) \"%1\" (%2)"
msgstr "AudioSource: kann Pfad für Peaks (b) \"%1\" nicht öffnen (%2)"
-#: audiosource.cc:587
+#: audiosource.cc:567
msgid ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
msgstr ""
-"AudioSource[%1]: peak read - kann %2 Samples bei Offset %3 von %4 nicht lesen"
-"(%5)"
+"AudioSource[%1]: peak read - kann %2 Samples bei Offset %3 von %4 nicht "
+"lesen(%5)"
-#: audiosource.cc:667
+#: audiosource.cc:634
msgid "%1: could not write read raw data for peak computation (%2)"
msgstr "%1: konnte Rohdaten für Peakberechnung nicht lesen/schreiben (%2)"
-#: audiosource.cc:706
+#: audiosource.cc:672
msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
msgstr "AudioSource: kann Pfad für Peaks (c) \"%1\" nicht öffnen (%2)"
-#: audiosource.cc:773 audiosource.cc:886
+#: audiosource.cc:739 audiosource.cc:861
+msgid "%1: could not seek in peak file data (%2)"
+msgstr "%1: konnte in den Daten der Peakdatei nicht suchen (%2)"
+
+#: audiosource.cc:744 audiosource.cc:870
msgid "%1: could not write peak file data (%2)"
msgstr "%1: konnte Peak-Daten nicht in Datei schreiben (%2)"
-#: audiosource.cc:924
+#: audiosource.cc:903
msgid "could not truncate peakfile %1 to %2 (error: %3)"
msgstr "konnte Peakdatei %1 nicht auf %2 kürzen (Fehler: %3)"
-#: auditioner.cc:87
+#: auditioner.cc:95
+msgid "Falling back to Reasonable Synth for Midi Audition"
+msgstr "Greife fürs MIDI-Vorhören auf Reasonable Synth zurück"
+
+#: auditioner.cc:97
+msgid "No synth for midi-audition found."
+msgstr "Keinen Synth zum MIDI-Vorhören gefunden."
+
+#: auditioner.cc:152
msgid "no outputs available for auditioner - manual connection required"
msgstr "Keine Ausgänge für Abhöre verfügbar - manuelle Verbindung erforderlich"
-#: auditioner.cc:135
-msgid "Auditioning of non-audio regions not yet supported"
-msgstr "Abhören von Nicht-Audio Regionen wird noch nicht unterstützt"
-
-#: auditioner.cc:160
+#: auditioner.cc:392 auditioner.cc:438
msgid "Cannot setup auditioner processing flow for %1 channels"
msgstr "Kann den Abhör-Signalfluss für %1 Kanäle nicht einrichten"
+#: auditioner.cc:426
+msgid "Failed to load synth for MIDI-Audition."
+msgstr "Konnte Synth zum MIDI-Vorhören nicht laden."
+
+#: auditioner.cc:445
+msgid "Auditioning of regions other than Audio or Midi is not supported."
+msgstr "Vorhören anderer Regionen als Audio oder MIDI wird nicht unterstützt."
+
#: automatable.cc:81
msgid "Automation node has no path property"
msgstr "Automationsknoten hat keine Eigenschaft \"Pfad\""
@@ -341,24 +364,24 @@ msgstr ""
"AutomationList: XML-Knoten mit Namen %1, nicht \"AutomationList\" übergeben "
"- ignoriert"
-#: butler.cc:91
+#: butler.cc:80
msgid "Cannot create transport request signal pipe (%1)"
msgstr "Kann die Signalleitung für Transport-Anforderungen nicht erzeugen (%1)"
-#: butler.cc:97 butler.cc:103
+#: butler.cc:86 butler.cc:92
msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)"
msgstr ""
"UI: kann O_NONBLOCK für die Anforderungsleitung des Butlers nicht setzen (%1)"
-#: butler.cc:109
+#: butler.cc:124
msgid "Session: could not create butler thread"
msgstr "Projekt: konnte Butler-Thread nicht erzeugen"
-#: butler.cc:156
+#: butler.cc:165
msgid "poll on butler request pipe failed (%1)"
msgstr "poll auf die Anforderungsleitung des Butler fehlgeschlagen (%1)"
-#: butler.cc:163
+#: butler.cc:172
msgid "Error on butler thread request pipe: fd=%1 err=%2"
msgstr "Fehler in der Anforderungsleitung des Butler-Threads: fd=%1 err=%2"
@@ -366,56 +389,56 @@ msgstr "Fehler in der Anforderungsleitung des Butler-Threads: fd=%1 err=%2"
msgid "Error reading from butler request pipe"
msgstr "Fehler beim Lesen der Butler-Anforderungsleitung"
-#: butler.cc:248
+#: butler.cc:301
msgid "Butler read ahead failure on dstream %1"
msgstr "Butler-Lesefehler bei dstream %1"
-#: butler.cc:285
+#: butler.cc:338
msgid "Butler write-behind failure on dstream %1"
msgstr "Butler-Schreibfehler bei dstream %1"
-#: control_protocol_manager.cc:134
+#: control_protocol_manager.cc:164
msgid "control protocol name \"%1\" has no descriptor"
msgstr "Kontrollprotokollname \"%1\" hat keine Beschreibung"
-#: control_protocol_manager.cc:141
+#: control_protocol_manager.cc:171
msgid "control protocol name \"%1\" could not be initialized"
msgstr "Kontrollprotokoll \"%1\" konnte nicht initialisiert werden"
-#: control_protocol_manager.cc:201
+#: control_protocol_manager.cc:237
msgid "Instantiating mandatory control protocol %1"
msgstr "Instanziere erforderliches Kontrollprotokoll %1"
-#: control_protocol_manager.cc:222
+#: control_protocol_manager.cc:258
msgid "looking for control protocols in %1\n"
msgstr "suche nach Kontrollprotokollen in %1\n"
-#: control_protocol_manager.cc:247
+#: control_protocol_manager.cc:283
msgid "Control protocol %1 not usable"
msgstr "Kontrollprotokoll %1 nicht benutzbar"
-#: control_protocol_manager.cc:264
+#: control_protocol_manager.cc:300
msgid "Control surface protocol discovered: \"%1\"\n"
msgstr "Protokoll für Kontrolloberfläche entdeckt: \"%1\"\n"
-#: control_protocol_manager.cc:282
+#: control_protocol_manager.cc:318
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
msgstr "ControlProtocolManager: kann Modul \"%1\" nicht laden (%2)"
-#: control_protocol_manager.cc:290
+#: control_protocol_manager.cc:324
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr ""
"ControlProtocolManager: Modul \"%1\" hat keine Funktion zur Beschreibung."
-#: cycle_timer.cc:38
+#: cycle_timer.cc:40
msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
msgstr "CycleTimer::get_mhz(): kann /proc/cpuinfo nicht öffnen"
-#: cycle_timer.cc:50
+#: cycle_timer.cc:52
msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo"
msgstr "CycleTimer::get_mhz(): kann CPU-Takt in /proc/cpuinfo nicht finden"
-#: cycle_timer.cc:73
+#: cycle_timer.cc:75
msgid "cannot locate cpu MHz in /proc/cpuinfo"
msgstr "kann CPU-Takt in /proc/cpuinfo nicht finden"
@@ -423,7 +446,7 @@ msgstr "kann CPU-Takt in /proc/cpuinfo nicht finden"
msgid "audio"
msgstr "Audio"
-#: data_type.cc:28 session.cc:1791 session.cc:1794
+#: data_type.cc:28 session.cc:1808 session.cc:1811
msgid "MIDI"
msgstr "MIDI"
@@ -431,15 +454,15 @@ msgstr "MIDI"
msgid "unknown"
msgstr "unbekannt"
-#: delivery.cc:114
+#: delivery.cc:118
msgid "main outs"
msgstr "Hauptausgänge"
-#: delivery.cc:117 send.cc:61
+#: delivery.cc:121 send.cc:62
msgid "listen"
msgstr "hören"
-#: diskstream.cc:303
+#: diskstream.cc:302
msgid "Location \"%1\" not valid for track loop (start >= end)"
msgstr "Zeitpunkt \"%1\" für Spurschleife ungültig (Start >= Ende)"
@@ -452,25 +475,25 @@ msgstr ""
msgid "Export failed: %1"
msgstr "Export fehlgeschlagen: %1"
-#: export_filename.cc:118
+#: export_filename.cc:119
msgid "Existing export folder for this session (%1) does not exist - ignored"
msgstr ""
"genanntes Exportverzeichnis für dieses Projekt (%1) existiert nicht - "
"ignoriert"
-#: export_filename.cc:229
+#: export_filename.cc:230
msgid "No Time"
msgstr "Keine Zeit"
-#: export_filename.cc:238
+#: export_filename.cc:239
msgid "Invalid time format"
msgstr "Ungültiges Zeitformat"
-#: export_filename.cc:247
+#: export_filename.cc:248
msgid "No Date"
msgstr "Kein Datum"
-#: export_filename.cc:262
+#: export_filename.cc:263
msgid "Invalid date format"
msgstr "Ungültiges Datumsformat"
@@ -538,7 +561,7 @@ msgstr "Dreieck"
msgid "Rectangular"
msgstr "Rechteck"
-#: export_formats.cc:52 session.cc:5014 session.cc:5030
+#: export_formats.cc:52 session.cc:5006 session.cc:5022
msgid "None"
msgstr "Kein"
@@ -578,15 +601,15 @@ msgstr "Vorbis-Sampleformat"
msgid "No sample format"
msgstr "Kein Sampleformat"
-#: export_handler.cc:335
+#: export_handler.cc:343
msgid "Editor: cannot open \"%1\" as export file for CD marker file"
msgstr "Editor: kann \"%1\" als Export-Datei für CD-Marker nicht öffnen"
-#: export_handler.cc:417 export_handler.cc:420
+#: export_handler.cc:425 export_handler.cc:428
msgid "an error occured while writing a TOC/CUE file: %1"
msgstr "beim Schreiben einer TOC/CUE Datei trat ein Fehler auf:%1"
-#: export_handler.cc:642 export_handler.cc:700
+#: export_handler.cc:650 export_handler.cc:708
msgid "Cannot convert %1 to Latin-1 text"
msgstr "Kann %1 nicht zu Latin-1 Kodierung konvertieren"
@@ -652,7 +675,7 @@ msgstr ""
"% unterstützt nur %2 Kanäle, in Ihrer Kanalkonfiguration befinden sich "
"jedoch %3 Kanäle"
-#: file_source.cc:198 session_state.cc:2807
+#: file_source.cc:198 session_state.cc:2843
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr ""
@@ -662,32 +685,31 @@ msgstr ""
msgid "cannot rename file source from %1 to %2 (%3)"
msgstr "Kann Quelldatei nicht von %1 nach %2 umbenennen (%3)"
-#: file_source.cc:250 file_source.cc:378
+#: file_source.cc:248 file_source.cc:372
msgid "FileSource: search path not set"
msgstr "Dateiquelle: Suchpfad nicht gesetzt"
-#: file_source.cc:313 file_source.cc:448
-msgid "Filesource: cannot find required file (%1): while searching %2"
-msgstr ""
-"Dateiquelle: kann benötigte Datei (%1) auf der Suche nach %2 nicht finden"
+#: file_source.cc:309 file_source.cc:439
+msgid "Filesource: cannot find required file (%1)"
+msgstr "Filesource: kann benötigte Datei (%1) nicht finden"
-#: file_source.cc:440
+#: file_source.cc:432
msgid ""
-"FileSource: \"%1\" is ambigous when searching %2\n"
+"FileSource: \"%1\" is ambigous when searching\n"
"\t"
msgstr ""
-"Dateiquelle: \"%1\" ist bei der Suche nach %2 mehrdeutig \n"
+"FileSource: \"%1\" ist während der Suche doppeldeutig\n"
"\t"
-#: file_source.cc:494
+#: file_source.cc:484
msgid "Filesource: cannot find required file (%1): %2"
msgstr "Dateiquelle: kann benötigte Datei (%1) nicht finden: %2"
-#: file_source.cc:501
+#: file_source.cc:492
msgid "Filesource: cannot check for existing file (%1): %2"
msgstr "Dateiquelle: kann Datei (%1) nicht auf Existenz überprüfen: %2"
-#: file_source.cc:535
+#: file_source.cc:526
msgid ""
"Programming error! %1 tried to rename a file over another file! It's safe to "
"continue working, but please report this to the developers."
@@ -696,7 +718,7 @@ msgstr ""
"Namen umzubenennen! Sie können weiterarbeiten, aber melden Sie dies bitte "
"den Entwicklern."
-#: file_source.cc:540
+#: file_source.cc:531
msgid "cannot rename file %1 to %2 (%3)"
msgstr "kann Datei %1 nicht nach %2 umbenennen (%3)"
@@ -712,15 +734,15 @@ msgstr ""
"Konfigurationsverzeichnis %1 existiert bereits, ist aber kein Verzeichnis/"
"Ordner - kann nicht starten"
-#: filesystem_paths.cc:91
+#: filesystem_paths.cc:96
msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
msgstr "Umgebungsvariable ARDOUR_DLL_PATH ist nicht gesetzt - beende\n"
-#: filesystem_paths.cc:107
+#: filesystem_paths.cc:125
msgid "ARDOUR_CONFIG_PATH not set in environment - exiting\n"
msgstr "Umgebungsvariable ARDOUR_CONFIG_PATH ist nicht gesetzt - beende\n"
-#: filesystem_paths.cc:127
+#: filesystem_paths.cc:148
msgid "ARDOUR_DATA_PATH not set in environment - exiting\n"
msgstr "Umgebungsvariable ARDOUR_DATA_PATH ist nicht gesetzt - beende\n"
@@ -732,88 +754,84 @@ msgstr "Filter: Fehler beim Erzeugen des neuen Dateinamens aus %1"
msgid "filter: error creating new file %1 (%2)"
msgstr "Filter: Fehler beim Erzeugen der neuen Datei %1 (%2)"
-#: find_session.cc:51
-msgid "Could not resolve path: %1 (%2)"
-msgstr "Konnte den Pfad: %1 nicht auflösen (%2)"
-
-#: find_session.cc:63
+#: find_session.cc:59
msgid "cannot check session path %1 (%2)"
msgstr "Kann Projektpfad %1 nicht überprüfen (%2)"
-#: find_session.cc:89
+#: find_session.cc:85
msgid "cannot check statefile %1 (%2)"
msgstr "Kann die Projektdatei %1 nicht überprüfen (%2)"
-#: find_session.cc:125
+#: find_session.cc:121
msgid "%1 is not a snapshot file"
msgstr "%1 ist keine Schnappschussdatei"
-#: find_session.cc:142
+#: find_session.cc:138
msgid "cannot determine current working directory (%1)"
msgstr "kann momentanes Arbeitsverzeichnis nicht bestimmen (%1)"
-#: find_session.cc:159
+#: find_session.cc:155
msgid "unknown file type for session %1"
msgstr "Unbekannter Dateityp für Projekt %1"
-#: globals.cc:207
+#: globals.cc:216
msgid "Could not set system open files limit to \"unlimited\""
msgstr ""
"Konnte die Systemgrenze für offene Dateien nicht auf \"unbeschränkt\" setzen"
-#: globals.cc:209
+#: globals.cc:218
msgid "Could not set system open files limit to %1"
msgstr "Konnte die Systemgrenze für offene Dateien nicht auf %1 setzen"
-#: globals.cc:213
+#: globals.cc:222
msgid "Your system is configured to limit %1 to only %2 open files"
msgstr "Ihre Systemkonfiguration beschränkt %1 auf nur %2 offene Dateien"
-#: globals.cc:217
+#: globals.cc:226
msgid "Could not get system open files limit (%1)"
msgstr "Konnte die Grenze für offene Dateien nicht erhalten (%1)"
-#: globals.cc:268
+#: globals.cc:280
msgid "Loading configuration"
msgstr "Lade Konfiguration"
-#: import.cc:207
+#: import.cc:208
msgid "Could not find a source for %1 even though we are updating this file!"
msgstr "Konte keine Quelle für %1 finden, obwohl wir diese Datei updaten!"
-#: import.cc:236
+#: import.cc:237
msgid "Unable to create file %1 during import"
msgstr "Kann Datei %1 während des Importierens nicht erzeugen"
-#: import.cc:262
+#: import.cc:263
msgid "Resampling %1 from %2kHz to %3kHz"
msgstr "Resample %1 von %2kHz nach %3kHz"
-#: import.cc:268
+#: import.cc:269
msgid "Copying %1"
msgstr "Kopiere %1"
-#: import.cc:446
+#: import.cc:455
msgid "Track %1 of %2 contained no usable MIDI data"
msgstr "Spur %1 von %2 beinhaltet keine brauchbaren MIDI-Daten"
-#: import.cc:453
+#: import.cc:462
msgid "MIDI file %1 was not readable (no reason available)"
msgstr "MIDI-Datei %1 war unlesbar (keine Ursache ermittelbar)"
-#: import.cc:499
+#: import.cc:508
msgid "Import: cannot open input sound file \"%1\""
msgstr "Import: kann Audiodatei \"%1\" nicht öffnen"
-#: import.cc:510
+#: import.cc:519
msgid "Import: error opening MIDI file"
msgstr "Import: Fehler beim Öffnen der MIDI-Datei"
-#: import.cc:549
+#: import.cc:558
msgid "Loading MIDI file %1"
msgstr "Lade MIDI-Datei %1"
-#: import.cc:614
+#: import.cc:623
msgid "Failed to remove some files after failed/cancelled import operation"
msgstr ""
"Konnte einige Dateien nach fehlgeschlagenem/abgebrochenem Import nicht "
@@ -827,121 +845,125 @@ msgstr "Unbekannt"
msgid "preset %1 (bank %2)"
msgstr "Preset %1 (Bank %2)"
-#: internal_send.cc:278 internal_send.cc:279
+#: internal_send.cc:300 internal_send.cc:301
msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
msgstr "%1 - kann Spur/Bus mit der ID %2 zum Verbinden finden"
-#: io.cc:208
+#: io.cc:209
msgid "IO: cannot disconnect port %1 from %2"
msgstr "IO: kann Port %1 nicht von %2 trennen"
-#: io.cc:343 io.cc:428
+#: io.cc:344 io.cc:431
msgid "IO: cannot register input port %1"
msgstr "IO: kann Eingangsport %1 nicht registrieren"
-#: io.cc:348 io.cc:433
+#: io.cc:349 io.cc:436
msgid "IO: cannot register output port %1"
msgstr "IO: kann Ausgangsport %1 nicht registrieren"
-#: io.cc:591 io.cc:647
+#: io.cc:598 io.cc:654
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr "unkorrekter XML-Knoten \"%1\" an IO Objekt weitergereicht"
-#: io.cc:706
+#: io.cc:713
msgid "in"
msgstr "in"
-#: io.cc:706
+#: io.cc:713
msgid "out"
msgstr "out"
-#: io.cc:707
+#: io.cc:714
msgid "input"
msgstr "Eingang"
-#: io.cc:707
+#: io.cc:714
msgid "output"
msgstr "Ausgang"
-#: io.cc:717
+#: io.cc:724
msgid "Unknown bundle \"%1\" listed for %2 of %3"
msgstr "Unbekanntes Bündel \"%1\" für %2 von %3 genannt"
-#: io.cc:783
+#: io.cc:790
msgid "Bundle %1 was not available - \"%2\" used instead"
msgstr "Bündel %1 war nicht verfügbar - verwende stattdessen \"%2\" "
-#: io.cc:786
+#: io.cc:793
msgid "No %1 bundles available as a replacement"
msgstr "%1 Bündel nicht als Ersatz verfügbar"
-#: io.cc:889
+#: io.cc:896
msgid "%1: cannot create I/O ports"
msgstr "%1: kann keine E/A-Ports erzeugen"
-#: io.cc:1017 io.cc:1121
+#: io.cc:1024 io.cc:1128
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr "IO: schlecht geformte Zeichenkette in XML-Knoten für Eingänge \"%1\""
-#: io.cc:1022 io.cc:1126
+#: io.cc:1029 io.cc:1133
msgid "bad input string in XML node \"%1\""
msgstr "IO: schlechte Zeichenkette für Eingang in XML-Knoten \"%1\""
-#: io.cc:1060
+#: io.cc:1067
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr "IO: schlecht geformte Zeichenkette in XML-Knoten für Ausgänge \"%1\""
-#: io.cc:1065
+#: io.cc:1072
msgid "IO: bad output string in XML node \"%1\""
msgstr "IO: schlechte Zeichenkette für Ausgang in XML-Knoten \"%1\""
-#: io.cc:1411
+#: io.cc:1417
#, c-format
msgid "%s %u"
msgstr "%s %u"
-#: io.cc:1458
+#: io.cc:1464
#, c-format
msgid "%s in"
msgstr "%s in"
-#: io.cc:1460
+#: io.cc:1466
#, c-format
msgid "%s out"
msgstr "%s out"
-#: io.cc:1535 session.cc:686 session.cc:715
+#: io.cc:1541 session.cc:689 session.cc:718
msgid "mono"
msgstr "Mono"
-#: io.cc:1537 session.cc:699 session.cc:729
+#: io.cc:1543 session.cc:702 session.cc:732
msgid "L"
msgstr "L"
-#: io.cc:1537 session.cc:701 session.cc:731
+#: io.cc:1543 session.cc:704 session.cc:734
msgid "R"
msgstr "R"
-#: io.cc:1539 io.cc:1545
+#: io.cc:1545 io.cc:1551
#, c-format
msgid "%d"
msgstr "%d"
-#: ladspa_plugin.cc:86
+#: ladspa_plugin.cc:93
+msgid "LADSPA: Unable to open module: "
+msgstr "LADSPA: Kann Modul nicht öffnen: "
+
+#: ladspa_plugin.cc:99
msgid "LADSPA: module has no descriptor function."
msgstr "LADSPA: Modul hat keine Beschreibungsfunktion"
-#: ladspa_plugin.cc:91
+#: ladspa_plugin.cc:106
msgid "LADSPA: plugin has gone away since discovery!"
msgstr "LADSPA: Plugin ist nicht mehr auffindbar!"
-#: ladspa_plugin.cc:98
+#: ladspa_plugin.cc:113
msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
msgstr ""
"LADSPA: \"%1\" kann nicht verwendet werdeen, da es kein \"inplace processing"
"\" beherrscht"
-#: ladspa_plugin.cc:297
+#: ladspa_plugin.cc:311
msgid ""
"illegal parameter number used with plugin \"%1\". This may indicate a change "
"in the plugin design, and presets may be invalid"
@@ -949,35 +971,31 @@ msgstr ""
"Falsche Parameterzahl für Plugin \"%1\". Das auf eine Änderung im Plugin-"
"Design hindeuten, und Presets sind eventuell ungültig"
-#: ladspa_plugin.cc:376 ladspa_plugin.cc:426
+#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr "Schlechter Knoten an LadspaPlugin::set_state gesendet"
-#: ladspa_plugin.cc:391 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
msgid "LADSPA: no ladspa port number"
msgstr "LADSPA: keine LADSPA-Portnummer"
-#: ladspa_plugin.cc:397 ladspa_plugin.cc:446
+#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
msgid "LADSPA: no ladspa port data"
msgstr "LADSPA: keine LADSPA-Portdaten"
-#: ladspa_plugin.cc:717
-msgid "LADSPA: cannot load module from \"%1\""
-msgstr "LADSPA: kann Modul nicht aus \"%1\" laden"
-
-#: ladspa_plugin.cc:827
+#: ladspa_plugin.cc:840
msgid "Could not locate HOME. Preset not removed."
msgstr "Konnte HOME nicht eruieren. Preset nicht entfernt."
-#: ladspa_plugin.cc:864 ladspa_plugin.cc:870
+#: ladspa_plugin.cc:879 ladspa_plugin.cc:885
msgid "Could not create %1. Preset not saved. (%2)"
msgstr "Konnte %1 nicht erzeugen. Preset nicht gesichert. (%2)"
-#: ladspa_plugin.cc:877
+#: ladspa_plugin.cc:892
msgid "Error saving presets file %1."
msgstr "Fehler beim Sichern der Preset-Datei %1."
-#: ladspa_plugin.cc:915
+#: ladspa_plugin.cc:934
msgid "Could not locate HOME. Preset not saved."
msgstr "Konnte HOME nicht eruieren. Preset nicht gesichert."
@@ -1019,7 +1037,7 @@ msgstr ""
msgid "incorrect XML mode passed to Locations::set_state"
msgstr "unkorrekter XML-Modus an Locations::set_state weitergereicht"
-#: location.cc:842 session.cc:4516 session_state.cc:1031
+#: location.cc:842 session.cc:4533 session_state.cc:1025
msgid "session"
msgstr "Projekt"
@@ -1087,43 +1105,42 @@ msgstr ""
"Die Frameraten von Projekt und LTC unterscheiden sich: LTC: %1 Projekt: %2."
#: ltc_slave.cc:591
-#, c-format
msgid "flywheel"
msgstr "Schwungrad"
-#: midi_diskstream.cc:167
+#: midi_diskstream.cc:166
msgid ""
"%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
msgstr ""
"%1: E/A-Konfigurationsänderung %4 will %2 verwenden, aber Kanalzahl ist %3"
-#: midi_diskstream.cc:219
+#: midi_diskstream.cc:218
msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
msgstr "MidiDiskstream: Wiedergabeliste \"%1\" ist keine MIDI-Wiedergabeliste"
-#: midi_diskstream.cc:270
+#: midi_diskstream.cc:269
msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
msgstr "MidiDiskstream %1: es gibt keine Wiedergabeliste zum Kopieren!"
-#: midi_diskstream.cc:699
+#: midi_diskstream.cc:698
msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
"MidiDiskstream %1: kann %2 nicht von Wiedergabeliste bei Frame %3 lesen"
-#: midi_diskstream.cc:834
+#: midi_diskstream.cc:833
msgid "MidiDiskstream %1: cannot write to disk"
msgstr "MidiDiskstream %1: kann nicht auf Disk schreiben"
-#: midi_diskstream.cc:868
+#: midi_diskstream.cc:867
msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
"MidiDiskstream \"%1\": kann aufgenommene Daten nicht auf Disk schreiben!"
-#: midi_diskstream.cc:955
+#: midi_diskstream.cc:954
msgid "%1: could not create region for complete midi file"
msgstr "%1: konnte Region für die komplette MIDI-Datei nicht erzeugen"
-#: midi_diskstream.cc:992
+#: midi_diskstream.cc:991
msgid "MidiDiskstream: could not create region for captured midi!"
msgstr "MidiDiskstream: konnte Region für aufgenommenes MIDI nicht erzeugen"
@@ -1138,27 +1155,27 @@ msgstr ""
"Keine SysExID für die Änderung der Eigenschaft \"sys-ex\" gefunden - "
"ignoriert"
-#: midi_model.cc:2010
+#: midi_model.cc:2012
msgid "transpose"
msgstr "transponieren"
-#: midi_patch_manager.cc:126
+#: midi_patch_manager.cc:127
msgid "Duplicate MIDI device `%1' in `%2' ignored"
msgstr "Doppeltes MIDI-Gerät '%1' in '%2' ignoriert"
-#: midi_source.cc:125
+#: midi_source.cc:124
msgid "Missing parameter property on InterpolationStyle"
msgstr "Fehlende Eigenschaft \"parameter\" bei InterpolationStyle"
-#: midi_source.cc:132
+#: midi_source.cc:131
msgid "Missing style property on InterpolationStyle"
msgstr "Fehlende Eigenschaft \"style\" bei InterpolationStyle"
-#: midi_source.cc:144
+#: midi_source.cc:143
msgid "Missing parameter property on AutomationState"
msgstr "Fehlende Eigenschaft \"parameter\" bei AutomationState"
-#: midi_source.cc:151
+#: midi_source.cc:150
msgid "Missing state property on AutomationState"
msgstr "Fehlende Eigenschaft \"state\" bei AutomationState"
@@ -1202,11 +1219,11 @@ msgstr "Polaritätsschalter"
msgid "solo control"
msgstr "Solo-Schalter"
-#: mtc_slave.cc:238
+#: mtc_slave.cc:240
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr "MTC Slave: Fehler beim atomisches Lesen der momentanen Zeit, schlafe!"
-#: mtc_slave.cc:361
+#: mtc_slave.cc:362
msgid ""
"Unknown rate/drop value %1 in incoming MTC stream, session values used "
"instead"
@@ -1214,11 +1231,11 @@ msgstr ""
"Unbekannter Wert %1 für Rate/Abfall in eingehendem MTC-Datenstrom, verwende "
"Projektwerte"
-#: mtc_slave.cc:381
+#: mtc_slave.cc:382
msgid "Session framerate adjusted from %1 TO: MTC's %2."
msgstr "Projekt-Framerate von %1 auf die von MTC: %2 geändert"
-#: mtc_slave.cc:395
+#: mtc_slave.cc:396
msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
msgstr "Framerate von Projekt und MTC stimmen nicht überein: MTC: %1 %2: %3"
@@ -1278,31 +1295,35 @@ msgstr "Region mit fixierter Zeit kopieren"
msgid "Pannable given XML data for %1 - ignored"
msgstr "Pannerziel bekam XML-Daten für %1 übergeben - ignoriert"
-#: panner_manager.cc:76
-msgid "looking for panners in %1"
-msgstr "Suche nach Pannern in %1"
+#: panner_manager.cc:80
+msgid "looking for panners in %1\n"
+msgstr "suche nach Pannern in %1\n"
-#: panner_manager.cc:100
-msgid "Panner discovered: \"%1\" in %2"
-msgstr "Panner gefunden: \"%1\" in %2"
+#: panner_manager.cc:108
+msgid "Panner discovered: \"%1\" in %2\n"
+msgstr "Panner gefunden: \"%1\" in %2\n"
-#: panner_manager.cc:117
+#: panner_manager.cc:125
msgid "PannerManager: cannot load module \"%1\" (%2)"
msgstr "PannerManager: kann Modul \"%1\" nicht laden (%2)"
-#: panner_manager.cc:124
+#: panner_manager.cc:132
msgid "PannerManager: module \"%1\" has no descriptor function."
msgstr "PannerManager: Modul \"%1\" hat keine Beschreibungsfunktion"
-#: panner_manager.cc:187
+#: panner_manager.cc:219
msgid "no panner discovered for in/out = %1/%2"
msgstr "keinen Panner für %1/%2 Ein/Ausgänge gefunden"
-#: panner_shell.cc:179
+#: panner_shell.cc:126
+msgid "select panner: %1\n"
+msgstr "wähle Panner: %1\n"
+
+#: panner_shell.cc:245
msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
msgstr "Unbekanntes Panner-Plugin \"%1\" in Pan-Status gefunden - ignoriert"
-#: panner_shell.cc:185
+#: panner_shell.cc:251
msgid "panner plugin node has no type information!"
msgstr "Panner Plugin-Knoten hat keine Typinformation!"
@@ -1324,7 +1345,7 @@ msgstr ""
"Konnte die Wiedergabeliste nicht aus den Quelldaten des Projekts "
"konstruieren!"
-#: plugin.cc:324
+#: plugin.cc:328
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
@@ -1332,7 +1353,7 @@ msgstr ""
"Pluginpresets werden in diesem %1-Binärpaket nicht unterstützt. Erwägen Sie, "
"für die Vollversion zu bezahlen"
-#: plugin.cc:398
+#: plugin.cc:402
msgid ""
"Saving plugin settings is not supported in this build of %1. Consider paying "
"for the full version"
@@ -1340,7 +1361,7 @@ msgstr ""
"Das Speichern von Pluginpresets werden in diesem %1-Binärpaket nicht "
"unterstützt. Erwägen Sie, für die Vollversion zu bezahlen"
-#: plugin_insert.cc:598
+#: plugin_insert.cc:589
msgid "programming error: "
msgstr "Programmierfehler:"
@@ -1377,23 +1398,23 @@ msgid "PluginInsert: automatable control %1 not found - ignored"
msgstr ""
"PluginInsert: automatisierbares Kontrollelement %1 nicht gefunden - ignoriert"
-#: plugin_manager.cc:161
+#: plugin_manager.cc:165
msgid "Discovering Plugins"
msgstr "Finde Plugins"
-#: plugin_manager.cc:335
+#: plugin_manager.cc:286
msgid "Could not parse rdf file: %1"
msgstr "Konnte RDF-Datei: %1 nicht parsen"
-#: plugin_manager.cc:374
+#: plugin_manager.cc:330
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr "LADSPA: kann Modul \"%1\" nicht laden (%2)"
-#: plugin_manager.cc:381
+#: plugin_manager.cc:337
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr "LADSPA: Modul \"%1\" hat keine Beschreibungsfunktion."
-#: plugin_manager.cc:602
+#: plugin_manager.cc:567
msgid ""
"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
"at this time"
@@ -1401,7 +1422,7 @@ msgstr ""
"VST-Plugin %1 unterstützt kein processReplacing und kann daher zur Zeit "
"nicht mit %2 benützt werden"
-#: plugin_manager.cc:709
+#: plugin_manager.cc:680
msgid ""
"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
"in %2 at this time"
@@ -1409,15 +1430,15 @@ msgstr ""
"linuxVST-Plugin %1 unterstützt kein processReplacing und kann daher zur Zeit "
"nicht mit %2 benützt werden"
-#: plugin_manager.cc:870
+#: plugin_manager.cc:841
msgid "unknown plugin status type \"%1\" - all entries ignored"
msgstr "unbekannter Plugin-Statustyp \"%1\" - alle Einträge ignoriert"
-#: plugin_manager.cc:887
+#: plugin_manager.cc:858
msgid "unknown plugin type \"%1\" - ignored"
msgstr "unbekannter Plugintyp \"%1\" - ignoriert"
-#: port.cc:410
+#: port.cc:412
msgid "could not reregister %1"
msgstr "konnte %1 nicht erneut registrieren"
@@ -1425,12 +1446,12 @@ msgstr "konnte %1 nicht erneut registrieren"
msgid "insert %1"
msgstr "%1 einfügen"
-#: port_insert.cc:198
+#: port_insert.cc:197
msgid "XML node describing port insert is missing the `type' field"
msgstr ""
"Dem XML-Knoten zur Beschreibung des Port-Insert fehlt das Feld \"type\""
-#: port_insert.cc:203
+#: port_insert.cc:202
msgid "non-port insert XML used for port plugin insert"
msgstr "Nicht-Port-Insert XML zum Einfügen eines Port-Plugin benutzt"
@@ -1466,11 +1487,11 @@ msgstr "AudioEngine: kann %1 (%2) nicht mit %3 (%4) verbinden"
msgid "Re-establising port %1 failed"
msgstr "Portwiederherstellung fehlgeschlagen"
-#: processor.cc:207
+#: processor.cc:208
msgid "No %1 property flag in element %2"
msgstr "Kein Flag für Eigenschaft \"%1\" in Element %2"
-#: processor.cc:216
+#: processor.cc:217
msgid "No child node with active property"
msgstr "Kein Kindknoten mit der Eigenschaft \"aktiv\""
@@ -1538,11 +1559,11 @@ msgstr "%1 verbunden-%2.1 (%3)"
msgid "cannot create new name for region \"%1\""
msgstr "kann keinen neuen Namen für Region \"%1\" erzeugen"
-#: resampled_source.cc:98
+#: resampled_source.cc:102
msgid "Import: %1"
msgstr "Import: %1"
-#: resampled_source.cc:128
+#: resampled_source.cc:132 srcfilesource.cc:76
msgid "Import: src_new() failed : %1"
msgstr "Import: Fehler in src_new() : %1"
@@ -1550,31 +1571,33 @@ msgstr "Import: Fehler in src_new() : %1"
msgid "return %1"
msgstr "Rückgabewert: %1"
-#: route.cc:1075 route.cc:2528
+#: route.cc:1081 route.cc:2541
msgid "unknown Processor type \"%1\"; ignored"
msgstr "unbekannter Prozessortyp \"%1\"; ignoriert"
-#: route.cc:1087
+#: route.cc:1093
msgid "processor could not be created. Ignored."
msgstr "Prozessor konnte nicht erzeugt werden. Ignoriert."
-#: route.cc:1962 route.cc:2187
+#: route.cc:1975 route.cc:2200
msgid "Bad node sent to Route::set_state() [%1]"
msgstr "Schlechter Knoten an Route::set_state() gesendet [%1]"
-#: route.cc:2022
+#: route.cc:2035
msgid "Pannable state found for route (%1) without a panner!"
msgstr "Pannerziel-Status für Route (%1) ohne Panner gefunden!"
-#: route.cc:2096 route.cc:2100 route.cc:2301 route.cc:2305
+#: route.cc:2109 route.cc:2113 route.cc:2314 route.cc:2318
msgid "badly formed order key string in state file! [%1] ... ignored."
msgstr ""
"schlecht geformte Zeichenkette für den Schlüssel der Sortierreihenfolge in "
"der Projektdatei! [%1] ... ignoriert"
-#: route.cc:2311
+#: route.cc:2324
msgid "Converting deprecated order key for %1 using Editor order %2"
msgstr ""
+"Konvertiere veralteten Sortierschlüssel für %1 unter Nutzung der "
+"Editorreihenfolge %2"
#: route_group.cc:459
msgid "You cannot subgroup MIDI tracks at this time"
@@ -1590,15 +1613,15 @@ msgstr ""
msgid "error writing tempo-adjusted data to %1"
msgstr "Fehler beim Schreiben der tempo-angepassten Daten nach %1"
-#: send.cc:59
+#: send.cc:60
msgid "aux %1"
msgstr "Aux %1"
-#: send.cc:63
+#: send.cc:64
msgid "send %1"
msgstr "Send %1"
-#: send.cc:65
+#: send.cc:66
msgid "programming error: send created using role %1"
msgstr "Programmierfehler: Send erzeugt mittels Rolle %1"
@@ -1622,62 +1645,62 @@ msgstr "Klick einrichten"
msgid "Set up standard connections"
msgstr "Richte Standard-Verbindungen ein"
-#: session.cc:635
+#: session.cc:638
msgid "could not setup Click I/O"
msgstr "konnte Metronom-E/A nicht einrichten"
-#: session.cc:683
+#: session.cc:686
#, c-format
msgid "out %<PRIu32>"
msgstr "out %<PRIu32>"
-#: session.cc:697
+#: session.cc:700
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr "out %<PRIu32>+%<PRIu32>"
-#: session.cc:712
+#: session.cc:715
#, c-format
msgid "in %<PRIu32>"
msgstr "in %<PRIu32>"
-#: session.cc:726
+#: session.cc:729
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr "in %<PRIu32>+%<PRIu32>"
-#: session.cc:790
+#: session.cc:793
msgid "cannot connect master output %1 to %2"
msgstr "kann Master-Ausgang %1 nicht mit %2 verbinden"
-#: session.cc:849
+#: session.cc:862
msgid "monitor"
msgstr "Monitor"
-#: session.cc:894
+#: session.cc:907
msgid "cannot connect control input %1 to %2"
msgstr "kann Kontrolleingang %1 nicht mit %2 verbinden"
-#: session.cc:914
+#: session.cc:927
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr "Bevorzugte E/A für den Monitorbus (%1) kann nicht gefunden werden"
-#: session.cc:945
+#: session.cc:958
msgid "cannot connect control output %1 to %2"
msgstr "kann Kontrollausgang %1 nicht mit %2 verbinden"
-#: session.cc:1009
+#: session.cc:1026
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr ""
"Kann das Vorhör-System nicht einrichten: kein Vorhören von Regionen möglich"
-#: session.cc:1193
+#: session.cc:1210
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
"Session: Sie können diese Position nicht für Auto-Punch verwenden (Start <= "
"Ende) "
-#: session.cc:1233
+#: session.cc:1250
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
@@ -1685,15 +1708,15 @@ msgstr ""
"Sie können diese Position nicht für \"automatische Schleife\" verwenden, da "
"sie keine oder eine negative Länge hat"
-#: session.cc:1547
+#: session.cc:1564
msgid "feedback loop setup between %1 and %2"
msgstr "Feedbackschleife zwischen %1 und %2 erkannt"
-#: session.cc:1843
+#: session.cc:1860
msgid "Session: could not create new midi track."
msgstr "Session: konnte keine neue MIDI-Spur erzeugen."
-#: session.cc:1849
+#: session.cc:1866
msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks."
@@ -1701,76 +1724,76 @@ msgstr ""
"Keine JACK-Ports mehr verfügbar. Wenn Sie so viele Spuren benötigen, müssen "
"Sie %1 stoppen und JACK mit mehr Ports neu starten."
-#: session.cc:2026 session.cc:2029
+#: session.cc:2043 session.cc:2046
msgid "Audio"
msgstr "Audio"
-#: session.cc:2053 session.cc:2061 session.cc:2138 session.cc:2146
+#: session.cc:2070 session.cc:2078 session.cc:2155 session.cc:2163
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr "kann %1 ein/%2 aus für neue Audiospur nicht konfigurieren"
-#: session.cc:2084
+#: session.cc:2101
msgid "Session: could not create new audio track."
msgstr "Session: konnte keine neue Audios.pur erzeugen"
-#: session.cc:2116 session.cc:2119
+#: session.cc:2133 session.cc:2136
msgid "Bus"
msgstr "Bus"
-#: session.cc:2169
+#: session.cc:2186
msgid "Session: could not create new audio route."
msgstr "Session: konnte keine neueAudio-Route erzeugen"
-#: session.cc:2228 session.cc:2238
+#: session.cc:2245 session.cc:2255
msgid "Session: UINT_MAX routes? impossible!"
msgstr "Session: UINT_MAX Routen? unmöglich!"
-#: session.cc:2260
+#: session.cc:2277
msgid "Session: cannot create track/bus from template description"
msgstr "Session: Kann die Route aus der Vorlagenbeschreibung nicht erzeugen"
-#: session.cc:2286
+#: session.cc:2303
msgid "Session: could not create new route from template"
msgstr "Session: konnte keine neue Route aus der Vorlage erzeugen."
-#: session.cc:2315
+#: session.cc:2332
msgid "Adding new tracks/busses failed"
msgstr "Fehler beim Hinzufügen neuer Spuren/Busse"
-#: session.cc:3419
+#: session.cc:3436
msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename"
msgstr ""
"FATALER FEHLER! Konnte keine passende Version von %1 zum Umbenennen finden"
-#: session.cc:3539 session.cc:3597
+#: session.cc:3556 session.cc:3614
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr "Es gibt bereits %1 Aufnahmen für %2, was ich als zu viele erachte."
-#: session.cc:3987
+#: session.cc:4004
msgid "send ID %1 appears to be in use already"
msgstr "Send ID %1 ist offenbar schon in Gebrauch"
-#: session.cc:3999
+#: session.cc:4016
msgid "aux send ID %1 appears to be in use already"
msgstr "Aux-Send ID %1 ist offenbar schon in Gebrauch"
-#: session.cc:4011
+#: session.cc:4028
msgid "return ID %1 appears to be in use already"
msgstr "Return ID %1 ist offenbar schon in Gebrauch"
-#: session.cc:4023
+#: session.cc:4040
msgid "insert ID %1 appears to be in use already"
msgstr "Insert ID %1 ist offenbar schon in Gebrauch"
-#: session.cc:4150
+#: session.cc:4167
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr "Kann einen Bereich mit Ende <= Start nicht schreiben (z.B. %1 <= %2)"
-#: session.cc:4179
+#: session.cc:4196
msgid "too many bounced versions of playlist \"%1\""
msgstr "zu viele gebouncete Versionen der Wiedergabeliste \"%1\""
-#: session.cc:4189
+#: session.cc:4206
msgid "cannot create new audio file \"%1\" for %2"
msgstr "kann keine neue Audiodatei \"%1\" für %2 erzeugen"
@@ -1811,7 +1834,7 @@ msgstr "Kann Projektverzeichnis im Pfad %1 nicht erzeugen. Fehler: %2"
msgid "Session subdirectory does not exist at path %1"
msgstr "Projektunterverzeichnis im Pfad %1 existiert nicht"
-#: session_events.cc:184
+#: session_events.cc:185
msgid "Session: cannot have two events of type %1 at the same frame (%2)."
msgstr ""
"Session: zwei Ereignisse des Typs %1 können nicht im selben Frame existieren "
@@ -1825,7 +1848,7 @@ msgstr "%1: kann für Export nicht Dateiposition %2 aufsuchen"
msgid "Export ended unexpectedly: %1"
msgstr "Export endet unerwartet: %1"
-#: session_ltc.cc:222
+#: session_ltc.cc:221
msgid ""
"LTC encoder: invalid framerate - LTC encoding is disabled for the remainder "
"of this session."
@@ -1833,7 +1856,7 @@ msgstr ""
"LTC-Kodierer: ungültige Framerate - das Kodieren von LTC wird für den "
"restlichen Teil dieses Projekts ausgesetzt."
-#: session_midi.cc:520
+#: session_midi.cc:519
msgid "Session: cannot send quarter-frame MTC message (%1)"
msgstr "Session: kann quarter-frame MTC-Nachricht nicht senden (%1)"
@@ -1845,97 +1868,93 @@ msgstr "Session: kann Wiedergabeliste nicht aus der XML-Beschreibung erzeugen"
msgid "Session: error in no roll for %1"
msgstr "Session: Fehler in no_roll für %1"
-#: session_process.cc:1157
+#: session_process.cc:1159
msgid "Programming error: illegal event type in process_event (%1)"
msgstr "Programmierfehler: illegaler Ereignistyp in process_event (%1)"
-#: session_state.cc:140
-msgid "Could not use path %1 (%2)"
-msgstr "Konnte Pfad %1 nicht benutzen (%2)"
-
-#: session_state.cc:184
+#: session_state.cc:178
msgid "solo cut control (dB)"
msgstr "Solo Cut Einstellung (dB)"
-#: session_state.cc:208
+#: session_state.cc:202
msgid "Set block size and sample rate"
msgstr "Setze Blockgröße und Samplerate"
-#: session_state.cc:213
+#: session_state.cc:207
msgid "Using configuration"
msgstr "Benutze Konfiguration"
-#: session_state.cc:325
+#: session_state.cc:319
msgid "Reset Remote Controls"
msgstr "Fernbedienungen zurücksetzen"
-#: session_state.cc:417
+#: session_state.cc:411
msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
msgstr "Session: kann den Peakfile Ordner \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:424
+#: session_state.cc:418
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr ""
"Session: kann das Projektverzeichnis für Sounddateien \"%1\" nicht erzeugen "
"(%2)"
-#: session_state.cc:431
+#: session_state.cc:425
msgid "Session: cannot create session midi dir \"%1\" (%2)"
msgstr ""
"Session: kann das Projektverzeichnis für MIDI \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:438
+#: session_state.cc:432
msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
msgstr "Session: kann den Mülleimer des Projektes \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:445
+#: session_state.cc:439
msgid "Session: cannot create session export folder \"%1\" (%2)"
msgstr ""
"Session: kann den Projektordner für Exportdateien \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:452
+#: session_state.cc:446
msgid "Session: cannot create session analysis folder \"%1\" (%2)"
msgstr ""
"Session: kann den Projektordner für Analysedaten \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:459
+#: session_state.cc:453
msgid "Session: cannot create session plugins folder \"%1\" (%2)"
msgstr "Session: kann den Projektordner für Plugins \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:466
+#: session_state.cc:460
msgid "Session: cannot create session externals folder \"%1\" (%2)"
msgstr ""
"Session: kann den Projektordner für Externals \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:480
+#: session_state.cc:474
msgid "Session: cannot create session folder \"%1\" (%2)"
msgstr "Session: kann den Projektordner \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:514
+#: session_state.cc:508
msgid "Could not open %1 for writing session template"
msgstr "Konnte %1 nicht zum Schreiben der Projektvorlage öffnen"
-#: session_state.cc:520
+#: session_state.cc:514
msgid "Could not open session template %1 for reading"
msgstr "Konnte Projektvorlage %1 nicht zum Lesen öffnen"
-#: session_state.cc:539
+#: session_state.cc:533
msgid "master"
msgstr "Master"
-#: session_state.cc:600
+#: session_state.cc:594
msgid "Could not remove pending capture state at path \"%1\" (%2)"
msgstr "Konnte vorläufigen Aufnahmestatus im Pfad \"%1\" nicht entfernen (%2)"
-#: session_state.cc:624
+#: session_state.cc:618
msgid "could not rename snapshot %1 to %2 (%3)"
msgstr "Konnte Schnappschuss %1 nicht auf %2 umbenennen (%3)"
-#: session_state.cc:652
+#: session_state.cc:646
msgid "Could not remove session file at path \"%1\" (%2)"
msgstr "Konnte Projektdatei im Pfad \"%1\" nicht entfernen (%2)"
-#: session_state.cc:669
+#: session_state.cc:663
msgid ""
"the %1 audio engine is not connected and state saving would lose all I/O "
"connections. Session not saved"
@@ -1943,140 +1962,140 @@ msgstr ""
"die %1 Audio-Engine ist nicht verbunden, beim Sichern würden Sie daher alle "
"E/A-Verbindungen verlieren. Projekt nicht gesichert"
-#: session_state.cc:720
+#: session_state.cc:714
msgid "state could not be saved to %1"
msgstr "Status konnte nicht nach %1 gesichert werden"
-#: session_state.cc:722 session_state.cc:733
+#: session_state.cc:716 session_state.cc:727
msgid "Could not remove temporary session file at path \"%1\" (%2)"
msgstr "Konnte temporäre Projektdatei im Pfad \"%1\" nicht entfernen (%2)"
-#: session_state.cc:730
-msgid "could not rename temporary session file %1 to %2"
-msgstr "Konnte temporäre Projektdatei %1 nicht nach %2 umbenennen"
+#: session_state.cc:724
+msgid "could not rename temporary session file %1 to %2 (%3)"
+msgstr "konnte temporäre Projektdatei %1 nicht nach %2 umbenennen(%3)"
-#: session_state.cc:798
+#: session_state.cc:792
msgid "%1: session file \"%2\" doesn't exist!"
msgstr "%1: Projektdatei \"%2\" existiert nicht!"
-#: session_state.cc:810
+#: session_state.cc:804
msgid "Could not understand session file %1"
msgstr "Konnte Projektdatei \"%1\" nicht verstehen"
-#: session_state.cc:819
+#: session_state.cc:813
msgid "Session file %1 is not a session"
msgstr "Projektdatei %1 ist kein Projekt"
-#: session_state.cc:1125
+#: session_state.cc:1119
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
"Programmierfehler: Session: Inkorrekter XML-Knoten an send_state() gesendet"
-#: session_state.cc:1179
+#: session_state.cc:1173
msgid "Session: XML state has no options section"
msgstr "Session: XML hat keinen Abschnitt \"options\""
-#: session_state.cc:1184
+#: session_state.cc:1178
msgid "Session: XML state has no metadata section"
msgstr "Session: XML hat keinen Abschnitt \"metadata\""
-#: session_state.cc:1195
+#: session_state.cc:1189
msgid "Session: XML state has no sources section"
msgstr "Session: XML hat keinen Abschnitt \"sources\""
-#: session_state.cc:1202
+#: session_state.cc:1196
msgid "Session: XML state has no Tempo Map section"
msgstr "Session: XML hat keinen Abschnitt \"Tempo Map\""
-#: session_state.cc:1209
+#: session_state.cc:1203
msgid "Session: XML state has no locations section"
msgstr "Session: XML hat keinen Abschnitt \"locations\""
-#: session_state.cc:1235
+#: session_state.cc:1229
msgid "Session: XML state has no Regions section"
msgstr "Session: XML hat keinen Abschnitt \"Regions\""
-#: session_state.cc:1242
+#: session_state.cc:1236
msgid "Session: XML state has no playlists section"
msgstr "Session: XML hat keinen Abschnitt \"playlists\""
-#: session_state.cc:1262
+#: session_state.cc:1256
msgid "Session: XML state has no bundles section"
msgstr "Session: XML hat keinen Abschnitt \"bundles\""
-#: session_state.cc:1274
+#: session_state.cc:1268
msgid "Session: XML state has no diskstreams section"
msgstr "Session: XML hat keinen Abschnitt \"diskstreams\""
-#: session_state.cc:1282
+#: session_state.cc:1276
msgid "Session: XML state has no routes section"
msgstr "Session: XML hat keinen Abschnitt \"routes\""
-#: session_state.cc:1294
+#: session_state.cc:1288
msgid "Session: XML state has no route groups section"
msgstr "Session: XML hat keinen Abschnitt \"route groups\""
-#: session_state.cc:1303
+#: session_state.cc:1297
msgid "Session: XML state has no edit groups section"
msgstr "Session: XML hat keinen Abschnitt \"edit groups\""
-#: session_state.cc:1310
+#: session_state.cc:1304
msgid "Session: XML state has no mix groups section"
msgstr "Session: XML hat keinen Abschnitt \"mix groups\""
-#: session_state.cc:1318
+#: session_state.cc:1312
msgid "Session: XML state has no click section"
msgstr "Session: XML hat keinen Abschnitt \"click\""
-#: session_state.cc:1360
+#: session_state.cc:1354
msgid "Session: cannot create Route from XML description."
msgstr "Session: Kann die Route aus der XML-Beschreibung nicht erzeugen"
-#: session_state.cc:1364
+#: session_state.cc:1358
msgid "Loaded track/bus %1"
msgstr "Spur/Bus %1 wurde geladen"
-#: session_state.cc:1462
+#: session_state.cc:1456
msgid "Could not find diskstream for route"
msgstr "Konnte Diskstream für Route nicht finden"
-#: session_state.cc:1516
+#: session_state.cc:1510
msgid "Session: cannot create Region from XML description."
msgstr "Session: kann Region nicht aus XML-Beschreibung erzeugen"
-#: session_state.cc:1520
+#: session_state.cc:1514
msgid "Can not load state for region '%1'"
msgstr "Kann Status für Region '%1' nicht laden"
-#: session_state.cc:1556
+#: session_state.cc:1550
msgid "Regions in compound description not found (ID's %1 and %2): ignored"
msgstr ""
"Regionen der Verbindungsbeschreibung nicht gefunden (IDs %1 and %2): "
"ignoriert"
-#: session_state.cc:1584
+#: session_state.cc:1578
msgid "Nested source has no ID info in session file! (ignored)"
msgstr ""
"Verschachtelte Quelle hat keine ID-Information in Projektdatei! (ignoriert)"
-#: session_state.cc:1596
+#: session_state.cc:1590
msgid "Cannot reconstruct nested source for region %1"
msgstr "Kann verschachtelte Quelle für Region %1 nicht wiederherstellen"
-#: session_state.cc:1658
+#: session_state.cc:1652
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr ""
"Session: XML-Knoten zur Beschreibung einer Audioregion ist unvollständig "
"(Quelle fehlt)"
-#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707
+#: session_state.cc:1660 session_state.cc:1681 session_state.cc:1701
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
"Session: XML-Knoten zur Beschreibung einer Audioregion referenziert eine "
"unbekannte Quell-ID =%1"
-#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713
+#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
@@ -2084,7 +2103,7 @@ msgstr ""
"Session: XML-Knoten zur Beschreibung einer Audioregion referenziert eine "
"Nicht-Audio Quell-ID =%1"
-#: session_state.cc:1736
+#: session_state.cc:1730
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
@@ -2092,27 +2111,27 @@ msgstr ""
"Session: dem XML-Knoten zur Beschreibung einer Audioregion fehlen einige "
"Hauptquellen; ignoriert"
-#: session_state.cc:1770
+#: session_state.cc:1764
msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
msgstr ""
"Session: XML-Knoten zur Beschreibung einer MIDI-Region ist unvollständig "
"(Quelle fehlt)"
-#: session_state.cc:1778
+#: session_state.cc:1772
msgid ""
"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
msgstr ""
"Session: XML-Knoten zur Beschreibung einer MIDI-Region referenziert eine "
"unbekannte Quell-ID =%1"
-#: session_state.cc:1784
+#: session_state.cc:1778
msgid ""
"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
msgstr ""
"Session: XML-Knoten zur Beschreibung einer MIDI-Region referenziert eine "
"Nicht-MIDI Quell-ID =%1"
-#: session_state.cc:1852
+#: session_state.cc:1846
msgid ""
"cannot create new file from region name \"%1\" with ident = \"%2\": too many "
"existing files with similar names"
@@ -2120,109 +2139,105 @@ msgstr ""
"kann keine neue Datei aus dem Regionennamen \"%1\" mit ident = \"%2\" "
"erzeugen: zu viele Dateien mit ähnlichen Namen existieren"
-#: session_state.cc:1875
+#: session_state.cc:1869
msgid "Session: cannot create Source from XML description."
msgstr "Session: Kann Quelle aus der XML-Beschreibung nicht erzeugen"
-#: session_state.cc:1909
+#: session_state.cc:1903
msgid "A sound file is missing. It will be replaced by silence."
msgstr "Eine Audiodatei fehlt. Sie wird durch Stille ersetzt werden."
-#: session_state.cc:1932
+#: session_state.cc:1926
msgid "Found a sound file that cannot be used by %1. Talk to the progammers."
msgstr ""
"Eine nicht mit %1 benutzbare Audiodatei wurde gefunden. Sprechen Sie mit den "
"Programmierern."
-#: session_state.cc:1949
+#: session_state.cc:1943
msgid "Could not create templates directory \"%1\" (%2)"
msgstr "Konnte Vorlagenverzeichnis \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:1962
+#: session_state.cc:1956
msgid "Template \"%1\" already exists - new version not created"
msgstr "Vorlage \"%1\" existiert bereits - neue Version wurde nicht erzeugt"
-#: session_state.cc:1968
+#: session_state.cc:1962
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr "Konnte kein Verzeichnis für Projektvorlage \"%1\" erzeugen (%2)"
-#: session_state.cc:1978
+#: session_state.cc:1972
msgid "template not saved"
msgstr "Vorlage nicht gesichert"
-#: session_state.cc:1988
+#: session_state.cc:1982
msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
msgstr ""
"Konnte Verzeichnis für Projektvorlagen-Pluginstatus \"%1\" nicht erzeugen "
"(%2)"
-#: session_state.cc:2183
+#: session_state.cc:2225
msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr "Unbekannter Knoten \"%1\" in Bündelliste der Projektdatei gefunden"
-#: session_state.cc:2725 session_state.cc:2731
-msgid "Cannot expand path %1 (%2)"
-msgstr "Kann Pfad %1 nicht expandieren (%2)"
-
-#: session_state.cc:2784
+#: session_state.cc:2820
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr "Session: kann den Mülleimer \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:2823
+#: session_state.cc:2859
msgid "cannot rename unused file source from %1 to %2 (%3)"
msgstr "kann unbenutzte Dateiquelle nicht von %1 nach %2 umbenennen (%3)"
-#: session_state.cc:2841
+#: session_state.cc:2877
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr "kann Peakdatei %1 für %2 nicht entfernen (%3)"
-#: session_state.cc:3143
+#: session_state.cc:3179
msgid "could not backup old history file, current history not saved"
msgstr ""
"konnte kein Backup der alten Aktionsliste erstellen, momentane Aktionsliste "
"ungesichert"
-#: session_state.cc:3156
+#: session_state.cc:3192
msgid "history could not be saved to %1"
msgstr "Aktionsliste konnte nicht nach %1 gesichert werden"
-#: session_state.cc:3159
+#: session_state.cc:3195
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr "Konnte Aktionslistendatei im Pfad \"%1\" nicht entfernen (%2)"
-#: session_state.cc:3163
+#: session_state.cc:3199
msgid "could not restore history file from backup %1 (%2)"
msgstr "konnte Aktionslistendatei nicht aus dem Backup %1 restaurieren (%2)"
-#: session_state.cc:3188
+#: session_state.cc:3224
msgid "%1: no history file \"%2\" for this session."
msgstr "%1: keine Aktionslistendatei \"%2\" für dieses Projekt."
-#: session_state.cc:3194
+#: session_state.cc:3230
msgid "Could not understand session history file \"%1\""
msgstr "Konnte Projekt-Aktionslistendatei \"%1\" nicht verstehen"
-#: session_state.cc:3236
+#: session_state.cc:3272
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr "MidiSource für NoteDiffCommand nicht auffindbar"
-#: session_state.cc:3247
+#: session_state.cc:3283
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr "MidiSource für SysExDiffCommand nicht auffindbar"
-#: session_state.cc:3258
+#: session_state.cc:3294
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr "MidiSource für PatchChangeDiffCommand nicht auffindbar"
-#: session_state.cc:3266
+#: session_state.cc:3302
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr "Konnte im XML-Knoten \"%1\" keinen Befehl erkennen."
-#: session_state.cc:3502
+#: session_state.cc:3538
msgid "Session: unknown diskstream type in XML"
msgstr "Session: Unbekannter Diskstream im XML"
-#: session_state.cc:3507
+#: session_state.cc:3543
msgid "Session: could not load diskstream via XML state"
msgstr "Session: konnte Diskstream nicht via XML-Status laden"
@@ -2251,122 +2266,122 @@ msgstr ""
"Globales Varispeed ist nicht möglich, solange %1 mit JACK Transport "
"verbunden ist."
-#: smf_source.cc:252
+#: smf_source.cc:262
msgid "Unable to read event prefix, corrupt MIDI ring"
msgstr "Kann Ereignisprefix nicht lesen, korrupter MIDI-Ringbuffer"
-#: smf_source.cc:265
+#: smf_source.cc:275
msgid "Event has time and size but no body, corrupt MIDI ring"
msgstr "time/size gelesen, aber nicht buffer, korrupter MIDI-Ringbuffer"
-#: smf_source.cc:271
+#: smf_source.cc:281
msgid "Event time is before MIDI source position"
msgstr "Event-Zeitpunkt befindet sich vor MIDI Quellposition"
-#: smf_source.cc:306 smf_source.cc:345
+#: smf_source.cc:316 smf_source.cc:355
msgid "Skipping event with unordered time %1"
msgstr "Ãœberspringe Event mit Zeitpunkt %1 ausserhalb der Reihenfolge"
-#: smf_source.cc:410
+#: smf_source.cc:420
msgid "cannot open MIDI file %1 for write"
msgstr "kann MIDI-Datei %1 nicht zum Schreiben öffnen"
-#: sndfile_helpers.cc:32
+#: sndfile_helpers.cc:34
msgid "WAV"
msgstr "WAV"
-#: sndfile_helpers.cc:33
+#: sndfile_helpers.cc:35
msgid "AIFF"
msgstr "AIFF"
-#: sndfile_helpers.cc:34
+#: sndfile_helpers.cc:36
msgid "CAF"
msgstr "CAF"
-#: sndfile_helpers.cc:35
+#: sndfile_helpers.cc:37
msgid "W64 (64 bit WAV)"
msgstr "W64 (64 bit WAV)"
-#: sndfile_helpers.cc:36
+#: sndfile_helpers.cc:38
msgid "FLAC"
msgstr "FLAC"
-#: sndfile_helpers.cc:37
+#: sndfile_helpers.cc:39
msgid "Ogg/Vorbis"
msgstr "Ogg/Vorbis"
-#: sndfile_helpers.cc:38
+#: sndfile_helpers.cc:40
msgid "raw (no header)"
msgstr "raw (no header)"
-#: sndfile_helpers.cc:43
+#: sndfile_helpers.cc:45
msgid ".wav"
msgstr ".wav"
-#: sndfile_helpers.cc:44
+#: sndfile_helpers.cc:46
msgid ".aiff"
msgstr ".aiff"
-#: sndfile_helpers.cc:45
+#: sndfile_helpers.cc:47
msgid ".caf"
msgstr ".caf"
-#: sndfile_helpers.cc:46
+#: sndfile_helpers.cc:48
msgid ".w64"
msgstr ".w64"
-#: sndfile_helpers.cc:47
+#: sndfile_helpers.cc:49
msgid ".flac"
msgstr ".flac"
-#: sndfile_helpers.cc:48
+#: sndfile_helpers.cc:50
msgid ".ogg"
msgstr ".ogg"
-#: sndfile_helpers.cc:49
+#: sndfile_helpers.cc:51
msgid ".raw"
msgstr ".raw"
-#: sndfile_helpers.cc:64
+#: sndfile_helpers.cc:66
msgid "Signed 16 bit PCM"
msgstr "Signed 16 bit PCM"
-#: sndfile_helpers.cc:65
+#: sndfile_helpers.cc:67
msgid "Signed 24 bit PCM"
msgstr "Signed 24 bit PCM"
-#: sndfile_helpers.cc:66
+#: sndfile_helpers.cc:68
msgid "Signed 32 bit PCM"
msgstr "Signed 32 bit PCM"
-#: sndfile_helpers.cc:67
+#: sndfile_helpers.cc:69
msgid "Signed 8 bit PCM"
msgstr "Signed 8 bit PCM"
-#: sndfile_helpers.cc:68
+#: sndfile_helpers.cc:70
msgid "32 bit float"
msgstr "32 bit float"
-#: sndfile_helpers.cc:81
+#: sndfile_helpers.cc:83
msgid "Little-endian (Intel)"
msgstr "Little-endian (Intel)"
-#: sndfile_helpers.cc:82
+#: sndfile_helpers.cc:84
msgid "Big-endian (PowerPC)"
msgstr "Big-endian (PowerPC)"
-#: sndfilesource.cc:201
+#: sndfilesource.cc:210
msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
msgstr "SndFileSource: kann Datei \"%1\" nicht für %2 öffnen (%3)"
-#: sndfilesource.cc:209
+#: sndfilesource.cc:218
msgid ""
"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
"number"
msgstr ""
"SndFileSource: Datei enthält nur %1 Kanäle, %2 ist eine ungültige Kanalzahl"
-#: sndfilesource.cc:255 sndfilesource.cc:571 sndfilesource.cc:595
+#: sndfilesource.cc:264 sndfilesource.cc:604 sndfilesource.cc:628
msgid ""
"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
"for this file"
@@ -2374,67 +2389,71 @@ msgstr ""
"kann Broadcast-Informationen für die Audiodatei %1 nicht setzen (%2); "
"verwerfe Broadcast-Informationen für diese Datei"
-#: sndfilesource.cc:302
+#: sndfilesource.cc:311
msgid "could not allocate file %1 for reading."
msgstr "konnte Datei %1 nicht zum Lesen allozieren"
-#: sndfilesource.cc:337
+#: sndfilesource.cc:346
msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
msgstr "SndFileSource: Konnte in %2 Frame %1 nicht aufsuchen (%3)"
-#: sndfilesource.cc:347
+#: sndfilesource.cc:356
msgid ""
"SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
msgstr ""
"SndFileSource: @ %1 konnte %2 innerhalb %3 nicht lesen (%4) (len = %5, ret "
"war %6)"
-#: sndfilesource.cc:391 sndfilesource.cc:420
+#: sndfilesource.cc:400 sndfilesource.cc:429
msgid "attempt to write a non-writable audio file source (%1)"
msgstr "Versuch, in eine schreibgeschützte Audio-Dateiquelle zu schreiben (%1)"
-#: sndfilesource.cc:396 utils.cc:510 utils.cc:534 utils.cc:548 utils.cc:567
+#: sndfilesource.cc:405 utils.cc:547 utils.cc:571 utils.cc:585 utils.cc:604
msgid "programming error: %1 %2"
msgstr "Programmierfehler: %1 %2"
-#: sndfilesource.cc:523
+#: sndfilesource.cc:532 sndfilesource.cc:562
msgid "attempt to flush a non-writable audio file source (%1)"
msgstr "Versuch, eine schreibgeschützte Audio-Dateiquelle zu leeren (%1)"
-#: sndfilesource.cc:528
+#: sndfilesource.cc:537 sndfilesource.cc:557
msgid "attempt to flush an un-opened audio file source (%1)"
msgstr "Versuch, eine nicht geöffnete Audio-Dateiquelle zu leeren (%1)"
-#: sndfilesource.cc:534
+#: sndfilesource.cc:543
msgid "could not allocate file %1 to write header"
msgstr "konnte Datei %1 nicht allozieren, um den Dateikopf zu schreiben"
-#: sndfilesource.cc:548
+#: sndfilesource.cc:568
+msgid "could not allocate file %1 to flush contents"
+msgstr "konnte Datei %1 nicht allozieren, um Inhalte zu löschen"
+
+#: sndfilesource.cc:581
msgid ""
"attempt to store broadcast info in a non-writable audio file source (%1)"
msgstr ""
"Versuch, Broadcast-Informationen in eine schreibgeschützte Audio-Dateiquelle "
"zu schreiben (%1)"
-#: sndfilesource.cc:553
+#: sndfilesource.cc:586
msgid "attempt to set BWF info for an un-opened audio file source (%1)"
msgstr ""
"Versuch, BWF-Informationen in einer nicht geöffnete Audio-Dateiquelle zu "
"setzen (%1)"
-#: sndfilesource.cc:614
+#: sndfilesource.cc:647
msgid "%1: cannot seek to %2 (libsndfile error: %3)"
msgstr "%1: kann %2 nicht aufsuchen (libsndfile Fehler: %3)"
-#: sndfilesource.cc:727
+#: sndfilesource.cc:760
msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
msgstr "SndFileSource: \"%1\" schlechter Lese-Rückgabewert: %2 von %5 (%3: %4)"
-#: sndfilesource.cc:740 sndfilesource.cc:790 sndfilesource.cc:797
+#: sndfilesource.cc:773 sndfilesource.cc:823 sndfilesource.cc:830
msgid "SndFileSource: \"%1\" bad write (%2)"
msgstr "SndFileSource: \"%1\" schlechter Schreibvorgang (%2)"
-#: sndfilesource.cc:820
+#: sndfilesource.cc:853
msgid ""
"Filesource: start time is already set for existing file (%1): Cannot change "
"start time."
@@ -2442,18 +2461,22 @@ msgstr ""
"Filesource: Startzeit für existierende Datei (%1) ist bereits gesetzt: Kann "
"Startzeit nicht ändern."
-#: speakers.cc:239
+#: speakers.cc:280
msgid "Speaker information is missing azimuth - speaker ignored"
msgstr "Lautsprecher-Information ohne Azimut - Lautsprecher ignoriert"
-#: speakers.cc:245
+#: speakers.cc:286
msgid "Speaker information is missing elevation - speaker ignored"
msgstr "Lautsprecher-Information ohne Elevation - Lautsprecher ignoriert"
-#: speakers.cc:251
+#: speakers.cc:292
msgid "Speaker information is missing distance - speaker ignored"
msgstr "Lautsprecher-Information ohne Distanz - Lautsprecher ignoriert"
+#: srcfilesource.cc:135
+msgid "SrcFileSource: %1"
+msgstr "video_server_dialog.cc:140"
+
#: tape_file_matcher.cc:46
msgid "Cannot compile tape track regexp for use (%1)"
msgstr "Kann regulären Ausdruck der Bandspur nicht zum Gebrauch auswerten (%1)"
@@ -2615,54 +2638,93 @@ msgstr "Knoten für Kanal hat keine Eigenschaft \"type\""
msgid "Node for Port has no \"name\" property"
msgstr "Knoten für Port hat keine Eigenschaft \"name\""
-#: utils.cc:358 utils.cc:382
+#: utils.cc:395 utils.cc:419
msgid "Splice"
msgstr "Schneiden"
-#: utils.cc:360 utils.cc:375
+#: utils.cc:397 utils.cc:412
msgid "Slide"
msgstr "Gleiten"
-#: utils.cc:362 utils.cc:378
+#: utils.cc:399 utils.cc:415
msgid "Lock"
msgstr "Sperren"
-#: utils.cc:365
+#: utils.cc:402
msgid "programming error: unknown edit mode string \"%1\""
msgstr "Programmierfehler: unbekannte Zeichenkette für Editiermodus \"%1\""
-#: utils.cc:389 utils.cc:421
+#: utils.cc:426 utils.cc:458
msgid "MIDI Timecode"
msgstr "MIDI Timecode"
-#: utils.cc:389 utils.cc:419
+#: utils.cc:426 utils.cc:456
msgid "MTC"
msgstr "MTC"
-#: utils.cc:393 utils.cc:428
+#: utils.cc:430 utils.cc:465
msgid "MIDI Clock"
msgstr "MIDI Clock"
-#: utils.cc:397 utils.cc:415 utils.cc:435
+#: utils.cc:434 utils.cc:452 utils.cc:472
msgid "JACK"
msgstr "JACK"
-#: utils.cc:401
+#: utils.cc:438
msgid "programming error: unknown sync source string \"%1\""
msgstr "Programmierfehler: unbekannte Zeichenkette für Sync-Quelle \"%1\""
-#: utils.cc:426
+#: utils.cc:463
msgid "M-Clock"
msgstr "M-Clock"
-#: utils.cc:432
+#: utils.cc:469
msgid "LTC"
msgstr "LTC"
-#: utils.cc:602
+#: utils.cc:639
msgid "programming error: unknown native header format: %1"
msgstr "Programmierfehler: unbekanntes natives Dateikopfformat: %1"
-#: utils.cc:617
+#: utils.cc:654
msgid "cannot open directory %1 (%2)"
msgstr "kann Verzeichnis %1 nicht öffnen (%2)"
+
+#~ msgid "Filesource: cannot find required file (%1): while searching"
+#~ msgstr ""
+#~ "Filesource: kann benötigte Datei (%1) während dieser Suche nicht finden"
+
+#~ msgid "Auditioning of non-audio regions not yet supported"
+#~ msgstr "Abhören von Nicht-Audio Regionen wird noch nicht unterstützt"
+
+#~ msgid "Filesource: cannot find required file (%1): while searching %2"
+#~ msgstr ""
+#~ "Dateiquelle: kann benötigte Datei (%1) auf der Suche nach %2 nicht finden"
+
+#~ msgid ""
+#~ "FileSource: \"%1\" is ambigous when searching %2\n"
+#~ "\t"
+#~ msgstr ""
+#~ "Dateiquelle: \"%1\" ist bei der Suche nach %2 mehrdeutig \n"
+#~ "\t"
+
+#~ msgid "Could not resolve path: %1 (%2)"
+#~ msgstr "Konnte den Pfad: %1 nicht auflösen (%2)"
+
+#~ msgid "LADSPA: cannot load module from \"%1\""
+#~ msgstr "LADSPA: kann Modul nicht aus \"%1\" laden"
+
+#~ msgid "looking for panners in %1"
+#~ msgstr "Suche nach Pannern in %1"
+
+#~ msgid "Panner discovered: \"%1\" in %2"
+#~ msgstr "Panner gefunden: \"%1\" in %2"
+
+#~ msgid "Could not use path %1 (%2)"
+#~ msgstr "Konnte Pfad %1 nicht benutzen (%2)"
+
+#~ msgid "could not rename temporary session file %1 to %2"
+#~ msgstr "Konnte temporäre Projektdatei %1 nicht nach %2 umbenennen"
+
+#~ msgid "Cannot expand path %1 (%2)"
+#~ msgstr "Kann Pfad %1 nicht expandieren (%2)"
diff --git a/libs/ardour/po/el.po b/libs/ardour/po/el.po
index b7b350bdd9..d1fe4d67e0 100644
--- a/libs/ardour/po/el.po
+++ b/libs/ardour/po/el.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: libardour 0.664.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-11-05 11:11-0500\n"
+"POT-Creation-Date: 2014-02-10 17:53+0100\n"
"PO-Revision-Date: 2007-04-16 00:38+0200\n"
"Last-Translator: Klearchos Gourgourinis <muadib@in.gr>\n"
"Language-Team: Hellenic(Greek)\n"
@@ -20,74 +20,74 @@ msgstr ""
msgid "Fader"
msgstr ""
-#: audio_diskstream.cc:244
+#: audio_diskstream.cc:242
msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
msgstr "AudioDiskStream: Η Λίστα \"%1\" δεν είναι ηχητική λίστα αναπαÏ/γής"
-#: audio_diskstream.cc:296
+#: audio_diskstream.cc:294
msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
"AudioDiskstream %1: δεν υπάÏχει λίστα αναπαÏ/γής για να γίνει αντιγÏαφή!"
-#: audio_diskstream.cc:848 audio_diskstream.cc:858
+#: audio_diskstream.cc:846 audio_diskstream.cc:856
msgid ""
"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
msgstr ""
"AudioDiskstream %1: κατα την αναγόμωση, δεν μπόÏεσα να διαβάσω %2 από τη "
"λίστα αναπαÏ/γής στο frame %3"
-#: audio_diskstream.cc:1014
+#: audio_diskstream.cc:1012
msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
"AudioDiskstream %1: δεν μπόÏεσα να διαβάσω %2 από τη λίστα αναπαÏ/γής στο "
"frame %3"
-#: audio_diskstream.cc:1383 audio_diskstream.cc:1400
+#: audio_diskstream.cc:1381 audio_diskstream.cc:1398
msgid "AudioDiskstream %1: cannot write to disk"
msgstr "AudioDiskstream %1: δεν μποÏÏŽ να γÏάψω στο δίσκο"
-#: audio_diskstream.cc:1443
+#: audio_diskstream.cc:1441
msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
"AudioDiskstream \"%1\": αδÏνατη η εκκαθάÏιση δειγματοληπτικών δεδομένων στο "
"δίσκο!"
-#: audio_diskstream.cc:1537
+#: audio_diskstream.cc:1535
msgid "%1: could not create region for complete audio file"
msgstr "%1: δεν μπόÏεσα να δημιουÏγήσω πεÏιοχή για ολόκληÏο audio file"
-#: audio_diskstream.cc:1571
+#: audio_diskstream.cc:1569
msgid "AudioDiskstream: could not create region for captured audio!"
msgstr ""
"AudioDiskstream: δεν μπόÏεσα να δημιουÏγήσω πεÏιοχή για δειγματοληψίες!"
-#: audio_diskstream.cc:1679
+#: audio_diskstream.cc:1677
msgid "programmer error: %1"
msgstr "σφάλμα Ï€ÏογÏαμματιστή: %1"
-#: audio_diskstream.cc:1905
+#: audio_diskstream.cc:1903
msgid "AudioDiskstream: channel %1 out of range"
msgstr "AudioDiskstream: κανάλι %1 εκτός διαστήματος"
-#: audio_diskstream.cc:1919 midi_diskstream.cc:1210
+#: audio_diskstream.cc:1917 midi_diskstream.cc:1209
msgid "%1:%2 new capture file not initialized correctly"
msgstr "%1:%2 νέα δειγματοληψία δεν εκκινήθη σωστά"
-#: audio_diskstream.cc:2200
+#: audio_diskstream.cc:2198
msgid "%1: cannot restore pending capture source file %2"
msgstr "%1: δεν μποÏÏŽ να ανοίξω το αÏχείο %2 από την απαιτοÏμενη πηγή"
-#: audio_diskstream.cc:2222
+#: audio_diskstream.cc:2220
msgid "%1: incorrect number of pending sources listed - ignoring them all"
msgstr "%1: ετυπώθη λανθασμένος αÏιθμός απαιτοÏμενων πηγών - αγνοήθηκαν όλες"
-#: audio_diskstream.cc:2246
+#: audio_diskstream.cc:2244
msgid "%1: cannot create whole-file region from pending capture sources"
msgstr ""
"%1: αδÏνατη η δημιουÏγία ακέÏαιας πεÏιοχής από τις απαιτοÏμενες πηγές "
"ηχοληψίας"
-#: audio_library.cc:71
+#: audio_library.cc:81
msgid "Could not open %1. Audio Library not saved"
msgstr "Δεν μπόÏεσα να ανοίξω το %1. Η Audio Library δεν αποθηκεÏθηκε"
@@ -127,11 +127,11 @@ msgstr ""
msgid "Audio Playlists (unused)"
msgstr ""
-#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529
+#: audio_playlist_source.cc:171 audiosource.cc:891 file_source.cc:520
#: midi_playlist_source.cc:144 midi_playlist_source.cc:152
-#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643
-#: rb_effect.cc:333 session.cc:2619 session.cc:2652 session.cc:3797
-#: session_handle.cc:87 sndfilesource.cc:121
+#: midi_playlist_source.cc:159 midi_source.cc:370 plugin_insert.cc:634
+#: rb_effect.cc:333 session.cc:2636 session.cc:2669 session.cc:3814
+#: session_handle.cc:87 sndfilesource.cc:122
msgid "programming error: %1"
msgstr "σφάλμα Ï€ÏογÏαμματισμοÏ: %1"
@@ -155,23 +155,23 @@ msgid ""
"Channels: "
msgstr ""
-#: audio_track.cc:167
+#: audio_track.cc:161
msgid "Unknown bundle \"%1\" listed for input of %2"
msgstr ""
-#: audio_track.cc:169
+#: audio_track.cc:163
msgid "in 1"
msgstr ""
-#: audio_track.cc:170
+#: audio_track.cc:164
msgid "No input bundles available as a replacement"
msgstr ""
-#: audio_track.cc:174
+#: audio_track.cc:168
msgid "Bundle %1 was not available - \"in 1\" used instead"
msgstr ""
-#: audio_track.cc:183
+#: audio_track.cc:177
msgid "improper input channel list in XML node (%1)"
msgstr "ακατάλληλη λίστα καναλιών εισόδου στον κόμβο XML (%1)"
@@ -195,23 +195,23 @@ msgstr ""
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr ""
-#: audioengine.cc:488
+#: audioengine.cc:495
msgid "looking for backends in %1\n"
msgstr ""
-#: audioengine.cc:511
+#: audioengine.cc:518
msgid "AudioEngine: cannot load module \"%1\" (%2)"
msgstr ""
-#: audioengine.cc:517
+#: audioengine.cc:524
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr ""
-#: audioengine.cc:589
+#: audioengine.cc:596
msgid "Could not create backend for %1: %2"
msgstr ""
-#: audioregion.cc:1643
+#: audioregion.cc:1651
msgid ""
"You have requested an operation that requires audio analysis.\n"
"\n"
@@ -226,11 +226,11 @@ msgid ""
"this and future transient-detection operations.\n"
msgstr ""
-#: audiosource.cc:199
+#: audiosource.cc:210
msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
msgstr "αδÏνατη η μετονομασία του peakfile για %1 από %2 σε %3 (%4)"
-#: audiosource.cc:226
+#: audiosource.cc:239
msgid "AudioSource: cannot stat peakfile \"%1\""
msgstr ""
@@ -239,49 +239,70 @@ msgid "cannot read sample data for unscaled peak computation"
msgstr ""
"δεν μποÏÏŽ να διαβάσω δεδομένα δείγματος για υπολογισμό μη-κλιμακώτου peak"
-#: audiosource.cc:387
+#: audiosource.cc:386
msgid "AudioSource: cannot open peakpath (a) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:463
+#: audiosource.cc:395 audiosource.cc:473
+msgid ""
+"AudioSource: could not seek to correct location in peak file \"%1\" (%2)"
+msgstr ""
+
+#: audiosource.cc:453
msgid "AudioSource: cannot open peakpath (b) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:587
+#: audiosource.cc:567
msgid ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
msgstr ""
-#: audiosource.cc:667
+#: audiosource.cc:634
msgid "%1: could not write read raw data for peak computation (%2)"
msgstr ""
"%1: δεν μποÏεσα να γÏάψω ανεγνωσμένα raw δεδομένα για τον υπολογισμό του "
"peak (%2)"
-#: audiosource.cc:706
+#: audiosource.cc:672
msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:773 audiosource.cc:886
+#: audiosource.cc:739 audiosource.cc:861
+msgid "%1: could not seek in peak file data (%2)"
+msgstr ""
+
+#: audiosource.cc:744 audiosource.cc:870
msgid "%1: could not write peak file data (%2)"
msgstr "%1: δεν μπόÏεσα να γÏάψω δεδομένα του αÏχείου peak (%2)"
-#: audiosource.cc:924
+#: audiosource.cc:903
msgid "could not truncate peakfile %1 to %2 (error: %3)"
msgstr ""
-#: auditioner.cc:87
-msgid "no outputs available for auditioner - manual connection required"
+#: auditioner.cc:95
+msgid "Falling back to Reasonable Synth for Midi Audition"
+msgstr ""
+
+#: auditioner.cc:97
+msgid "No synth for midi-audition found."
msgstr ""
-#: auditioner.cc:135
-msgid "Auditioning of non-audio regions not yet supported"
+#: auditioner.cc:152
+msgid "no outputs available for auditioner - manual connection required"
msgstr ""
-#: auditioner.cc:160
+#: auditioner.cc:392 auditioner.cc:438
msgid "Cannot setup auditioner processing flow for %1 channels"
msgstr ""
+#: auditioner.cc:426
+msgid "Failed to load synth for MIDI-Audition."
+msgstr ""
+
+#: auditioner.cc:445
+msgid "Auditioning of regions other than Audio or Midi is not supported."
+msgstr ""
+
#: automatable.cc:81
msgid "Automation node has no path property"
msgstr ""
@@ -317,23 +338,23 @@ msgid ""
"AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
msgstr ""
-#: butler.cc:91
+#: butler.cc:80
msgid "Cannot create transport request signal pipe (%1)"
msgstr "Δεν μποÏÏŽ να δημιουÏγήσω transport request signal pipe (%1)"
-#: butler.cc:97 butler.cc:103
+#: butler.cc:86 butler.cc:92
msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)"
msgstr "UI: δεν μποÏÏŽ να θέσω O_NONBLOCK στο butler request pipe (%1)"
-#: butler.cc:109
+#: butler.cc:124
msgid "Session: could not create butler thread"
msgstr "ΣυνεδÏία: δεν μπόÏεσα να δημιουÏγήσω δέσμη με τον butler"
-#: butler.cc:156
+#: butler.cc:165
msgid "poll on butler request pipe failed (%1)"
msgstr ""
-#: butler.cc:163
+#: butler.cc:172
msgid "Error on butler thread request pipe: fd=%1 err=%2"
msgstr ""
@@ -341,55 +362,55 @@ msgstr ""
msgid "Error reading from butler request pipe"
msgstr "Σφάλμα στην ανάγνωση από butler request pipe"
-#: butler.cc:248
+#: butler.cc:301
msgid "Butler read ahead failure on dstream %1"
msgstr "Αποτυχία Ï€Ïοανάγνωσης Butler στο dstream %1"
-#: butler.cc:285
+#: butler.cc:338
msgid "Butler write-behind failure on dstream %1"
msgstr "Αποτυχία οπισθεγγÏαφής Butler στο dstream %1"
-#: control_protocol_manager.cc:134
+#: control_protocol_manager.cc:164
msgid "control protocol name \"%1\" has no descriptor"
msgstr "Το όνομα Ï€Ïωτοκόλλου ελέγχου \"%1\" δεν έχει descriptor"
-#: control_protocol_manager.cc:141
+#: control_protocol_manager.cc:171
msgid "control protocol name \"%1\" could not be initialized"
msgstr "Το όνομα Ï€Ïωτοκόλλου ελέγχου \"%1\" ήταν αδÏνατο να αÏχίσει"
-#: control_protocol_manager.cc:201
+#: control_protocol_manager.cc:237
msgid "Instantiating mandatory control protocol %1"
msgstr ""
-#: control_protocol_manager.cc:222
+#: control_protocol_manager.cc:258
msgid "looking for control protocols in %1\n"
msgstr ""
-#: control_protocol_manager.cc:247
+#: control_protocol_manager.cc:283
msgid "Control protocol %1 not usable"
msgstr "ΠÏωτόκολλο ελέγχου %1 μη χÏησιμοποιήσιμο"
-#: control_protocol_manager.cc:264
+#: control_protocol_manager.cc:300
msgid "Control surface protocol discovered: \"%1\"\n"
msgstr ""
-#: control_protocol_manager.cc:282
+#: control_protocol_manager.cc:318
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
msgstr "ControlProtocolManager: δεν μποÏÏŽ να φοÏτώσω το module \"%1\" (%2)"
-#: control_protocol_manager.cc:290
+#: control_protocol_manager.cc:324
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr "ControlProtocolManager: το module \"%1\" δεν έχει descriptor function."
-#: cycle_timer.cc:38
+#: cycle_timer.cc:40
msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
msgstr "CycleTimer::get_mhz(): δεν ανοίγει το /proc/cpuinfo"
-#: cycle_timer.cc:50
+#: cycle_timer.cc:52
msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo"
msgstr "CycleTimer::get_mhz(): δεν ευÏέθη το cpu MHz στο /proc/cpuinfo"
-#: cycle_timer.cc:73
+#: cycle_timer.cc:75
msgid "cannot locate cpu MHz in /proc/cpuinfo"
msgstr "δεν ευÏέθη το cpu MHz στο /proc/cpuinfo"
@@ -397,7 +418,7 @@ msgstr "δεν ευÏέθη το cpu MHz στο /proc/cpuinfo"
msgid "audio"
msgstr ""
-#: data_type.cc:28 session.cc:1791 session.cc:1794
+#: data_type.cc:28 session.cc:1808 session.cc:1811
msgid "MIDI"
msgstr ""
@@ -405,15 +426,15 @@ msgstr ""
msgid "unknown"
msgstr ""
-#: delivery.cc:114
+#: delivery.cc:118
msgid "main outs"
msgstr ""
-#: delivery.cc:117 send.cc:61
+#: delivery.cc:121 send.cc:62
msgid "listen"
msgstr ""
-#: diskstream.cc:303
+#: diskstream.cc:302
msgid "Location \"%1\" not valid for track loop (start >= end)"
msgstr "Η Τοποθεσία \"%1\" δεν είναι ικανή για track loop (αÏχή >= τέλος)"
@@ -425,23 +446,23 @@ msgstr ""
msgid "Export failed: %1"
msgstr ""
-#: export_filename.cc:118
+#: export_filename.cc:119
msgid "Existing export folder for this session (%1) does not exist - ignored"
msgstr ""
-#: export_filename.cc:229
+#: export_filename.cc:230
msgid "No Time"
msgstr ""
-#: export_filename.cc:238
+#: export_filename.cc:239
msgid "Invalid time format"
msgstr ""
-#: export_filename.cc:247
+#: export_filename.cc:248
msgid "No Date"
msgstr ""
-#: export_filename.cc:262
+#: export_filename.cc:263
msgid "Invalid date format"
msgstr ""
@@ -509,7 +530,7 @@ msgstr ""
msgid "Rectangular"
msgstr ""
-#: export_formats.cc:52 session.cc:5014 session.cc:5030
+#: export_formats.cc:52 session.cc:5006 session.cc:5022
msgid "None"
msgstr ""
@@ -549,15 +570,15 @@ msgstr ""
msgid "No sample format"
msgstr ""
-#: export_handler.cc:335
+#: export_handler.cc:343
msgid "Editor: cannot open \"%1\" as export file for CD marker file"
msgstr ""
-#: export_handler.cc:417 export_handler.cc:420
+#: export_handler.cc:425 export_handler.cc:428
msgid "an error occured while writing a TOC/CUE file: %1"
msgstr ""
-#: export_handler.cc:642 export_handler.cc:700
+#: export_handler.cc:650 export_handler.cc:708
msgid "Cannot convert %1 to Latin-1 text"
msgstr ""
@@ -619,7 +640,7 @@ msgid ""
"configuration"
msgstr ""
-#: file_source.cc:198 session_state.cc:2807
+#: file_source.cc:198 session_state.cc:2843
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr "ΥπάÏχουν ήδη 1000 αÏχεία με ονόματα όπως %1; μη-συνεχές versioning"
@@ -628,38 +649,35 @@ msgstr "ΥπάÏχουν ήδη 1000 αÏχεία με ονόματα όπως %
msgid "cannot rename file source from %1 to %2 (%3)"
msgstr ""
-#: file_source.cc:250 file_source.cc:378
+#: file_source.cc:248 file_source.cc:372
msgid "FileSource: search path not set"
msgstr "FileSource: μονοπάτι αναζητήσεως δεν ετέθη"
-#: file_source.cc:313 file_source.cc:448
-msgid "Filesource: cannot find required file (%1): while searching %2"
+#: file_source.cc:309 file_source.cc:439
+msgid "Filesource: cannot find required file (%1)"
msgstr ""
-"Filesource: δεν ευÏέθη το απαιτοÏμενο αÏχείο (%1): κατά την αναζήτηση του %2"
-#: file_source.cc:440
+#: file_source.cc:432
msgid ""
-"FileSource: \"%1\" is ambigous when searching %2\n"
+"FileSource: \"%1\" is ambigous when searching\n"
"\t"
msgstr ""
-"FileSource: \"%1\" είναι αμφίβολο κατά την αναζήτηση του %2\n"
-"\t"
-#: file_source.cc:494
+#: file_source.cc:484
msgid "Filesource: cannot find required file (%1): %2"
msgstr "Filesource: δεν ευÏέθη το απαιτοÏμενο αÏχείο (%1): %2"
-#: file_source.cc:501
+#: file_source.cc:492
msgid "Filesource: cannot check for existing file (%1): %2"
msgstr "Filesource: δεν μποÏÏŽ να ελέγξω για το υπάÏχον αÏχείο (%1): %2"
-#: file_source.cc:535
+#: file_source.cc:526
msgid ""
"Programming error! %1 tried to rename a file over another file! It's safe to "
"continue working, but please report this to the developers."
msgstr ""
-#: file_source.cc:540
+#: file_source.cc:531
msgid "cannot rename file %1 to %2 (%3)"
msgstr ""
@@ -673,15 +691,15 @@ msgid ""
"cannot run"
msgstr ""
-#: filesystem_paths.cc:91
+#: filesystem_paths.cc:96
msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
msgstr ""
-#: filesystem_paths.cc:107
+#: filesystem_paths.cc:125
msgid "ARDOUR_CONFIG_PATH not set in environment - exiting\n"
msgstr ""
-#: filesystem_paths.cc:127
+#: filesystem_paths.cc:148
msgid "ARDOUR_DATA_PATH not set in environment - exiting\n"
msgstr ""
@@ -693,87 +711,83 @@ msgstr ""
msgid "filter: error creating new file %1 (%2)"
msgstr ""
-#: find_session.cc:51
-msgid "Could not resolve path: %1 (%2)"
-msgstr "ΑδÏνατη η εÏÏεση path: %1 (%2)"
-
-#: find_session.cc:63
+#: find_session.cc:59
msgid "cannot check session path %1 (%2)"
msgstr "δεν μποÏÏŽ να ελέγξω το μονοπάτι συνεδÏίας %1 (%2)"
-#: find_session.cc:89
+#: find_session.cc:85
msgid "cannot check statefile %1 (%2)"
msgstr "δεν μποÏÏŽ να ελέγξω το αÏχείο κατάστασεως %1 (%2)"
-#: find_session.cc:125
+#: find_session.cc:121
msgid "%1 is not a snapshot file"
msgstr ""
-#: find_session.cc:142
+#: find_session.cc:138
msgid "cannot determine current working directory (%1)"
msgstr "δεν μποÏÏŽ να καθοÏίσω τον Ï„Ïέχοντα ενεÏγό φάκελο(directory) (%1)"
-#: find_session.cc:159
+#: find_session.cc:155
msgid "unknown file type for session %1"
msgstr "άγνωστος Ï„Ïπος αÏχείου για την συνεδÏία %1"
-#: globals.cc:207
+#: globals.cc:216
msgid "Could not set system open files limit to \"unlimited\""
msgstr ""
-#: globals.cc:209
+#: globals.cc:218
msgid "Could not set system open files limit to %1"
msgstr ""
-#: globals.cc:213
+#: globals.cc:222
msgid "Your system is configured to limit %1 to only %2 open files"
msgstr ""
-#: globals.cc:217
+#: globals.cc:226
msgid "Could not get system open files limit (%1)"
msgstr ""
-#: globals.cc:268
+#: globals.cc:280
msgid "Loading configuration"
msgstr ""
-#: import.cc:207
+#: import.cc:208
msgid "Could not find a source for %1 even though we are updating this file!"
msgstr ""
-#: import.cc:236
+#: import.cc:237
msgid "Unable to create file %1 during import"
msgstr ""
-#: import.cc:262
+#: import.cc:263
msgid "Resampling %1 from %2kHz to %3kHz"
msgstr ""
-#: import.cc:268
+#: import.cc:269
msgid "Copying %1"
msgstr ""
-#: import.cc:446
+#: import.cc:455
msgid "Track %1 of %2 contained no usable MIDI data"
msgstr ""
-#: import.cc:453
+#: import.cc:462
msgid "MIDI file %1 was not readable (no reason available)"
msgstr ""
-#: import.cc:499
+#: import.cc:508
msgid "Import: cannot open input sound file \"%1\""
msgstr "Εισαγωγή: δεν μποÏÏŽ να ανοίξω το εισαγμένο αÏχείο ήχου \"%1\""
-#: import.cc:510
+#: import.cc:519
msgid "Import: error opening MIDI file"
msgstr ""
-#: import.cc:549
+#: import.cc:558
msgid "Loading MIDI file %1"
msgstr ""
-#: import.cc:614
+#: import.cc:623
msgid "Failed to remove some files after failed/cancelled import operation"
msgstr ""
@@ -785,155 +799,155 @@ msgstr ""
msgid "preset %1 (bank %2)"
msgstr ""
-#: internal_send.cc:278 internal_send.cc:279
+#: internal_send.cc:300 internal_send.cc:301
msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
msgstr ""
-#: io.cc:208
+#: io.cc:209
msgid "IO: cannot disconnect port %1 from %2"
msgstr ""
-#: io.cc:343 io.cc:428
+#: io.cc:344 io.cc:431
msgid "IO: cannot register input port %1"
msgstr "IO: δεν μποÏεί να καταχώÏηθεί η θÏÏα εισόδου %1"
-#: io.cc:348 io.cc:433
+#: io.cc:349 io.cc:436
msgid "IO: cannot register output port %1"
msgstr "IO: δεν μποÏει να καταχώÏηθεί η θÏÏα εξόδου %1"
-#: io.cc:591 io.cc:647
+#: io.cc:598 io.cc:654
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr "μη-σωστός κόμβος XML \"%1\" πέÏασε στο IO αντικείμενο"
-#: io.cc:706
+#: io.cc:713
msgid "in"
msgstr ""
-#: io.cc:706
+#: io.cc:713
msgid "out"
msgstr ""
-#: io.cc:707
+#: io.cc:714
msgid "input"
msgstr ""
-#: io.cc:707
+#: io.cc:714
msgid "output"
msgstr ""
-#: io.cc:717
+#: io.cc:724
msgid "Unknown bundle \"%1\" listed for %2 of %3"
msgstr ""
-#: io.cc:783
+#: io.cc:790
msgid "Bundle %1 was not available - \"%2\" used instead"
msgstr ""
-#: io.cc:786
+#: io.cc:793
msgid "No %1 bundles available as a replacement"
msgstr ""
-#: io.cc:889
+#: io.cc:896
msgid "%1: cannot create I/O ports"
msgstr "%1: θÏÏες I/O δεν μποÏοÏν να δημιουÏγηθοÏν"
-#: io.cc:1017 io.cc:1121
+#: io.cc:1024 io.cc:1128
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr "IO: κακοφτιαγμένη γÏαμμή στον XML κόμβο για εισόδους \"%1\""
-#: io.cc:1022 io.cc:1126
+#: io.cc:1029 io.cc:1133
msgid "bad input string in XML node \"%1\""
msgstr "κακή γÏαμμή εισόδου στον XML κόμβο \"%1\""
-#: io.cc:1060
+#: io.cc:1067
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr "IO: δÏσμοÏφη γÏαμμή στον κόμβο XML για τις εξόδους \"%1\""
-#: io.cc:1065
+#: io.cc:1072
msgid "IO: bad output string in XML node \"%1\""
msgstr "IO: κακή γÏαμμή εξόδουστον κόμβο XML \"%1\""
-#: io.cc:1411
+#: io.cc:1417
#, c-format
msgid "%s %u"
msgstr ""
-#: io.cc:1458
+#: io.cc:1464
#, c-format
msgid "%s in"
msgstr ""
-#: io.cc:1460
+#: io.cc:1466
#, c-format
msgid "%s out"
msgstr ""
-#: io.cc:1535 session.cc:686 session.cc:715
+#: io.cc:1541 session.cc:689 session.cc:718
msgid "mono"
msgstr ""
-#: io.cc:1537 session.cc:699 session.cc:729
+#: io.cc:1543 session.cc:702 session.cc:732
msgid "L"
msgstr ""
-#: io.cc:1537 session.cc:701 session.cc:731
+#: io.cc:1543 session.cc:704 session.cc:734
msgid "R"
msgstr ""
-#: io.cc:1539 io.cc:1545
+#: io.cc:1545 io.cc:1551
#, c-format
msgid "%d"
msgstr ""
-#: ladspa_plugin.cc:86
+#: ladspa_plugin.cc:93
+msgid "LADSPA: Unable to open module: "
+msgstr ""
+
+#: ladspa_plugin.cc:99
msgid "LADSPA: module has no descriptor function."
msgstr "LADSPA: το module δεν έχει ενδεικτική λειτουÏγία."
-#: ladspa_plugin.cc:91
+#: ladspa_plugin.cc:106
msgid "LADSPA: plugin has gone away since discovery!"
msgstr "LADSPA: το plugin την 'κοπάνισε' μετά την ανακάλυψη του!"
-#: ladspa_plugin.cc:98
+#: ladspa_plugin.cc:113
msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
msgstr ""
"LADSPA: \"%1\" δεν μποÏεί να χÏησιμοποιηθεί, εφ'όσον δεν μποÏεί να κάνει επι "
"τόπου επεξεÏγασία"
-#: ladspa_plugin.cc:297
+#: ladspa_plugin.cc:311
msgid ""
"illegal parameter number used with plugin \"%1\". This may indicate a change "
"in the plugin design, and presets may be invalid"
msgstr ""
-#: ladspa_plugin.cc:376 ladspa_plugin.cc:426
+#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr "Κακός κόμβος εστάλη στο LadspaPlugin::set_state"
-#: ladspa_plugin.cc:391 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
msgid "LADSPA: no ladspa port number"
msgstr "LADSPA: κανείς αÏιθμός θÏÏας ladspa"
-#: ladspa_plugin.cc:397 ladspa_plugin.cc:446
+#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
msgid "LADSPA: no ladspa port data"
msgstr "LADSPA: κανένα δεδομένο θÏÏας ladspa"
-#: ladspa_plugin.cc:717
-msgid "LADSPA: cannot load module from \"%1\""
-msgstr "LADSPA: δεν μποÏÏŽ να φοÏτώσω module από \"%1\""
-
-#: ladspa_plugin.cc:827
+#: ladspa_plugin.cc:840
msgid "Could not locate HOME. Preset not removed."
msgstr ""
-#: ladspa_plugin.cc:864 ladspa_plugin.cc:870
+#: ladspa_plugin.cc:879 ladspa_plugin.cc:885
msgid "Could not create %1. Preset not saved. (%2)"
msgstr "Δεν μπόÏεσα να δημιουÏγήσω το %1. ΠÏο-ÏÏθμιση δεν αποθηκεÏθηκε. (%2)"
-#: ladspa_plugin.cc:877
+#: ladspa_plugin.cc:892
msgid "Error saving presets file %1."
msgstr "Σφάλμα στην αποθήκευση αÏχείου Ï€Ïο-Ïυθμίσεων %1."
-#: ladspa_plugin.cc:915
+#: ladspa_plugin.cc:934
msgid "Could not locate HOME. Preset not saved."
msgstr "Δεν μπόÏεσα να βÏÏŽ το HOME. ΠÏο-ÏÏθμιση δεν αποθηκεÏθηκε."
@@ -975,7 +989,7 @@ msgstr ""
msgid "incorrect XML mode passed to Locations::set_state"
msgstr "λανθασμένο XML mode πέÏασε στις Τοποθεσίες::set_state"
-#: location.cc:842 session.cc:4516 session_state.cc:1031
+#: location.cc:842 session.cc:4533 session_state.cc:1025
msgid "session"
msgstr ""
@@ -1030,40 +1044,39 @@ msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
msgstr ""
#: ltc_slave.cc:591
-#, c-format
msgid "flywheel"
msgstr ""
-#: midi_diskstream.cc:167
+#: midi_diskstream.cc:166
msgid ""
"%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
msgstr ""
-#: midi_diskstream.cc:219
+#: midi_diskstream.cc:218
msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
msgstr ""
-#: midi_diskstream.cc:270
+#: midi_diskstream.cc:269
msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
-#: midi_diskstream.cc:699
+#: midi_diskstream.cc:698
msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-#: midi_diskstream.cc:834
+#: midi_diskstream.cc:833
msgid "MidiDiskstream %1: cannot write to disk"
msgstr ""
-#: midi_diskstream.cc:868
+#: midi_diskstream.cc:867
msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: midi_diskstream.cc:955
+#: midi_diskstream.cc:954
msgid "%1: could not create region for complete midi file"
msgstr ""
-#: midi_diskstream.cc:992
+#: midi_diskstream.cc:991
msgid "MidiDiskstream: could not create region for captured midi!"
msgstr ""
@@ -1075,27 +1088,27 @@ msgstr ""
msgid "No SysExID found for sys-ex property change - ignored"
msgstr ""
-#: midi_model.cc:2010
+#: midi_model.cc:2012
msgid "transpose"
msgstr ""
-#: midi_patch_manager.cc:126
+#: midi_patch_manager.cc:127
msgid "Duplicate MIDI device `%1' in `%2' ignored"
msgstr ""
-#: midi_source.cc:125
+#: midi_source.cc:124
msgid "Missing parameter property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:132
+#: midi_source.cc:131
msgid "Missing style property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:144
+#: midi_source.cc:143
msgid "Missing parameter property on AutomationState"
msgstr ""
-#: midi_source.cc:151
+#: midi_source.cc:150
msgid "Missing state property on AutomationState"
msgstr ""
@@ -1139,22 +1152,22 @@ msgstr ""
msgid "solo control"
msgstr ""
-#: mtc_slave.cc:238
+#: mtc_slave.cc:240
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr ""
"MTC Slave: ατομική ανάγνωση του Ï„Ïέχοντος χÏόνου απέτυχε, πίσω για Ïπνο!"
-#: mtc_slave.cc:361
+#: mtc_slave.cc:362
msgid ""
"Unknown rate/drop value %1 in incoming MTC stream, session values used "
"instead"
msgstr ""
-#: mtc_slave.cc:381
+#: mtc_slave.cc:382
msgid "Session framerate adjusted from %1 TO: MTC's %2."
msgstr ""
-#: mtc_slave.cc:395
+#: mtc_slave.cc:396
msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
msgstr ""
@@ -1214,31 +1227,35 @@ msgstr ""
msgid "Pannable given XML data for %1 - ignored"
msgstr ""
-#: panner_manager.cc:76
-msgid "looking for panners in %1"
+#: panner_manager.cc:80
+msgid "looking for panners in %1\n"
msgstr ""
-#: panner_manager.cc:100
-msgid "Panner discovered: \"%1\" in %2"
+#: panner_manager.cc:108
+msgid "Panner discovered: \"%1\" in %2\n"
msgstr ""
-#: panner_manager.cc:117
+#: panner_manager.cc:125
msgid "PannerManager: cannot load module \"%1\" (%2)"
msgstr ""
-#: panner_manager.cc:124
+#: panner_manager.cc:132
msgid "PannerManager: module \"%1\" has no descriptor function."
msgstr ""
-#: panner_manager.cc:187
+#: panner_manager.cc:219
msgid "no panner discovered for in/out = %1/%2"
msgstr ""
-#: panner_shell.cc:179
+#: panner_shell.cc:126
+msgid "select panner: %1\n"
+msgstr ""
+
+#: panner_shell.cc:245
msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
msgstr "Άγνωστο plugin για panner \"%1\" ευÏέθη στην κατάσταση pan - αγνοήθηκε"
-#: panner_shell.cc:185
+#: panner_shell.cc:251
msgid "panner plugin node has no type information!"
msgstr "ο κόμβος για τα plugin του panner δεν έχει πληÏοφοÏίες Ï„Ïπου!"
@@ -1258,19 +1275,19 @@ msgstr ""
msgid "Could not construct playlist for PlaylistSource from session data!"
msgstr ""
-#: plugin.cc:324
+#: plugin.cc:328
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin.cc:398
+#: plugin.cc:402
msgid ""
"Saving plugin settings is not supported in this build of %1. Consider paying "
"for the full version"
msgstr ""
-#: plugin_insert.cc:598
+#: plugin_insert.cc:589
msgid "programming error: "
msgstr "σφάλμα Ï€ÏογÏαμματισμοÏ: "
@@ -1306,43 +1323,43 @@ msgstr "PluginInsert: Auto: το id θÏÏας είναι εκτός πεδίοÏ
msgid "PluginInsert: automatable control %1 not found - ignored"
msgstr ""
-#: plugin_manager.cc:161
+#: plugin_manager.cc:165
msgid "Discovering Plugins"
msgstr ""
-#: plugin_manager.cc:335
+#: plugin_manager.cc:286
msgid "Could not parse rdf file: %1"
msgstr "Δεν μπόÏεσα να αναλÏσω το αÏχείο rdf: %1"
-#: plugin_manager.cc:374
+#: plugin_manager.cc:330
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr "LADSPA: δεν μποÏÏŽ να φοÏτώσω το module \"%1\" (%2)"
-#: plugin_manager.cc:381
+#: plugin_manager.cc:337
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr "LADSPA: το module \"%1\" δεν έχει λειτουÏγία πεÏιγÏαφής."
-#: plugin_manager.cc:602
+#: plugin_manager.cc:567
msgid ""
"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
"at this time"
msgstr ""
-#: plugin_manager.cc:709
+#: plugin_manager.cc:680
msgid ""
"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
"in %2 at this time"
msgstr ""
-#: plugin_manager.cc:870
+#: plugin_manager.cc:841
msgid "unknown plugin status type \"%1\" - all entries ignored"
msgstr ""
-#: plugin_manager.cc:887
+#: plugin_manager.cc:858
msgid "unknown plugin type \"%1\" - ignored"
msgstr ""
-#: port.cc:410
+#: port.cc:412
msgid "could not reregister %1"
msgstr "αδÏνατη η επανακαταγÏαφή %1"
@@ -1350,11 +1367,11 @@ msgstr "αδÏνατη η επανακαταγÏαφή %1"
msgid "insert %1"
msgstr ""
-#: port_insert.cc:198
+#: port_insert.cc:197
msgid "XML node describing port insert is missing the `type' field"
msgstr ""
-#: port_insert.cc:203
+#: port_insert.cc:202
msgid "non-port insert XML used for port plugin insert"
msgstr "εισαγωγή μη-θÏÏας XML για χÏήση σε εισαγωγή plugin θÏÏας"
@@ -1386,11 +1403,11 @@ msgstr "AudioEngine: αδÏνατη η σÏνδεση %1 (%2) σε %3 (%4)"
msgid "Re-establising port %1 failed"
msgstr ""
-#: processor.cc:207
+#: processor.cc:208
msgid "No %1 property flag in element %2"
msgstr ""
-#: processor.cc:216
+#: processor.cc:217
msgid "No child node with active property"
msgstr ""
@@ -1454,11 +1471,11 @@ msgstr ""
msgid "cannot create new name for region \"%1\""
msgstr "δεν μποÏÏŽ να δημιουÏγήσω νέο όνομα για την πεÏιοχή \"%1\""
-#: resampled_source.cc:98
+#: resampled_source.cc:102
msgid "Import: %1"
msgstr "Εισαγωγή: %1"
-#: resampled_source.cc:128
+#: resampled_source.cc:132 srcfilesource.cc:76
msgid "Import: src_new() failed : %1"
msgstr "Εισαγωγή: src_new() απέτυχε : %1"
@@ -1466,29 +1483,29 @@ msgstr "Εισαγωγή: src_new() απέτυχε : %1"
msgid "return %1"
msgstr ""
-#: route.cc:1075 route.cc:2528
+#: route.cc:1081 route.cc:2541
msgid "unknown Processor type \"%1\"; ignored"
msgstr ""
-#: route.cc:1087
+#: route.cc:1093
msgid "processor could not be created. Ignored."
msgstr ""
-#: route.cc:1962 route.cc:2187
+#: route.cc:1975 route.cc:2200
msgid "Bad node sent to Route::set_state() [%1]"
msgstr "Κακός κόμβος εστάλη στο Route::set_state() [%1]"
-#: route.cc:2022
+#: route.cc:2035
msgid "Pannable state found for route (%1) without a panner!"
msgstr ""
-#: route.cc:2096 route.cc:2100 route.cc:2301 route.cc:2305
+#: route.cc:2109 route.cc:2113 route.cc:2314 route.cc:2318
msgid "badly formed order key string in state file! [%1] ... ignored."
msgstr ""
"δÏσμοÏφη γÏαμμή ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Ï„Î±Î¾Î¹Î½Î¿Î¼Î®ÏƒÎµÏ‰Ï‚ στο αÏχείο καταστάσεως ! [%1] ... "
"αγνοήθηκε."
-#: route.cc:2311
+#: route.cc:2324
msgid "Converting deprecated order key for %1 using Editor order %2"
msgstr ""
@@ -1504,15 +1521,15 @@ msgstr ""
msgid "error writing tempo-adjusted data to %1"
msgstr "σφάλμα στην εγγÏαφή χÏονο-Ïυθμισμένων δεδομένων στο %1"
-#: send.cc:59
+#: send.cc:60
msgid "aux %1"
msgstr ""
-#: send.cc:63
+#: send.cc:64
msgid "send %1"
msgstr ""
-#: send.cc:65
+#: send.cc:66
msgid "programming error: send created using role %1"
msgstr ""
@@ -1536,149 +1553,149 @@ msgstr ""
msgid "Set up standard connections"
msgstr ""
-#: session.cc:635
+#: session.cc:638
msgid "could not setup Click I/O"
msgstr "Δεν μπόÏεσα να διαμοÏφώσω το I/O του ΜετÏονόμου(click)"
-#: session.cc:683
+#: session.cc:686
#, c-format
msgid "out %<PRIu32>"
msgstr ""
-#: session.cc:697
+#: session.cc:700
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr ""
-#: session.cc:712
+#: session.cc:715
#, c-format
msgid "in %<PRIu32>"
msgstr ""
-#: session.cc:726
+#: session.cc:729
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr ""
-#: session.cc:790
+#: session.cc:793
msgid "cannot connect master output %1 to %2"
msgstr ""
-#: session.cc:849
+#: session.cc:862
msgid "monitor"
msgstr "monitor"
-#: session.cc:894
+#: session.cc:907
msgid "cannot connect control input %1 to %2"
msgstr ""
-#: session.cc:914
+#: session.cc:927
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr ""
-#: session.cc:945
+#: session.cc:958
msgid "cannot connect control output %1 to %2"
msgstr ""
-#: session.cc:1009
+#: session.cc:1026
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr "δεν μποÏÏŽ να δημιουÏγήσω τον ΑκÏοατή: καμία ακÏόαση πεÏιοχών δυνατή"
-#: session.cc:1193
+#: session.cc:1210
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
"ΣυνεδÏία: δεν μποÏείτε να χÏησιμοποιήσετε αυτήν την τοποθεσία για auto punch "
"(αÏχή <= τέλος)"
-#: session.cc:1233
+#: session.cc:1250
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
msgstr ""
-#: session.cc:1547
+#: session.cc:1564
msgid "feedback loop setup between %1 and %2"
msgstr "διαμόÏφωση feedback loop ανάμεσα σε %1 και %2"
-#: session.cc:1843
+#: session.cc:1860
msgid "Session: could not create new midi track."
msgstr ""
-#: session.cc:1849
+#: session.cc:1866
msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks."
msgstr ""
-#: session.cc:2026 session.cc:2029
+#: session.cc:2043 session.cc:2046
msgid "Audio"
msgstr ""
-#: session.cc:2053 session.cc:2061 session.cc:2138 session.cc:2146
+#: session.cc:2070 session.cc:2078 session.cc:2155 session.cc:2163
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr "δεν μποÏÏŽ να διαμοÏφώσω %1 in/%2 out διάταξη για νέο κανάλι ήχου"
-#: session.cc:2084
+#: session.cc:2101
msgid "Session: could not create new audio track."
msgstr "ΣυνεδÏία: δεν μπόÏεσα να δημιουÏγήσω νέο κανάλι ήχου."
-#: session.cc:2116 session.cc:2119
+#: session.cc:2133 session.cc:2136
msgid "Bus"
msgstr ""
-#: session.cc:2169
+#: session.cc:2186
msgid "Session: could not create new audio route."
msgstr ""
-#: session.cc:2228 session.cc:2238
+#: session.cc:2245 session.cc:2255
msgid "Session: UINT_MAX routes? impossible!"
msgstr ""
-#: session.cc:2260
+#: session.cc:2277
msgid "Session: cannot create track/bus from template description"
msgstr ""
-#: session.cc:2286
+#: session.cc:2303
msgid "Session: could not create new route from template"
msgstr ""
-#: session.cc:2315
+#: session.cc:2332
msgid "Adding new tracks/busses failed"
msgstr ""
-#: session.cc:3419
+#: session.cc:3436
msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename"
msgstr ""
-#: session.cc:3539 session.cc:3597
+#: session.cc:3556 session.cc:3614
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr "ΥπάÏχουν ήδη %1 εγγÏαφές για %2, τις οποίες θεωÏÏŽ πάÏα πολλές."
-#: session.cc:3987
+#: session.cc:4004
msgid "send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:3999
+#: session.cc:4016
msgid "aux send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4011
+#: session.cc:4028
msgid "return ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4023
+#: session.cc:4040
msgid "insert ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4150
+#: session.cc:4167
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr ""
-#: session.cc:4179
+#: session.cc:4196
msgid "too many bounced versions of playlist \"%1\""
msgstr "πάÏα πολλές bounced εκδόσεις της Playlist \"%1\""
-#: session.cc:4189
+#: session.cc:4206
msgid "cannot create new audio file \"%1\" for %2"
msgstr "δεν μποÏÏŽ να δημιουÏγήσω νέο αÏχείο ήχου \"%1\" για %2"
@@ -1713,7 +1730,7 @@ msgstr ""
msgid "Session subdirectory does not exist at path %1"
msgstr ""
-#: session_events.cc:184
+#: session_events.cc:185
msgid "Session: cannot have two events of type %1 at the same frame (%2)."
msgstr ""
"ΣυνεδÏία: δεν γίνεται να υπάÏχουν δÏο συμβάντα του Ï„Ïπου %1 στο ίδιο frame "
@@ -1727,13 +1744,13 @@ msgstr "%1: δεν μποÏÏŽ να αναζητήσω στο %2 για εξαγÏ
msgid "Export ended unexpectedly: %1"
msgstr ""
-#: session_ltc.cc:222
+#: session_ltc.cc:221
msgid ""
"LTC encoder: invalid framerate - LTC encoding is disabled for the remainder "
"of this session."
msgstr ""
-#: session_midi.cc:520
+#: session_midi.cc:519
msgid "Session: cannot send quarter-frame MTC message (%1)"
msgstr "ΣυνεδÏία: δεν μποÏÏŽ να στείλω τέταÏτο-frame MTC μήνυμα (%1)"
@@ -1745,228 +1762,224 @@ msgstr "ΣυνεδÏία: δεν μποÏÏŽ να δημιουÏγήσω την P
msgid "Session: error in no roll for %1"
msgstr "ΣυνεδÏία: σφάλμα στο no roll για %1"
-#: session_process.cc:1157
+#: session_process.cc:1159
msgid "Programming error: illegal event type in process_event (%1)"
msgstr ""
"Σφάλμα Ï€ÏογÏαμματισμοÏ: παÏάνομος Ï„Ïπος συμβάντος στο process_event (%1)"
-#: session_state.cc:140
-msgid "Could not use path %1 (%2)"
-msgstr ""
-
-#: session_state.cc:184
+#: session_state.cc:178
msgid "solo cut control (dB)"
msgstr ""
-#: session_state.cc:208
+#: session_state.cc:202
msgid "Set block size and sample rate"
msgstr ""
-#: session_state.cc:213
+#: session_state.cc:207
msgid "Using configuration"
msgstr ""
-#: session_state.cc:325
+#: session_state.cc:319
msgid "Reset Remote Controls"
msgstr ""
-#: session_state.cc:417
+#: session_state.cc:411
msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:424
+#: session_state.cc:418
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr "ΣυνεδÏία: δεν μποÏÏŽ να δημιουÏγήσω φάκελο ήχων συνεδÏίας \"%1\" (%2)"
-#: session_state.cc:431
+#: session_state.cc:425
msgid "Session: cannot create session midi dir \"%1\" (%2)"
msgstr ""
-#: session_state.cc:438
+#: session_state.cc:432
msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:445
+#: session_state.cc:439
msgid "Session: cannot create session export folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:452
+#: session_state.cc:446
msgid "Session: cannot create session analysis folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:459
+#: session_state.cc:453
msgid "Session: cannot create session plugins folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:466
+#: session_state.cc:460
msgid "Session: cannot create session externals folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:480
+#: session_state.cc:474
msgid "Session: cannot create session folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:514
+#: session_state.cc:508
msgid "Could not open %1 for writing session template"
msgstr ""
-#: session_state.cc:520
+#: session_state.cc:514
msgid "Could not open session template %1 for reading"
msgstr ""
-#: session_state.cc:539
+#: session_state.cc:533
msgid "master"
msgstr "master"
-#: session_state.cc:600
+#: session_state.cc:594
msgid "Could not remove pending capture state at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:624
+#: session_state.cc:618
msgid "could not rename snapshot %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:652
+#: session_state.cc:646
msgid "Could not remove session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:669
+#: session_state.cc:663
msgid ""
"the %1 audio engine is not connected and state saving would lose all I/O "
"connections. Session not saved"
msgstr ""
-#: session_state.cc:720
+#: session_state.cc:714
msgid "state could not be saved to %1"
msgstr "η κατάσταση δεν μποÏοÏσε να σωθεί στο %1"
-#: session_state.cc:722 session_state.cc:733
+#: session_state.cc:716 session_state.cc:727
msgid "Could not remove temporary session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:730
-msgid "could not rename temporary session file %1 to %2"
+#: session_state.cc:724
+msgid "could not rename temporary session file %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:798
+#: session_state.cc:792
msgid "%1: session file \"%2\" doesn't exist!"
msgstr ""
-#: session_state.cc:810
+#: session_state.cc:804
msgid "Could not understand session file %1"
msgstr ""
-#: session_state.cc:819
+#: session_state.cc:813
msgid "Session file %1 is not a session"
msgstr ""
-#: session_state.cc:1125
+#: session_state.cc:1119
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
"σφάλμα Ï€ÏογÏαμματισμοÏ: ΣυνεδÏία: λανθασμένος κόμβος XML εστάλη στην "
"set_state()"
-#: session_state.cc:1179
+#: session_state.cc:1173
msgid "Session: XML state has no options section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα επιλογών(options)"
-#: session_state.cc:1184
+#: session_state.cc:1178
msgid "Session: XML state has no metadata section"
msgstr ""
-#: session_state.cc:1195
+#: session_state.cc:1189
msgid "Session: XML state has no sources section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα πηγών"
-#: session_state.cc:1202
+#: session_state.cc:1196
msgid "Session: XML state has no Tempo Map section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα Tempo Map"
-#: session_state.cc:1209
+#: session_state.cc:1203
msgid "Session: XML state has no locations section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα τοποθεσιών"
-#: session_state.cc:1235
+#: session_state.cc:1229
msgid "Session: XML state has no Regions section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα ΠεÏιοχών"
-#: session_state.cc:1242
+#: session_state.cc:1236
msgid "Session: XML state has no playlists section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα playlists"
-#: session_state.cc:1262
+#: session_state.cc:1256
msgid "Session: XML state has no bundles section"
msgstr ""
-#: session_state.cc:1274
+#: session_state.cc:1268
msgid "Session: XML state has no diskstreams section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα diskstreams"
-#: session_state.cc:1282
+#: session_state.cc:1276
msgid "Session: XML state has no routes section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα διαδÏομών"
-#: session_state.cc:1294
+#: session_state.cc:1288
msgid "Session: XML state has no route groups section"
msgstr ""
-#: session_state.cc:1303
+#: session_state.cc:1297
msgid "Session: XML state has no edit groups section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα επεξεÏ/σίας ομάδων"
-#: session_state.cc:1310
+#: session_state.cc:1304
msgid "Session: XML state has no mix groups section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα μίξεως ομάδων"
-#: session_state.cc:1318
+#: session_state.cc:1312
msgid "Session: XML state has no click section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα μετÏονόμου"
-#: session_state.cc:1360
+#: session_state.cc:1354
msgid "Session: cannot create Route from XML description."
msgstr "ΣυνεδÏία: δεν μποÏÏŽ να δημιουÏγήσω ΔιαδÏομή από XML πεÏιγÏαφή."
-#: session_state.cc:1364
+#: session_state.cc:1358
msgid "Loaded track/bus %1"
msgstr ""
-#: session_state.cc:1462
+#: session_state.cc:1456
msgid "Could not find diskstream for route"
msgstr ""
-#: session_state.cc:1516
+#: session_state.cc:1510
msgid "Session: cannot create Region from XML description."
msgstr "ΣυνεδÏία: δεν μποÏÏŽ να δημιουÏγήσω ΠεÏιοχή από XML πεÏιγÏαφή."
-#: session_state.cc:1520
+#: session_state.cc:1514
msgid "Can not load state for region '%1'"
msgstr ""
-#: session_state.cc:1556
+#: session_state.cc:1550
msgid "Regions in compound description not found (ID's %1 and %2): ignored"
msgstr ""
-#: session_state.cc:1584
+#: session_state.cc:1578
msgid "Nested source has no ID info in session file! (ignored)"
msgstr ""
-#: session_state.cc:1596
+#: session_state.cc:1590
msgid "Cannot reconstruct nested source for region %1"
msgstr ""
-#: session_state.cc:1658
+#: session_state.cc:1652
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr ""
"ΣυνεδÏία: Ο XMLΚόμβος που πεÏιγÏάφει AudioΠεÏιοχή είναι ημιτελής (δίχως πηγή)"
-#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707
+#: session_state.cc:1660 session_state.cc:1681 session_state.cc:1701
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
"ΣυνεδÏία: Ο XMLΚόμβος που πεÏιγÏάφει AudioΠεÏιοχή αναφέÏει άγνωστο id πηγής ="
"%1"
-#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713
+#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
@@ -1974,129 +1987,125 @@ msgstr ""
"ΣυνεδÏία: Ο XMLNode που πεÏιγÏάφει AudioRegion αναφέÏει μη-ηχητική πηγή με "
"id =%1"
-#: session_state.cc:1736
+#: session_state.cc:1730
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
msgstr ""
-#: session_state.cc:1770
+#: session_state.cc:1764
msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1778
+#: session_state.cc:1772
msgid ""
"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1784
+#: session_state.cc:1778
msgid ""
"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
msgstr ""
-#: session_state.cc:1852
+#: session_state.cc:1846
msgid ""
"cannot create new file from region name \"%1\" with ident = \"%2\": too many "
"existing files with similar names"
msgstr ""
-#: session_state.cc:1875
+#: session_state.cc:1869
msgid "Session: cannot create Source from XML description."
msgstr "ΣυνεδÏία: δεν μποÏÏŽ να δημιουÏγήσω Πηγή από XML πεÏιγÏαφή."
-#: session_state.cc:1909
+#: session_state.cc:1903
msgid "A sound file is missing. It will be replaced by silence."
msgstr ""
-#: session_state.cc:1932
+#: session_state.cc:1926
msgid "Found a sound file that cannot be used by %1. Talk to the progammers."
msgstr ""
-#: session_state.cc:1949
+#: session_state.cc:1943
msgid "Could not create templates directory \"%1\" (%2)"
msgstr ""
-#: session_state.cc:1962
+#: session_state.cc:1956
msgid "Template \"%1\" already exists - new version not created"
msgstr "Το Ï€Ïοσχέδιο \"%1\" ήδη υπάÏχει - νέα έκδοση δεν δημιουÏγήθηκε"
-#: session_state.cc:1968
+#: session_state.cc:1962
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr ""
-#: session_state.cc:1978
+#: session_state.cc:1972
msgid "template not saved"
msgstr ""
-#: session_state.cc:1988
+#: session_state.cc:1982
msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
msgstr ""
-#: session_state.cc:2183
+#: session_state.cc:2225
msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr ""
-#: session_state.cc:2725 session_state.cc:2731
-msgid "Cannot expand path %1 (%2)"
-msgstr ""
-
-#: session_state.cc:2784
+#: session_state.cc:2820
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:2823
+#: session_state.cc:2859
msgid "cannot rename unused file source from %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:2841
+#: session_state.cc:2877
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr "δεν μποÏÏŽ να απαλοίψω το peakfile %1 για %2 (%3)"
-#: session_state.cc:3143
+#: session_state.cc:3179
msgid "could not backup old history file, current history not saved"
msgstr ""
-#: session_state.cc:3156
+#: session_state.cc:3192
msgid "history could not be saved to %1"
msgstr ""
-#: session_state.cc:3159
+#: session_state.cc:3195
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:3163
+#: session_state.cc:3199
msgid "could not restore history file from backup %1 (%2)"
msgstr ""
-#: session_state.cc:3188
+#: session_state.cc:3224
msgid "%1: no history file \"%2\" for this session."
msgstr ""
-#: session_state.cc:3194
+#: session_state.cc:3230
msgid "Could not understand session history file \"%1\""
msgstr ""
-#: session_state.cc:3236
+#: session_state.cc:3272
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr ""
-#: session_state.cc:3247
+#: session_state.cc:3283
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr ""
-#: session_state.cc:3258
+#: session_state.cc:3294
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr ""
-#: session_state.cc:3266
+#: session_state.cc:3302
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr ""
-#: session_state.cc:3502
+#: session_state.cc:3538
msgid "Session: unknown diskstream type in XML"
msgstr ""
-#: session_state.cc:3507
+#: session_state.cc:3543
msgid "Session: could not load diskstream via XML state"
msgstr "ΣυνεδÏία: δεν μπόÏεσα να φοÏτώσω diskstream μέσω καταστάσεως XML"
@@ -2120,115 +2129,115 @@ msgid ""
"control"
msgstr ""
-#: smf_source.cc:252
+#: smf_source.cc:262
msgid "Unable to read event prefix, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:265
+#: smf_source.cc:275
msgid "Event has time and size but no body, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:271
+#: smf_source.cc:281
msgid "Event time is before MIDI source position"
msgstr ""
-#: smf_source.cc:306 smf_source.cc:345
+#: smf_source.cc:316 smf_source.cc:355
msgid "Skipping event with unordered time %1"
msgstr ""
-#: smf_source.cc:410
+#: smf_source.cc:420
msgid "cannot open MIDI file %1 for write"
msgstr ""
-#: sndfile_helpers.cc:32
+#: sndfile_helpers.cc:34
msgid "WAV"
msgstr "WAV"
-#: sndfile_helpers.cc:33
+#: sndfile_helpers.cc:35
msgid "AIFF"
msgstr "AIFF"
-#: sndfile_helpers.cc:34
+#: sndfile_helpers.cc:36
msgid "CAF"
msgstr ""
-#: sndfile_helpers.cc:35
+#: sndfile_helpers.cc:37
msgid "W64 (64 bit WAV)"
msgstr "W64 (64 bit WAV)"
-#: sndfile_helpers.cc:36
+#: sndfile_helpers.cc:38
msgid "FLAC"
msgstr ""
-#: sndfile_helpers.cc:37
+#: sndfile_helpers.cc:39
msgid "Ogg/Vorbis"
msgstr ""
-#: sndfile_helpers.cc:38
+#: sndfile_helpers.cc:40
msgid "raw (no header)"
msgstr "raw (no header)"
-#: sndfile_helpers.cc:43
+#: sndfile_helpers.cc:45
msgid ".wav"
msgstr ""
-#: sndfile_helpers.cc:44
+#: sndfile_helpers.cc:46
msgid ".aiff"
msgstr ""
-#: sndfile_helpers.cc:45
+#: sndfile_helpers.cc:47
msgid ".caf"
msgstr ""
-#: sndfile_helpers.cc:46
+#: sndfile_helpers.cc:48
msgid ".w64"
msgstr ""
-#: sndfile_helpers.cc:47
+#: sndfile_helpers.cc:49
msgid ".flac"
msgstr ""
-#: sndfile_helpers.cc:48
+#: sndfile_helpers.cc:50
msgid ".ogg"
msgstr ""
-#: sndfile_helpers.cc:49
+#: sndfile_helpers.cc:51
msgid ".raw"
msgstr ""
-#: sndfile_helpers.cc:64
+#: sndfile_helpers.cc:66
msgid "Signed 16 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:65
+#: sndfile_helpers.cc:67
msgid "Signed 24 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:66
+#: sndfile_helpers.cc:68
msgid "Signed 32 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:67
+#: sndfile_helpers.cc:69
msgid "Signed 8 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:68
+#: sndfile_helpers.cc:70
msgid "32 bit float"
msgstr ""
-#: sndfile_helpers.cc:81
+#: sndfile_helpers.cc:83
msgid "Little-endian (Intel)"
msgstr "Little-endian (Intel)"
-#: sndfile_helpers.cc:82
+#: sndfile_helpers.cc:84
msgid "Big-endian (PowerPC)"
msgstr ""
-#: sndfilesource.cc:201
+#: sndfilesource.cc:210
msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
msgstr "SndFileSource: δεν μποÏÏŽ να ανοίξω το αÏχείο \"%1\" για %2 (%3)"
-#: sndfilesource.cc:209
+#: sndfilesource.cc:218
msgid ""
"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
"number"
@@ -2236,7 +2245,7 @@ msgstr ""
"SndFileSource: το αÏχείο πεÏιέχει μόνο %1 κανάλια; %2 δεν έχει αξία σαν "
"κανάλι number"
-#: sndfilesource.cc:255 sndfilesource.cc:571 sndfilesource.cc:595
+#: sndfilesource.cc:264 sndfilesource.cc:604 sndfilesource.cc:628
msgid ""
"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
"for this file"
@@ -2244,78 +2253,86 @@ msgstr ""
"Δεν ετέθησαν broadcast info για το audio file %1 (%2); απόÏÏιψη broadcast "
"info για αυτό το αÏχείο"
-#: sndfilesource.cc:302
+#: sndfilesource.cc:311
msgid "could not allocate file %1 for reading."
msgstr ""
-#: sndfilesource.cc:337
+#: sndfilesource.cc:346
msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
msgstr "SndFileSource: δεν μποÏοÏσα να αναζητήσω στο frame %1 μέσα στο %2 (%3)"
-#: sndfilesource.cc:347
+#: sndfilesource.cc:356
msgid ""
"SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
msgstr ""
-#: sndfilesource.cc:391 sndfilesource.cc:420
+#: sndfilesource.cc:400 sndfilesource.cc:429
msgid "attempt to write a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:396 utils.cc:510 utils.cc:534 utils.cc:548 utils.cc:567
+#: sndfilesource.cc:405 utils.cc:547 utils.cc:571 utils.cc:585 utils.cc:604
msgid "programming error: %1 %2"
msgstr "σφάλμα Ï€ÏογÏαμματισμοÏ: %1 %2"
-#: sndfilesource.cc:523
+#: sndfilesource.cc:532 sndfilesource.cc:562
msgid "attempt to flush a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:528
+#: sndfilesource.cc:537 sndfilesource.cc:557
msgid "attempt to flush an un-opened audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:534
+#: sndfilesource.cc:543
msgid "could not allocate file %1 to write header"
msgstr ""
-#: sndfilesource.cc:548
+#: sndfilesource.cc:568
+msgid "could not allocate file %1 to flush contents"
+msgstr ""
+
+#: sndfilesource.cc:581
msgid ""
"attempt to store broadcast info in a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:553
+#: sndfilesource.cc:586
msgid "attempt to set BWF info for an un-opened audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:614
+#: sndfilesource.cc:647
msgid "%1: cannot seek to %2 (libsndfile error: %3)"
msgstr ""
-#: sndfilesource.cc:727
+#: sndfilesource.cc:760
msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
msgstr ""
-#: sndfilesource.cc:740 sndfilesource.cc:790 sndfilesource.cc:797
+#: sndfilesource.cc:773 sndfilesource.cc:823 sndfilesource.cc:830
msgid "SndFileSource: \"%1\" bad write (%2)"
msgstr ""
-#: sndfilesource.cc:820
+#: sndfilesource.cc:853
msgid ""
"Filesource: start time is already set for existing file (%1): Cannot change "
"start time."
msgstr ""
-#: speakers.cc:239
+#: speakers.cc:280
msgid "Speaker information is missing azimuth - speaker ignored"
msgstr ""
-#: speakers.cc:245
+#: speakers.cc:286
msgid "Speaker information is missing elevation - speaker ignored"
msgstr ""
-#: speakers.cc:251
+#: speakers.cc:292
msgid "Speaker information is missing distance - speaker ignored"
msgstr ""
+#: srcfilesource.cc:135
+msgid "SrcFileSource: %1"
+msgstr ""
+
#: tape_file_matcher.cc:46
msgid "Cannot compile tape track regexp for use (%1)"
msgstr ""
@@ -2464,54 +2481,72 @@ msgstr ""
msgid "Node for Port has no \"name\" property"
msgstr ""
-#: utils.cc:358 utils.cc:382
+#: utils.cc:395 utils.cc:419
msgid "Splice"
msgstr ""
-#: utils.cc:360 utils.cc:375
+#: utils.cc:397 utils.cc:412
msgid "Slide"
msgstr ""
-#: utils.cc:362 utils.cc:378
+#: utils.cc:399 utils.cc:415
msgid "Lock"
msgstr ""
-#: utils.cc:365
+#: utils.cc:402
msgid "programming error: unknown edit mode string \"%1\""
msgstr ""
-#: utils.cc:389 utils.cc:421
+#: utils.cc:426 utils.cc:458
msgid "MIDI Timecode"
msgstr ""
-#: utils.cc:389 utils.cc:419
+#: utils.cc:426 utils.cc:456
msgid "MTC"
msgstr ""
-#: utils.cc:393 utils.cc:428
+#: utils.cc:430 utils.cc:465
msgid "MIDI Clock"
msgstr ""
-#: utils.cc:397 utils.cc:415 utils.cc:435
+#: utils.cc:434 utils.cc:452 utils.cc:472
msgid "JACK"
msgstr ""
-#: utils.cc:401
+#: utils.cc:438
msgid "programming error: unknown sync source string \"%1\""
msgstr ""
-#: utils.cc:426
+#: utils.cc:463
msgid "M-Clock"
msgstr ""
-#: utils.cc:432
+#: utils.cc:469
msgid "LTC"
msgstr ""
-#: utils.cc:602
+#: utils.cc:639
msgid "programming error: unknown native header format: %1"
msgstr ""
-#: utils.cc:617
+#: utils.cc:654
msgid "cannot open directory %1 (%2)"
msgstr ""
+
+#~ msgid "Filesource: cannot find required file (%1): while searching %2"
+#~ msgstr ""
+#~ "Filesource: δεν ευÏέθη το απαιτοÏμενο αÏχείο (%1): κατά την αναζήτηση του "
+#~ "%2"
+
+#~ msgid ""
+#~ "FileSource: \"%1\" is ambigous when searching %2\n"
+#~ "\t"
+#~ msgstr ""
+#~ "FileSource: \"%1\" είναι αμφίβολο κατά την αναζήτηση του %2\n"
+#~ "\t"
+
+#~ msgid "Could not resolve path: %1 (%2)"
+#~ msgstr "ΑδÏνατη η εÏÏεση path: %1 (%2)"
+
+#~ msgid "LADSPA: cannot load module from \"%1\""
+#~ msgstr "LADSPA: δεν μποÏÏŽ να φοÏτώσω module από \"%1\""
diff --git a/libs/ardour/po/es.po b/libs/ardour/po/es.po
index 758dcd2bbb..1a2648d872 100644
--- a/libs/ardour/po/es.po
+++ b/libs/ardour/po/es.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: libardour\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-11-05 11:11-0500\n"
+"POT-Creation-Date: 2014-02-10 17:53+0100\n"
"PO-Revision-Date: \n"
"Last-Translator: Pablo Fernández <pablo.fbus@gmail.com>\n"
"Language-Team: Grupo de Traducción al Español <traductores@teklibre.com>\n"
@@ -22,73 +22,73 @@ msgstr ""
msgid "Fader"
msgstr ""
-#: audio_diskstream.cc:244
+#: audio_diskstream.cc:242
msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
msgstr ""
"AudioDiskstream: La lista de reproducción \"%1\" no es una lista de "
"reproducción de audio."
-#: audio_diskstream.cc:296
+#: audio_diskstream.cc:294
msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
msgstr "AudioDiskstream %1: ¡No hay ninguna lista de reproducción para copiar!"
-#: audio_diskstream.cc:848 audio_diskstream.cc:858
+#: audio_diskstream.cc:846 audio_diskstream.cc:856
msgid ""
"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
msgstr ""
"AudioDiskstream %1: al rellenar, no se puede leer %2 de la lista de "
"reproducción en el cuadro %3."
-#: audio_diskstream.cc:1014
+#: audio_diskstream.cc:1012
msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
"AudioDiskstream %1: no se puede leer %2 de la lista de reproducción en el "
"cuadro %3."
-#: audio_diskstream.cc:1383 audio_diskstream.cc:1400
+#: audio_diskstream.cc:1381 audio_diskstream.cc:1398
msgid "AudioDiskstream %1: cannot write to disk"
msgstr "AudioDiskstream %1: no se puede escribir en el disco."
-#: audio_diskstream.cc:1443
+#: audio_diskstream.cc:1441
msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: audio_diskstream.cc:1537
+#: audio_diskstream.cc:1535
msgid "%1: could not create region for complete audio file"
msgstr "%1: no se pudo crear la región para el archivo de audio completo"
-#: audio_diskstream.cc:1571
+#: audio_diskstream.cc:1569
msgid "AudioDiskstream: could not create region for captured audio!"
msgstr "AudioDiskstream: ¡No se pudo crear región para el audio capturado!"
-#: audio_diskstream.cc:1679
+#: audio_diskstream.cc:1677
msgid "programmer error: %1"
msgstr "error de programador: %1"
-#: audio_diskstream.cc:1905
+#: audio_diskstream.cc:1903
msgid "AudioDiskstream: channel %1 out of range"
msgstr "AudioDiskstream: canal %1 fuera de rango"
-#: audio_diskstream.cc:1919 midi_diskstream.cc:1210
+#: audio_diskstream.cc:1917 midi_diskstream.cc:1209
msgid "%1:%2 new capture file not initialized correctly"
msgstr "%1:%2 archivo de captura nuevo no inicializado correctamente"
-#: audio_diskstream.cc:2200
+#: audio_diskstream.cc:2198
msgid "%1: cannot restore pending capture source file %2"
msgstr "%1: no se puede restaurar el archivo de captura pendiente %2"
-#: audio_diskstream.cc:2222
+#: audio_diskstream.cc:2220
msgid "%1: incorrect number of pending sources listed - ignoring them all"
msgstr ""
"%1: cantidad listada de fuentes pendientes incorrecta - se ignorarán todas"
-#: audio_diskstream.cc:2246
+#: audio_diskstream.cc:2244
msgid "%1: cannot create whole-file region from pending capture sources"
msgstr ""
"%1: no se puede crear la región del archivo entero desde las fuentes de "
"captura pendientes"
-#: audio_library.cc:71
+#: audio_library.cc:81
msgid "Could not open %1. Audio Library not saved"
msgstr "No se pudo abrir %1. Biblioteca de Audio no guardada."
@@ -128,11 +128,11 @@ msgstr ""
msgid "Audio Playlists (unused)"
msgstr ""
-#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529
+#: audio_playlist_source.cc:171 audiosource.cc:891 file_source.cc:520
#: midi_playlist_source.cc:144 midi_playlist_source.cc:152
-#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643
-#: rb_effect.cc:333 session.cc:2619 session.cc:2652 session.cc:3797
-#: session_handle.cc:87 sndfilesource.cc:121
+#: midi_playlist_source.cc:159 midi_source.cc:370 plugin_insert.cc:634
+#: rb_effect.cc:333 session.cc:2636 session.cc:2669 session.cc:3814
+#: session_handle.cc:87 sndfilesource.cc:122
msgid "programming error: %1"
msgstr "error de programación: %1"
@@ -160,23 +160,23 @@ msgstr ""
"\n"
"Canales: "
-#: audio_track.cc:167
+#: audio_track.cc:161
msgid "Unknown bundle \"%1\" listed for input of %2"
msgstr ""
-#: audio_track.cc:169
+#: audio_track.cc:163
msgid "in 1"
msgstr ""
-#: audio_track.cc:170
+#: audio_track.cc:164
msgid "No input bundles available as a replacement"
msgstr ""
-#: audio_track.cc:174
+#: audio_track.cc:168
msgid "Bundle %1 was not available - \"in 1\" used instead"
msgstr ""
-#: audio_track.cc:183
+#: audio_track.cc:177
msgid "improper input channel list in XML node (%1)"
msgstr "Lista de entrada de canales inválida en el nodo XML (%1)"
@@ -200,23 +200,23 @@ msgstr "no se puede cargar el plugin VAMP \"%1\""
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr "el plugin VAMP \"%1\" no pudo ser cargado"
-#: audioengine.cc:488
+#: audioengine.cc:495
msgid "looking for backends in %1\n"
msgstr ""
-#: audioengine.cc:511
+#: audioengine.cc:518
msgid "AudioEngine: cannot load module \"%1\" (%2)"
msgstr ""
-#: audioengine.cc:517
+#: audioengine.cc:524
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr ""
-#: audioengine.cc:589
+#: audioengine.cc:596
msgid "Could not create backend for %1: %2"
msgstr ""
-#: audioregion.cc:1643
+#: audioregion.cc:1651
msgid ""
"You have requested an operation that requires audio analysis.\n"
"\n"
@@ -242,11 +242,11 @@ msgstr ""
"puedes notar un ligero retraso en ésta y en futuras\n"
"operaciones de detección de transitorios.\n"
-#: audiosource.cc:199
+#: audiosource.cc:210
msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
msgstr ""
-#: audiosource.cc:226
+#: audiosource.cc:239
msgid "AudioSource: cannot stat peakfile \"%1\""
msgstr ""
@@ -254,47 +254,68 @@ msgstr ""
msgid "cannot read sample data for unscaled peak computation"
msgstr ""
-#: audiosource.cc:387
+#: audiosource.cc:386
msgid "AudioSource: cannot open peakpath (a) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:463
+#: audiosource.cc:395 audiosource.cc:473
+msgid ""
+"AudioSource: could not seek to correct location in peak file \"%1\" (%2)"
+msgstr ""
+
+#: audiosource.cc:453
msgid "AudioSource: cannot open peakpath (b) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:587
+#: audiosource.cc:567
msgid ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
msgstr ""
-#: audiosource.cc:667
+#: audiosource.cc:634
msgid "%1: could not write read raw data for peak computation (%2)"
msgstr ""
-#: audiosource.cc:706
+#: audiosource.cc:672
msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:773 audiosource.cc:886
+#: audiosource.cc:739 audiosource.cc:861
+msgid "%1: could not seek in peak file data (%2)"
+msgstr ""
+
+#: audiosource.cc:744 audiosource.cc:870
msgid "%1: could not write peak file data (%2)"
msgstr ""
-#: audiosource.cc:924
+#: audiosource.cc:903
msgid "could not truncate peakfile %1 to %2 (error: %3)"
msgstr ""
-#: auditioner.cc:87
+#: auditioner.cc:95
+msgid "Falling back to Reasonable Synth for Midi Audition"
+msgstr ""
+
+#: auditioner.cc:97
+msgid "No synth for midi-audition found."
+msgstr ""
+
+#: auditioner.cc:152
msgid "no outputs available for auditioner - manual connection required"
msgstr "No hay salidas disponibles para Audición - se requiere conexión manual"
-#: auditioner.cc:135
-msgid "Auditioning of non-audio regions not yet supported"
-msgstr "Aún no está soportada la audición de regiones no audio"
-
-#: auditioner.cc:160
+#: auditioner.cc:392 auditioner.cc:438
msgid "Cannot setup auditioner processing flow for %1 channels"
msgstr ""
+#: auditioner.cc:426
+msgid "Failed to load synth for MIDI-Audition."
+msgstr ""
+
+#: auditioner.cc:445
+msgid "Auditioning of regions other than Audio or Midi is not supported."
+msgstr ""
+
#: automatable.cc:81
msgid "Automation node has no path property"
msgstr ""
@@ -332,23 +353,23 @@ msgid ""
"AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
msgstr ""
-#: butler.cc:91
+#: butler.cc:80
msgid "Cannot create transport request signal pipe (%1)"
msgstr ""
-#: butler.cc:97 butler.cc:103
+#: butler.cc:86 butler.cc:92
msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)"
msgstr ""
-#: butler.cc:109
+#: butler.cc:124
msgid "Session: could not create butler thread"
msgstr ""
-#: butler.cc:156
+#: butler.cc:165
msgid "poll on butler request pipe failed (%1)"
msgstr ""
-#: butler.cc:163
+#: butler.cc:172
msgid "Error on butler thread request pipe: fd=%1 err=%2"
msgstr ""
@@ -356,55 +377,55 @@ msgstr ""
msgid "Error reading from butler request pipe"
msgstr ""
-#: butler.cc:248
+#: butler.cc:301
msgid "Butler read ahead failure on dstream %1"
msgstr ""
-#: butler.cc:285
+#: butler.cc:338
msgid "Butler write-behind failure on dstream %1"
msgstr ""
-#: control_protocol_manager.cc:134
+#: control_protocol_manager.cc:164
msgid "control protocol name \"%1\" has no descriptor"
msgstr "control protocol name \"%1\" has no descriptor"
-#: control_protocol_manager.cc:141
+#: control_protocol_manager.cc:171
msgid "control protocol name \"%1\" could not be initialized"
msgstr "El protocolo de control de nombre \"%1\" no se pudo inicializar"
-#: control_protocol_manager.cc:201
+#: control_protocol_manager.cc:237
msgid "Instantiating mandatory control protocol %1"
msgstr ""
-#: control_protocol_manager.cc:222
+#: control_protocol_manager.cc:258
msgid "looking for control protocols in %1\n"
msgstr "buscando protocolos de control en %1\n"
-#: control_protocol_manager.cc:247
+#: control_protocol_manager.cc:283
msgid "Control protocol %1 not usable"
msgstr "Protocolo de control %1 no usable."
-#: control_protocol_manager.cc:264
+#: control_protocol_manager.cc:300
msgid "Control surface protocol discovered: \"%1\"\n"
msgstr ""
-#: control_protocol_manager.cc:282
+#: control_protocol_manager.cc:318
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
msgstr ""
-#: control_protocol_manager.cc:290
+#: control_protocol_manager.cc:324
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr ""
-#: cycle_timer.cc:38
+#: cycle_timer.cc:40
msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
msgstr ""
-#: cycle_timer.cc:50
+#: cycle_timer.cc:52
msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo"
msgstr ""
-#: cycle_timer.cc:73
+#: cycle_timer.cc:75
msgid "cannot locate cpu MHz in /proc/cpuinfo"
msgstr ""
@@ -412,7 +433,7 @@ msgstr ""
msgid "audio"
msgstr ""
-#: data_type.cc:28 session.cc:1791 session.cc:1794
+#: data_type.cc:28 session.cc:1808 session.cc:1811
msgid "MIDI"
msgstr ""
@@ -420,15 +441,15 @@ msgstr ""
msgid "unknown"
msgstr "desconocido"
-#: delivery.cc:114
+#: delivery.cc:118
msgid "main outs"
msgstr ""
-#: delivery.cc:117 send.cc:61
+#: delivery.cc:121 send.cc:62
msgid "listen"
msgstr ""
-#: diskstream.cc:303
+#: diskstream.cc:302
msgid "Location \"%1\" not valid for track loop (start >= end)"
msgstr ""
"La localización \"%1\" no es válida para bucle de pista (inicio >= fin)"
@@ -441,23 +462,23 @@ msgstr ""
msgid "Export failed: %1"
msgstr ""
-#: export_filename.cc:118
+#: export_filename.cc:119
msgid "Existing export folder for this session (%1) does not exist - ignored"
msgstr ""
-#: export_filename.cc:229
+#: export_filename.cc:230
msgid "No Time"
msgstr ""
-#: export_filename.cc:238
+#: export_filename.cc:239
msgid "Invalid time format"
msgstr ""
-#: export_filename.cc:247
+#: export_filename.cc:248
msgid "No Date"
msgstr ""
-#: export_filename.cc:262
+#: export_filename.cc:263
msgid "Invalid date format"
msgstr ""
@@ -525,7 +546,7 @@ msgstr ""
msgid "Rectangular"
msgstr ""
-#: export_formats.cc:52 session.cc:5014 session.cc:5030
+#: export_formats.cc:52 session.cc:5006 session.cc:5022
msgid "None"
msgstr ""
@@ -565,15 +586,15 @@ msgstr ""
msgid "No sample format"
msgstr ""
-#: export_handler.cc:335
+#: export_handler.cc:343
msgid "Editor: cannot open \"%1\" as export file for CD marker file"
msgstr ""
-#: export_handler.cc:417 export_handler.cc:420
+#: export_handler.cc:425 export_handler.cc:428
msgid "an error occured while writing a TOC/CUE file: %1"
msgstr ""
-#: export_handler.cc:642 export_handler.cc:700
+#: export_handler.cc:650 export_handler.cc:708
msgid "Cannot convert %1 to Latin-1 text"
msgstr ""
@@ -635,7 +656,7 @@ msgid ""
"configuration"
msgstr ""
-#: file_source.cc:198 session_state.cc:2807
+#: file_source.cc:198 session_state.cc:2843
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr "ya hay 1000 archivos con nombres como %1; se discontinúa el versionado"
@@ -644,38 +665,35 @@ msgstr "ya hay 1000 archivos con nombres como %1; se discontinúa el versionado"
msgid "cannot rename file source from %1 to %2 (%3)"
msgstr ""
-#: file_source.cc:250 file_source.cc:378
+#: file_source.cc:248 file_source.cc:372
msgid "FileSource: search path not set"
msgstr "Filesource: ruta de búsqueda no especificada."
-#: file_source.cc:313 file_source.cc:448
-msgid "Filesource: cannot find required file (%1): while searching %2"
+#: file_source.cc:309 file_source.cc:439
+msgid "Filesource: cannot find required file (%1)"
msgstr ""
-"Filesource: no se puede encontrar el archivo requerido (%1): al buscar %2."
-#: file_source.cc:440
+#: file_source.cc:432
msgid ""
-"FileSource: \"%1\" is ambigous when searching %2\n"
+"FileSource: \"%1\" is ambigous when searching\n"
"\t"
msgstr ""
-"Filesource: \"%1\" es ambiguo al buscar %2\n"
-"\t"
-#: file_source.cc:494
+#: file_source.cc:484
msgid "Filesource: cannot find required file (%1): %2"
msgstr "Filesource: no se puede encontrar el archivo requerido (%1): %2."
-#: file_source.cc:501
+#: file_source.cc:492
msgid "Filesource: cannot check for existing file (%1): %2"
msgstr ""
-#: file_source.cc:535
+#: file_source.cc:526
msgid ""
"Programming error! %1 tried to rename a file over another file! It's safe to "
"continue working, but please report this to the developers."
msgstr ""
-#: file_source.cc:540
+#: file_source.cc:531
msgid "cannot rename file %1 to %2 (%3)"
msgstr ""
@@ -689,15 +707,15 @@ msgid ""
"cannot run"
msgstr ""
-#: filesystem_paths.cc:91
+#: filesystem_paths.cc:96
msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
msgstr ""
-#: filesystem_paths.cc:107
+#: filesystem_paths.cc:125
msgid "ARDOUR_CONFIG_PATH not set in environment - exiting\n"
msgstr ""
-#: filesystem_paths.cc:127
+#: filesystem_paths.cc:148
msgid "ARDOUR_DATA_PATH not set in environment - exiting\n"
msgstr ""
@@ -709,87 +727,83 @@ msgstr ""
msgid "filter: error creating new file %1 (%2)"
msgstr ""
-#: find_session.cc:51
-msgid "Could not resolve path: %1 (%2)"
-msgstr ""
-
-#: find_session.cc:63
+#: find_session.cc:59
msgid "cannot check session path %1 (%2)"
msgstr ""
-#: find_session.cc:89
+#: find_session.cc:85
msgid "cannot check statefile %1 (%2)"
msgstr ""
-#: find_session.cc:125
+#: find_session.cc:121
msgid "%1 is not a snapshot file"
msgstr "%1 no es un archivo de captura de sesión"
-#: find_session.cc:142
+#: find_session.cc:138
msgid "cannot determine current working directory (%1)"
msgstr ""
-#: find_session.cc:159
+#: find_session.cc:155
msgid "unknown file type for session %1"
msgstr "tipo de archivo desconocido para la sesión %1"
-#: globals.cc:207
+#: globals.cc:216
msgid "Could not set system open files limit to \"unlimited\""
msgstr "No se pudo establecer el límite de archivos abiertos a \"unlimited\""
-#: globals.cc:209
+#: globals.cc:218
msgid "Could not set system open files limit to %1"
msgstr "No se pudo establecer el límite de archivos abiertos a \"unlimited\""
-#: globals.cc:213
+#: globals.cc:222
msgid "Your system is configured to limit %1 to only %2 open files"
msgstr ""
-#: globals.cc:217
+#: globals.cc:226
msgid "Could not get system open files limit (%1)"
msgstr "No se pudo obtener el límite de archivos abiertos del sistema (%1) "
-#: globals.cc:268
+#: globals.cc:280
msgid "Loading configuration"
msgstr "Cargando configuración"
-#: import.cc:207
+#: import.cc:208
msgid "Could not find a source for %1 even though we are updating this file!"
msgstr ""
-#: import.cc:236
+#: import.cc:237
msgid "Unable to create file %1 during import"
msgstr "Incapaz de crear el archivo %1 durante la importación"
-#: import.cc:262
+#: import.cc:263
msgid "Resampling %1 from %2kHz to %3kHz"
msgstr ""
-#: import.cc:268
+#: import.cc:269
msgid "Copying %1"
msgstr ""
-#: import.cc:446
+#: import.cc:455
msgid "Track %1 of %2 contained no usable MIDI data"
msgstr ""
-#: import.cc:453
+#: import.cc:462
msgid "MIDI file %1 was not readable (no reason available)"
msgstr ""
-#: import.cc:499
+#: import.cc:508
msgid "Import: cannot open input sound file \"%1\""
msgstr "Importación: No se pudo abrir el archivo de entrada de sonido \"%1\""
-#: import.cc:510
+#: import.cc:519
msgid "Import: error opening MIDI file"
msgstr ""
-#: import.cc:549
+#: import.cc:558
msgid "Loading MIDI file %1"
msgstr ""
-#: import.cc:614
+#: import.cc:623
msgid "Failed to remove some files after failed/cancelled import operation"
msgstr ""
@@ -801,153 +815,153 @@ msgstr "Unknown"
msgid "preset %1 (bank %2)"
msgstr ""
-#: internal_send.cc:278 internal_send.cc:279
+#: internal_send.cc:300 internal_send.cc:301
msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
msgstr ""
-#: io.cc:208
+#: io.cc:209
msgid "IO: cannot disconnect port %1 from %2"
msgstr ""
-#: io.cc:343 io.cc:428
+#: io.cc:344 io.cc:431
msgid "IO: cannot register input port %1"
msgstr ""
-#: io.cc:348 io.cc:433
+#: io.cc:349 io.cc:436
msgid "IO: cannot register output port %1"
msgstr ""
-#: io.cc:591 io.cc:647
+#: io.cc:598 io.cc:654
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr ""
-#: io.cc:706
+#: io.cc:713
msgid "in"
msgstr ""
-#: io.cc:706
+#: io.cc:713
msgid "out"
msgstr ""
-#: io.cc:707
+#: io.cc:714
msgid "input"
msgstr ""
-#: io.cc:707
+#: io.cc:714
msgid "output"
msgstr ""
-#: io.cc:717
+#: io.cc:724
msgid "Unknown bundle \"%1\" listed for %2 of %3"
msgstr ""
-#: io.cc:783
+#: io.cc:790
msgid "Bundle %1 was not available - \"%2\" used instead"
msgstr ""
-#: io.cc:786
+#: io.cc:793
msgid "No %1 bundles available as a replacement"
msgstr ""
-#: io.cc:889
+#: io.cc:896
msgid "%1: cannot create I/O ports"
msgstr "%1: no se pueden crear puertos de E/S"
-#: io.cc:1017 io.cc:1121
+#: io.cc:1024 io.cc:1128
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr ""
-#: io.cc:1022 io.cc:1126
+#: io.cc:1029 io.cc:1133
msgid "bad input string in XML node \"%1\""
msgstr ""
-#: io.cc:1060
+#: io.cc:1067
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr ""
-#: io.cc:1065
+#: io.cc:1072
msgid "IO: bad output string in XML node \"%1\""
msgstr ""
-#: io.cc:1411
+#: io.cc:1417
#, c-format
msgid "%s %u"
msgstr "%s %u"
-#: io.cc:1458
+#: io.cc:1464
#, c-format
msgid "%s in"
msgstr ""
-#: io.cc:1460
+#: io.cc:1466
#, c-format
msgid "%s out"
msgstr ""
-#: io.cc:1535 session.cc:686 session.cc:715
+#: io.cc:1541 session.cc:689 session.cc:718
msgid "mono"
msgstr ""
-#: io.cc:1537 session.cc:699 session.cc:729
+#: io.cc:1543 session.cc:702 session.cc:732
msgid "L"
msgstr ""
-#: io.cc:1537 session.cc:701 session.cc:731
+#: io.cc:1543 session.cc:704 session.cc:734
msgid "R"
msgstr ""
-#: io.cc:1539 io.cc:1545
+#: io.cc:1545 io.cc:1551
#, c-format
msgid "%d"
msgstr ""
-#: ladspa_plugin.cc:86
+#: ladspa_plugin.cc:93
+msgid "LADSPA: Unable to open module: "
+msgstr ""
+
+#: ladspa_plugin.cc:99
msgid "LADSPA: module has no descriptor function."
msgstr ""
-#: ladspa_plugin.cc:91
+#: ladspa_plugin.cc:106
msgid "LADSPA: plugin has gone away since discovery!"
msgstr ""
-#: ladspa_plugin.cc:98
+#: ladspa_plugin.cc:113
msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
msgstr ""
-#: ladspa_plugin.cc:297
+#: ladspa_plugin.cc:311
msgid ""
"illegal parameter number used with plugin \"%1\". This may indicate a change "
"in the plugin design, and presets may be invalid"
msgstr ""
-#: ladspa_plugin.cc:376 ladspa_plugin.cc:426
+#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr ""
-#: ladspa_plugin.cc:391 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
msgid "LADSPA: no ladspa port number"
msgstr ""
-#: ladspa_plugin.cc:397 ladspa_plugin.cc:446
+#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
msgid "LADSPA: no ladspa port data"
msgstr ""
-#: ladspa_plugin.cc:717
-msgid "LADSPA: cannot load module from \"%1\""
-msgstr ""
-
-#: ladspa_plugin.cc:827
+#: ladspa_plugin.cc:840
msgid "Could not locate HOME. Preset not removed."
msgstr ""
-#: ladspa_plugin.cc:864 ladspa_plugin.cc:870
+#: ladspa_plugin.cc:879 ladspa_plugin.cc:885
msgid "Could not create %1. Preset not saved. (%2)"
msgstr "No se pudo crear %1. El preset no se guardó. (%2)"
-#: ladspa_plugin.cc:877
+#: ladspa_plugin.cc:892
msgid "Error saving presets file %1."
msgstr "Error al guardar el archivo de preset %1."
-#: ladspa_plugin.cc:915
+#: ladspa_plugin.cc:934
msgid "Could not locate HOME. Preset not saved."
msgstr ""
@@ -987,7 +1001,7 @@ msgstr ""
msgid "incorrect XML mode passed to Locations::set_state"
msgstr ""
-#: location.cc:842 session.cc:4516 session_state.cc:1031
+#: location.cc:842 session.cc:4533 session_state.cc:1025
msgid "session"
msgstr "sesión"
@@ -1044,40 +1058,39 @@ msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
msgstr ""
#: ltc_slave.cc:591
-#, c-format
msgid "flywheel"
msgstr ""
-#: midi_diskstream.cc:167
+#: midi_diskstream.cc:166
msgid ""
"%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
msgstr ""
-#: midi_diskstream.cc:219
+#: midi_diskstream.cc:218
msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
msgstr ""
-#: midi_diskstream.cc:270
+#: midi_diskstream.cc:269
msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
-#: midi_diskstream.cc:699
+#: midi_diskstream.cc:698
msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-#: midi_diskstream.cc:834
+#: midi_diskstream.cc:833
msgid "MidiDiskstream %1: cannot write to disk"
msgstr ""
-#: midi_diskstream.cc:868
+#: midi_diskstream.cc:867
msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: midi_diskstream.cc:955
+#: midi_diskstream.cc:954
msgid "%1: could not create region for complete midi file"
msgstr ""
-#: midi_diskstream.cc:992
+#: midi_diskstream.cc:991
msgid "MidiDiskstream: could not create region for captured midi!"
msgstr ""
@@ -1089,27 +1102,27 @@ msgstr ""
msgid "No SysExID found for sys-ex property change - ignored"
msgstr ""
-#: midi_model.cc:2010
+#: midi_model.cc:2012
msgid "transpose"
msgstr ""
-#: midi_patch_manager.cc:126
+#: midi_patch_manager.cc:127
msgid "Duplicate MIDI device `%1' in `%2' ignored"
msgstr ""
-#: midi_source.cc:125
+#: midi_source.cc:124
msgid "Missing parameter property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:132
+#: midi_source.cc:131
msgid "Missing style property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:144
+#: midi_source.cc:143
msgid "Missing parameter property on AutomationState"
msgstr ""
-#: midi_source.cc:151
+#: midi_source.cc:150
msgid "Missing state property on AutomationState"
msgstr ""
@@ -1153,21 +1166,21 @@ msgstr ""
msgid "solo control"
msgstr ""
-#: mtc_slave.cc:238
+#: mtc_slave.cc:240
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr ""
-#: mtc_slave.cc:361
+#: mtc_slave.cc:362
msgid ""
"Unknown rate/drop value %1 in incoming MTC stream, session values used "
"instead"
msgstr ""
-#: mtc_slave.cc:381
+#: mtc_slave.cc:382
msgid "Session framerate adjusted from %1 TO: MTC's %2."
msgstr ""
-#: mtc_slave.cc:395
+#: mtc_slave.cc:396
msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
msgstr ""
@@ -1227,31 +1240,35 @@ msgstr ""
msgid "Pannable given XML data for %1 - ignored"
msgstr ""
-#: panner_manager.cc:76
-msgid "looking for panners in %1"
+#: panner_manager.cc:80
+msgid "looking for panners in %1\n"
msgstr ""
-#: panner_manager.cc:100
-msgid "Panner discovered: \"%1\" in %2"
+#: panner_manager.cc:108
+msgid "Panner discovered: \"%1\" in %2\n"
msgstr ""
-#: panner_manager.cc:117
+#: panner_manager.cc:125
msgid "PannerManager: cannot load module \"%1\" (%2)"
msgstr ""
-#: panner_manager.cc:124
+#: panner_manager.cc:132
msgid "PannerManager: module \"%1\" has no descriptor function."
msgstr ""
-#: panner_manager.cc:187
+#: panner_manager.cc:219
msgid "no panner discovered for in/out = %1/%2"
msgstr ""
-#: panner_shell.cc:179
+#: panner_shell.cc:126
+msgid "select panner: %1\n"
+msgstr ""
+
+#: panner_shell.cc:245
msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
msgstr ""
-#: panner_shell.cc:185
+#: panner_shell.cc:251
msgid "panner plugin node has no type information!"
msgstr ""
@@ -1271,19 +1288,19 @@ msgstr ""
msgid "Could not construct playlist for PlaylistSource from session data!"
msgstr ""
-#: plugin.cc:324
+#: plugin.cc:328
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin.cc:398
+#: plugin.cc:402
msgid ""
"Saving plugin settings is not supported in this build of %1. Consider paying "
"for the full version"
msgstr ""
-#: plugin_insert.cc:598
+#: plugin_insert.cc:589
msgid "programming error: "
msgstr "error de programación:"
@@ -1319,43 +1336,43 @@ msgstr ""
msgid "PluginInsert: automatable control %1 not found - ignored"
msgstr ""
-#: plugin_manager.cc:161
+#: plugin_manager.cc:165
msgid "Discovering Plugins"
msgstr "Descubriendo plugins"
-#: plugin_manager.cc:335
+#: plugin_manager.cc:286
msgid "Could not parse rdf file: %1"
msgstr ""
-#: plugin_manager.cc:374
+#: plugin_manager.cc:330
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr ""
-#: plugin_manager.cc:381
+#: plugin_manager.cc:337
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr ""
-#: plugin_manager.cc:602
+#: plugin_manager.cc:567
msgid ""
"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
"at this time"
msgstr ""
-#: plugin_manager.cc:709
+#: plugin_manager.cc:680
msgid ""
"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
"in %2 at this time"
msgstr ""
-#: plugin_manager.cc:870
+#: plugin_manager.cc:841
msgid "unknown plugin status type \"%1\" - all entries ignored"
msgstr "unknown plugin status type \"%1\" - all entries ignored"
-#: plugin_manager.cc:887
+#: plugin_manager.cc:858
msgid "unknown plugin type \"%1\" - ignored"
msgstr "Tipo de plugin desconocido \"%1\" - ignorado"
-#: port.cc:410
+#: port.cc:412
msgid "could not reregister %1"
msgstr "no se pudo registrar %1"
@@ -1363,11 +1380,11 @@ msgstr "no se pudo registrar %1"
msgid "insert %1"
msgstr "insert %1"
-#: port_insert.cc:198
+#: port_insert.cc:197
msgid "XML node describing port insert is missing the `type' field"
msgstr ""
-#: port_insert.cc:203
+#: port_insert.cc:202
msgid "non-port insert XML used for port plugin insert"
msgstr ""
@@ -1401,11 +1418,11 @@ msgstr "AudioEngine: no se puede conectar %1 (%2) a %3 (%4)"
msgid "Re-establising port %1 failed"
msgstr ""
-#: processor.cc:207
+#: processor.cc:208
msgid "No %1 property flag in element %2"
msgstr ""
-#: processor.cc:216
+#: processor.cc:217
msgid "No child node with active property"
msgstr ""
@@ -1473,11 +1490,11 @@ msgstr ""
msgid "cannot create new name for region \"%1\""
msgstr "no se puede crear un nuevo nombre para region \"%1\""
-#: resampled_source.cc:98
+#: resampled_source.cc:102
msgid "Import: %1"
msgstr "Importar: %1"
-#: resampled_source.cc:128
+#: resampled_source.cc:132 srcfilesource.cc:76
msgid "Import: src_new() failed : %1"
msgstr ""
@@ -1485,27 +1502,27 @@ msgstr ""
msgid "return %1"
msgstr "retorno %1"
-#: route.cc:1075 route.cc:2528
+#: route.cc:1081 route.cc:2541
msgid "unknown Processor type \"%1\"; ignored"
msgstr ""
-#: route.cc:1087
+#: route.cc:1093
msgid "processor could not be created. Ignored."
msgstr ""
-#: route.cc:1962 route.cc:2187
+#: route.cc:1975 route.cc:2200
msgid "Bad node sent to Route::set_state() [%1]"
msgstr ""
-#: route.cc:2022
+#: route.cc:2035
msgid "Pannable state found for route (%1) without a panner!"
msgstr ""
-#: route.cc:2096 route.cc:2100 route.cc:2301 route.cc:2305
+#: route.cc:2109 route.cc:2113 route.cc:2314 route.cc:2318
msgid "badly formed order key string in state file! [%1] ... ignored."
msgstr ""
-#: route.cc:2311
+#: route.cc:2324
msgid "Converting deprecated order key for %1 using Editor order %2"
msgstr ""
@@ -1521,15 +1538,15 @@ msgstr ""
msgid "error writing tempo-adjusted data to %1"
msgstr ""
-#: send.cc:59
+#: send.cc:60
msgid "aux %1"
msgstr ""
-#: send.cc:63
+#: send.cc:64
msgid "send %1"
msgstr "send %1"
-#: send.cc:65
+#: send.cc:66
msgid "programming error: send created using role %1"
msgstr ""
@@ -1553,73 +1570,73 @@ msgstr ""
msgid "Set up standard connections"
msgstr "Configurar las conexiones estándar"
-#: session.cc:635
+#: session.cc:638
msgid "could not setup Click I/O"
msgstr "no se pudo configurar la E/S del click"
-#: session.cc:683
+#: session.cc:686
#, c-format
msgid "out %<PRIu32>"
msgstr ""
-#: session.cc:697
+#: session.cc:700
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr ""
-#: session.cc:712
+#: session.cc:715
#, c-format
msgid "in %<PRIu32>"
msgstr ""
-#: session.cc:726
+#: session.cc:729
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr ""
-#: session.cc:790
+#: session.cc:793
msgid "cannot connect master output %1 to %2"
msgstr "no se puede conectar salida master %1 a %2"
-#: session.cc:849
+#: session.cc:862
msgid "monitor"
msgstr ""
-#: session.cc:894
+#: session.cc:907
msgid "cannot connect control input %1 to %2"
msgstr ""
-#: session.cc:914
+#: session.cc:927
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr ""
-#: session.cc:945
+#: session.cc:958
msgid "cannot connect control output %1 to %2"
msgstr ""
-#: session.cc:1009
+#: session.cc:1026
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr ""
-#: session.cc:1193
+#: session.cc:1210
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
-#: session.cc:1233
+#: session.cc:1250
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
msgstr ""
-#: session.cc:1547
+#: session.cc:1564
msgid "feedback loop setup between %1 and %2"
msgstr ""
-#: session.cc:1843
+#: session.cc:1860
msgid "Session: could not create new midi track."
msgstr ""
-#: session.cc:1849
+#: session.cc:1866
msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks."
@@ -1627,75 +1644,75 @@ msgstr ""
"JACK no dispone de más puertos. Debes salir de %1 y reiniciar JACK con más "
"puertos si necesitas tantas pistas."
-#: session.cc:2026 session.cc:2029
+#: session.cc:2043 session.cc:2046
msgid "Audio"
msgstr ""
-#: session.cc:2053 session.cc:2061 session.cc:2138 session.cc:2146
+#: session.cc:2070 session.cc:2078 session.cc:2155 session.cc:2163
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr ""
-#: session.cc:2084
+#: session.cc:2101
msgid "Session: could not create new audio track."
msgstr ""
-#: session.cc:2116 session.cc:2119
+#: session.cc:2133 session.cc:2136
msgid "Bus"
msgstr ""
-#: session.cc:2169
+#: session.cc:2186
msgid "Session: could not create new audio route."
msgstr "Sesión: No se pudo crear la ruta del nuevo audio"
-#: session.cc:2228 session.cc:2238
+#: session.cc:2245 session.cc:2255
msgid "Session: UINT_MAX routes? impossible!"
msgstr ""
-#: session.cc:2260
+#: session.cc:2277
msgid "Session: cannot create track/bus from template description"
msgstr ""
-#: session.cc:2286
+#: session.cc:2303
msgid "Session: could not create new route from template"
msgstr "Sesión: No se pudo crear la nueva ruta desde plantilla"
-#: session.cc:2315
+#: session.cc:2332
msgid "Adding new tracks/busses failed"
msgstr ""
-#: session.cc:3419
+#: session.cc:3436
msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename"
msgstr ""
-#: session.cc:3539 session.cc:3597
+#: session.cc:3556 session.cc:3614
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr ""
-#: session.cc:3987
+#: session.cc:4004
msgid "send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:3999
+#: session.cc:4016
msgid "aux send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4011
+#: session.cc:4028
msgid "return ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4023
+#: session.cc:4040
msgid "insert ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4150
+#: session.cc:4167
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr ""
-#: session.cc:4179
+#: session.cc:4196
msgid "too many bounced versions of playlist \"%1\""
msgstr ""
-#: session.cc:4189
+#: session.cc:4206
msgid "cannot create new audio file \"%1\" for %2"
msgstr "no se puede crear nuevo archivo de audio"
@@ -1730,7 +1747,7 @@ msgstr ""
msgid "Session subdirectory does not exist at path %1"
msgstr ""
-#: session_events.cc:184
+#: session_events.cc:185
msgid "Session: cannot have two events of type %1 at the same frame (%2)."
msgstr ""
@@ -1742,13 +1759,13 @@ msgstr ""
msgid "Export ended unexpectedly: %1"
msgstr ""
-#: session_ltc.cc:222
+#: session_ltc.cc:221
msgid ""
"LTC encoder: invalid framerate - LTC encoding is disabled for the remainder "
"of this session."
msgstr ""
-#: session_midi.cc:520
+#: session_midi.cc:519
msgid "Session: cannot send quarter-frame MTC message (%1)"
msgstr ""
@@ -1760,351 +1777,343 @@ msgstr ""
msgid "Session: error in no roll for %1"
msgstr ""
-#: session_process.cc:1157
+#: session_process.cc:1159
msgid "Programming error: illegal event type in process_event (%1)"
msgstr ""
-#: session_state.cc:140
-msgid "Could not use path %1 (%2)"
-msgstr ""
-
-#: session_state.cc:184
+#: session_state.cc:178
msgid "solo cut control (dB)"
msgstr ""
-#: session_state.cc:208
+#: session_state.cc:202
msgid "Set block size and sample rate"
msgstr ""
-#: session_state.cc:213
+#: session_state.cc:207
msgid "Using configuration"
msgstr ""
-#: session_state.cc:325
+#: session_state.cc:319
msgid "Reset Remote Controls"
msgstr "Restablecer controles remotos"
-#: session_state.cc:417
+#: session_state.cc:411
msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:424
+#: session_state.cc:418
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr ""
-#: session_state.cc:431
+#: session_state.cc:425
msgid "Session: cannot create session midi dir \"%1\" (%2)"
msgstr ""
-#: session_state.cc:438
+#: session_state.cc:432
msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:445
+#: session_state.cc:439
msgid "Session: cannot create session export folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:452
+#: session_state.cc:446
msgid "Session: cannot create session analysis folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:459
+#: session_state.cc:453
msgid "Session: cannot create session plugins folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:466
+#: session_state.cc:460
msgid "Session: cannot create session externals folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:480
+#: session_state.cc:474
msgid "Session: cannot create session folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:514
+#: session_state.cc:508
msgid "Could not open %1 for writing session template"
msgstr ""
-#: session_state.cc:520
+#: session_state.cc:514
msgid "Could not open session template %1 for reading"
msgstr ""
-#: session_state.cc:539
+#: session_state.cc:533
msgid "master"
msgstr ""
-#: session_state.cc:600
+#: session_state.cc:594
msgid "Could not remove pending capture state at path \"%1\" (%2)"
msgstr "Could not remove pending capture state at path \"%1\" (%2)"
-#: session_state.cc:624
+#: session_state.cc:618
msgid "could not rename snapshot %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:652
+#: session_state.cc:646
msgid "Could not remove session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:669
+#: session_state.cc:663
msgid ""
"the %1 audio engine is not connected and state saving would lose all I/O "
"connections. Session not saved"
msgstr ""
-#: session_state.cc:720
+#: session_state.cc:714
msgid "state could not be saved to %1"
msgstr ""
-#: session_state.cc:722 session_state.cc:733
+#: session_state.cc:716 session_state.cc:727
msgid "Could not remove temporary session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:730
-msgid "could not rename temporary session file %1 to %2"
+#: session_state.cc:724
+msgid "could not rename temporary session file %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:798
+#: session_state.cc:792
msgid "%1: session file \"%2\" doesn't exist!"
msgstr ""
-#: session_state.cc:810
+#: session_state.cc:804
msgid "Could not understand session file %1"
msgstr ""
-#: session_state.cc:819
+#: session_state.cc:813
msgid "Session file %1 is not a session"
msgstr "El archivo de sesión %1 no es una sesión"
-#: session_state.cc:1125
+#: session_state.cc:1119
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
-#: session_state.cc:1179
+#: session_state.cc:1173
msgid "Session: XML state has no options section"
msgstr ""
-#: session_state.cc:1184
+#: session_state.cc:1178
msgid "Session: XML state has no metadata section"
msgstr ""
-#: session_state.cc:1195
+#: session_state.cc:1189
msgid "Session: XML state has no sources section"
msgstr ""
-#: session_state.cc:1202
+#: session_state.cc:1196
msgid "Session: XML state has no Tempo Map section"
msgstr ""
-#: session_state.cc:1209
+#: session_state.cc:1203
msgid "Session: XML state has no locations section"
msgstr ""
-#: session_state.cc:1235
+#: session_state.cc:1229
msgid "Session: XML state has no Regions section"
msgstr ""
-#: session_state.cc:1242
+#: session_state.cc:1236
msgid "Session: XML state has no playlists section"
msgstr ""
-#: session_state.cc:1262
+#: session_state.cc:1256
msgid "Session: XML state has no bundles section"
msgstr ""
-#: session_state.cc:1274
+#: session_state.cc:1268
msgid "Session: XML state has no diskstreams section"
msgstr ""
-#: session_state.cc:1282
+#: session_state.cc:1276
msgid "Session: XML state has no routes section"
msgstr ""
-#: session_state.cc:1294
+#: session_state.cc:1288
msgid "Session: XML state has no route groups section"
msgstr ""
-#: session_state.cc:1303
+#: session_state.cc:1297
msgid "Session: XML state has no edit groups section"
msgstr ""
-#: session_state.cc:1310
+#: session_state.cc:1304
msgid "Session: XML state has no mix groups section"
msgstr ""
-#: session_state.cc:1318
+#: session_state.cc:1312
msgid "Session: XML state has no click section"
msgstr ""
-#: session_state.cc:1360
+#: session_state.cc:1354
msgid "Session: cannot create Route from XML description."
msgstr ""
-#: session_state.cc:1364
+#: session_state.cc:1358
msgid "Loaded track/bus %1"
msgstr "Pista/bus %1 cargado"
-#: session_state.cc:1462
+#: session_state.cc:1456
msgid "Could not find diskstream for route"
msgstr ""
-#: session_state.cc:1516
+#: session_state.cc:1510
msgid "Session: cannot create Region from XML description."
msgstr ""
-#: session_state.cc:1520
+#: session_state.cc:1514
msgid "Can not load state for region '%1'"
msgstr "No se puede cargar el estado de la región '%1'"
-#: session_state.cc:1556
+#: session_state.cc:1550
msgid "Regions in compound description not found (ID's %1 and %2): ignored"
msgstr ""
-#: session_state.cc:1584
+#: session_state.cc:1578
msgid "Nested source has no ID info in session file! (ignored)"
msgstr ""
-#: session_state.cc:1596
+#: session_state.cc:1590
msgid "Cannot reconstruct nested source for region %1"
msgstr ""
-#: session_state.cc:1658
+#: session_state.cc:1652
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707
+#: session_state.cc:1660 session_state.cc:1681 session_state.cc:1701
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713
+#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
msgstr ""
-#: session_state.cc:1736
+#: session_state.cc:1730
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
msgstr ""
-#: session_state.cc:1770
+#: session_state.cc:1764
msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1778
+#: session_state.cc:1772
msgid ""
"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1784
+#: session_state.cc:1778
msgid ""
"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
msgstr ""
-#: session_state.cc:1852
+#: session_state.cc:1846
msgid ""
"cannot create new file from region name \"%1\" with ident = \"%2\": too many "
"existing files with similar names"
msgstr ""
-#: session_state.cc:1875
+#: session_state.cc:1869
msgid "Session: cannot create Source from XML description."
msgstr ""
-#: session_state.cc:1909
+#: session_state.cc:1903
msgid "A sound file is missing. It will be replaced by silence."
msgstr "No se encuentra un archivo de audio. Será reemplazado por silencio."
-#: session_state.cc:1932
+#: session_state.cc:1926
msgid "Found a sound file that cannot be used by %1. Talk to the progammers."
msgstr "Found a sound file that cannot be used by %1. Talk to the progammers."
-#: session_state.cc:1949
+#: session_state.cc:1943
msgid "Could not create templates directory \"%1\" (%2)"
msgstr ""
-#: session_state.cc:1962
+#: session_state.cc:1956
msgid "Template \"%1\" already exists - new version not created"
msgstr "La plantilla \"%1\" ya existe - no se creará una nueva versión"
-#: session_state.cc:1968
+#: session_state.cc:1962
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr "Could not create directory for Session template\"%1\" (%2)"
-#: session_state.cc:1978
+#: session_state.cc:1972
msgid "template not saved"
msgstr "plantilla no guardada"
-#: session_state.cc:1988
+#: session_state.cc:1982
msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
msgstr ""
"Could not create directory for Session template plugin state\"%1\" (%2)"
-#: session_state.cc:2183
+#: session_state.cc:2225
msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr ""
-#: session_state.cc:2725 session_state.cc:2731
-msgid "Cannot expand path %1 (%2)"
-msgstr ""
-
-#: session_state.cc:2784
+#: session_state.cc:2820
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:2823
+#: session_state.cc:2859
msgid "cannot rename unused file source from %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:2841
+#: session_state.cc:2877
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr ""
-#: session_state.cc:3143
+#: session_state.cc:3179
msgid "could not backup old history file, current history not saved"
msgstr ""
-#: session_state.cc:3156
+#: session_state.cc:3192
msgid "history could not be saved to %1"
msgstr "No se pudo guardar el historial a %1"
-#: session_state.cc:3159
+#: session_state.cc:3195
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr "Could not remove history file at path \"%1\" (%2)"
-#: session_state.cc:3163
+#: session_state.cc:3199
msgid "could not restore history file from backup %1 (%2)"
msgstr ""
-#: session_state.cc:3188
+#: session_state.cc:3224
msgid "%1: no history file \"%2\" for this session."
msgstr ""
-#: session_state.cc:3194
+#: session_state.cc:3230
msgid "Could not understand session history file \"%1\""
msgstr "No se pudo interpretar el archivo de historial de sesión \"%1\"."
-#: session_state.cc:3236
+#: session_state.cc:3272
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr ""
-#: session_state.cc:3247
+#: session_state.cc:3283
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr ""
-#: session_state.cc:3258
+#: session_state.cc:3294
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr ""
-#: session_state.cc:3266
+#: session_state.cc:3302
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr ""
-#: session_state.cc:3502
+#: session_state.cc:3538
msgid "Session: unknown diskstream type in XML"
msgstr ""
-#: session_state.cc:3507
+#: session_state.cc:3543
msgid "Session: could not load diskstream via XML state"
msgstr ""
@@ -2128,198 +2137,206 @@ msgid ""
"control"
msgstr ""
-#: smf_source.cc:252
+#: smf_source.cc:262
msgid "Unable to read event prefix, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:265
+#: smf_source.cc:275
msgid "Event has time and size but no body, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:271
+#: smf_source.cc:281
msgid "Event time is before MIDI source position"
msgstr ""
-#: smf_source.cc:306 smf_source.cc:345
+#: smf_source.cc:316 smf_source.cc:355
msgid "Skipping event with unordered time %1"
msgstr ""
-#: smf_source.cc:410
+#: smf_source.cc:420
msgid "cannot open MIDI file %1 for write"
msgstr ""
-#: sndfile_helpers.cc:32
+#: sndfile_helpers.cc:34
msgid "WAV"
msgstr "WAV"
-#: sndfile_helpers.cc:33
+#: sndfile_helpers.cc:35
msgid "AIFF"
msgstr "AIFF"
-#: sndfile_helpers.cc:34
+#: sndfile_helpers.cc:36
msgid "CAF"
msgstr "CAF"
-#: sndfile_helpers.cc:35
+#: sndfile_helpers.cc:37
msgid "W64 (64 bit WAV)"
msgstr "W64 (64 bit WAV)"
-#: sndfile_helpers.cc:36
+#: sndfile_helpers.cc:38
msgid "FLAC"
msgstr ""
-#: sndfile_helpers.cc:37
+#: sndfile_helpers.cc:39
msgid "Ogg/Vorbis"
msgstr ""
-#: sndfile_helpers.cc:38
+#: sndfile_helpers.cc:40
msgid "raw (no header)"
msgstr "raw (sin encabezado)"
-#: sndfile_helpers.cc:43
+#: sndfile_helpers.cc:45
msgid ".wav"
msgstr ".wav"
-#: sndfile_helpers.cc:44
+#: sndfile_helpers.cc:46
msgid ".aiff"
msgstr ".aiff"
-#: sndfile_helpers.cc:45
+#: sndfile_helpers.cc:47
msgid ".caf"
msgstr ".caf"
-#: sndfile_helpers.cc:46
+#: sndfile_helpers.cc:48
msgid ".w64"
msgstr ".w64"
-#: sndfile_helpers.cc:47
+#: sndfile_helpers.cc:49
msgid ".flac"
msgstr ".flac"
-#: sndfile_helpers.cc:48
+#: sndfile_helpers.cc:50
msgid ".ogg"
msgstr ""
-#: sndfile_helpers.cc:49
+#: sndfile_helpers.cc:51
msgid ".raw"
msgstr ".raw"
-#: sndfile_helpers.cc:64
+#: sndfile_helpers.cc:66
msgid "Signed 16 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:65
+#: sndfile_helpers.cc:67
msgid "Signed 24 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:66
+#: sndfile_helpers.cc:68
msgid "Signed 32 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:67
+#: sndfile_helpers.cc:69
msgid "Signed 8 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:68
+#: sndfile_helpers.cc:70
msgid "32 bit float"
msgstr ""
-#: sndfile_helpers.cc:81
+#: sndfile_helpers.cc:83
msgid "Little-endian (Intel)"
msgstr "Little-endian (Intel)"
-#: sndfile_helpers.cc:82
+#: sndfile_helpers.cc:84
msgid "Big-endian (PowerPC)"
msgstr "Big-endian (PowerPC)"
-#: sndfilesource.cc:201
+#: sndfilesource.cc:210
msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
msgstr ""
-#: sndfilesource.cc:209
+#: sndfilesource.cc:218
msgid ""
"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
"number"
msgstr ""
-#: sndfilesource.cc:255 sndfilesource.cc:571 sndfilesource.cc:595
+#: sndfilesource.cc:264 sndfilesource.cc:604 sndfilesource.cc:628
msgid ""
"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
"for this file"
msgstr ""
-#: sndfilesource.cc:302
+#: sndfilesource.cc:311
msgid "could not allocate file %1 for reading."
msgstr ""
-#: sndfilesource.cc:337
+#: sndfilesource.cc:346
msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
msgstr ""
-#: sndfilesource.cc:347
+#: sndfilesource.cc:356
msgid ""
"SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
msgstr ""
-#: sndfilesource.cc:391 sndfilesource.cc:420
+#: sndfilesource.cc:400 sndfilesource.cc:429
msgid "attempt to write a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:396 utils.cc:510 utils.cc:534 utils.cc:548 utils.cc:567
+#: sndfilesource.cc:405 utils.cc:547 utils.cc:571 utils.cc:585 utils.cc:604
msgid "programming error: %1 %2"
msgstr "error de programación: %1 %2"
-#: sndfilesource.cc:523
+#: sndfilesource.cc:532 sndfilesource.cc:562
msgid "attempt to flush a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:528
+#: sndfilesource.cc:537 sndfilesource.cc:557
msgid "attempt to flush an un-opened audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:534
+#: sndfilesource.cc:543
msgid "could not allocate file %1 to write header"
msgstr ""
-#: sndfilesource.cc:548
+#: sndfilesource.cc:568
+msgid "could not allocate file %1 to flush contents"
+msgstr ""
+
+#: sndfilesource.cc:581
msgid ""
"attempt to store broadcast info in a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:553
+#: sndfilesource.cc:586
msgid "attempt to set BWF info for an un-opened audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:614
+#: sndfilesource.cc:647
msgid "%1: cannot seek to %2 (libsndfile error: %3)"
msgstr ""
-#: sndfilesource.cc:727
+#: sndfilesource.cc:760
msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
msgstr ""
-#: sndfilesource.cc:740 sndfilesource.cc:790 sndfilesource.cc:797
+#: sndfilesource.cc:773 sndfilesource.cc:823 sndfilesource.cc:830
msgid "SndFileSource: \"%1\" bad write (%2)"
msgstr ""
-#: sndfilesource.cc:820
+#: sndfilesource.cc:853
msgid ""
"Filesource: start time is already set for existing file (%1): Cannot change "
"start time."
msgstr ""
-#: speakers.cc:239
+#: speakers.cc:280
msgid "Speaker information is missing azimuth - speaker ignored"
msgstr ""
-#: speakers.cc:245
+#: speakers.cc:286
msgid "Speaker information is missing elevation - speaker ignored"
msgstr ""
-#: speakers.cc:251
+#: speakers.cc:292
msgid "Speaker information is missing distance - speaker ignored"
msgstr ""
+#: srcfilesource.cc:135
+msgid "SrcFileSource: %1"
+msgstr ""
+
#: tape_file_matcher.cc:46
msgid "Cannot compile tape track regexp for use (%1)"
msgstr ""
@@ -2467,54 +2484,68 @@ msgstr ""
msgid "Node for Port has no \"name\" property"
msgstr ""
-#: utils.cc:358 utils.cc:382
+#: utils.cc:395 utils.cc:419
msgid "Splice"
msgstr "Reunir"
-#: utils.cc:360 utils.cc:375
+#: utils.cc:397 utils.cc:412
msgid "Slide"
msgstr "Deslizar"
-#: utils.cc:362 utils.cc:378
+#: utils.cc:399 utils.cc:415
msgid "Lock"
msgstr "Bloquear"
-#: utils.cc:365
+#: utils.cc:402
msgid "programming error: unknown edit mode string \"%1\""
msgstr ""
-#: utils.cc:389 utils.cc:421
+#: utils.cc:426 utils.cc:458
msgid "MIDI Timecode"
msgstr ""
-#: utils.cc:389 utils.cc:419
+#: utils.cc:426 utils.cc:456
msgid "MTC"
msgstr "MTC"
-#: utils.cc:393 utils.cc:428
+#: utils.cc:430 utils.cc:465
msgid "MIDI Clock"
msgstr ""
-#: utils.cc:397 utils.cc:415 utils.cc:435
+#: utils.cc:434 utils.cc:452 utils.cc:472
msgid "JACK"
msgstr "JACK"
-#: utils.cc:401
+#: utils.cc:438
msgid "programming error: unknown sync source string \"%1\""
msgstr ""
-#: utils.cc:426
+#: utils.cc:463
msgid "M-Clock"
msgstr ""
-#: utils.cc:432
+#: utils.cc:469
msgid "LTC"
msgstr "LTC"
-#: utils.cc:602
+#: utils.cc:639
msgid "programming error: unknown native header format: %1"
msgstr ""
-#: utils.cc:617
+#: utils.cc:654
msgid "cannot open directory %1 (%2)"
msgstr ""
+
+#~ msgid "Auditioning of non-audio regions not yet supported"
+#~ msgstr "Aún no está soportada la audición de regiones no audio"
+
+#~ msgid "Filesource: cannot find required file (%1): while searching %2"
+#~ msgstr ""
+#~ "Filesource: no se puede encontrar el archivo requerido (%1): al buscar %2."
+
+#~ msgid ""
+#~ "FileSource: \"%1\" is ambigous when searching %2\n"
+#~ "\t"
+#~ msgstr ""
+#~ "Filesource: \"%1\" es ambiguo al buscar %2\n"
+#~ "\t"
diff --git a/libs/ardour/po/it.po b/libs/ardour/po/it.po
index 9eaa00ee95..5068b67419 100644
--- a/libs/ardour/po/it.po
+++ b/libs/ardour/po/it.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: libardour 0.664.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-11-05 11:11-0500\n"
+"POT-Creation-Date: 2014-02-10 17:53+0100\n"
"PO-Revision-Date: 2003-05-21 12:50+0500\n"
"Last-Translator: Filippo Pappalardo <filippo@email.it>\n"
"Language-Team: Italian\n"
@@ -20,64 +20,64 @@ msgstr ""
msgid "Fader"
msgstr ""
-#: audio_diskstream.cc:244
+#: audio_diskstream.cc:242
msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
msgstr ""
-#: audio_diskstream.cc:296
+#: audio_diskstream.cc:294
msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
-#: audio_diskstream.cc:848 audio_diskstream.cc:858
+#: audio_diskstream.cc:846 audio_diskstream.cc:856
msgid ""
"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
msgstr ""
-#: audio_diskstream.cc:1014
+#: audio_diskstream.cc:1012
msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-#: audio_diskstream.cc:1383 audio_diskstream.cc:1400
+#: audio_diskstream.cc:1381 audio_diskstream.cc:1398
msgid "AudioDiskstream %1: cannot write to disk"
msgstr ""
-#: audio_diskstream.cc:1443
+#: audio_diskstream.cc:1441
msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: audio_diskstream.cc:1537
+#: audio_diskstream.cc:1535
msgid "%1: could not create region for complete audio file"
msgstr "%1: impossibile creare una regione per il file audio completo"
-#: audio_diskstream.cc:1571
+#: audio_diskstream.cc:1569
msgid "AudioDiskstream: could not create region for captured audio!"
msgstr ""
-#: audio_diskstream.cc:1679
+#: audio_diskstream.cc:1677
msgid "programmer error: %1"
msgstr ""
-#: audio_diskstream.cc:1905
+#: audio_diskstream.cc:1903
msgid "AudioDiskstream: channel %1 out of range"
msgstr ""
-#: audio_diskstream.cc:1919 midi_diskstream.cc:1210
+#: audio_diskstream.cc:1917 midi_diskstream.cc:1209
msgid "%1:%2 new capture file not initialized correctly"
msgstr "%1:%2 nuovo file di registrazione non è stato avviato correttamente"
-#: audio_diskstream.cc:2200
+#: audio_diskstream.cc:2198
msgid "%1: cannot restore pending capture source file %2"
msgstr ""
-#: audio_diskstream.cc:2222
+#: audio_diskstream.cc:2220
msgid "%1: incorrect number of pending sources listed - ignoring them all"
msgstr ""
-#: audio_diskstream.cc:2246
+#: audio_diskstream.cc:2244
msgid "%1: cannot create whole-file region from pending capture sources"
msgstr ""
-#: audio_library.cc:71
+#: audio_library.cc:81
msgid "Could not open %1. Audio Library not saved"
msgstr "Impossibile accedere a %1. Libreria Audio non salvata"
@@ -117,11 +117,11 @@ msgstr ""
msgid "Audio Playlists (unused)"
msgstr ""
-#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529
+#: audio_playlist_source.cc:171 audiosource.cc:891 file_source.cc:520
#: midi_playlist_source.cc:144 midi_playlist_source.cc:152
-#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643
-#: rb_effect.cc:333 session.cc:2619 session.cc:2652 session.cc:3797
-#: session_handle.cc:87 sndfilesource.cc:121
+#: midi_playlist_source.cc:159 midi_source.cc:370 plugin_insert.cc:634
+#: rb_effect.cc:333 session.cc:2636 session.cc:2669 session.cc:3814
+#: session_handle.cc:87 sndfilesource.cc:122
msgid "programming error: %1"
msgstr "errore di programmazione: %1"
@@ -145,23 +145,23 @@ msgid ""
"Channels: "
msgstr ""
-#: audio_track.cc:167
+#: audio_track.cc:161
msgid "Unknown bundle \"%1\" listed for input of %2"
msgstr ""
-#: audio_track.cc:169
+#: audio_track.cc:163
msgid "in 1"
msgstr ""
-#: audio_track.cc:170
+#: audio_track.cc:164
msgid "No input bundles available as a replacement"
msgstr ""
-#: audio_track.cc:174
+#: audio_track.cc:168
msgid "Bundle %1 was not available - \"in 1\" used instead"
msgstr ""
-#: audio_track.cc:183
+#: audio_track.cc:177
msgid "improper input channel list in XML node (%1)"
msgstr ""
@@ -185,23 +185,23 @@ msgstr ""
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr ""
-#: audioengine.cc:488
+#: audioengine.cc:495
msgid "looking for backends in %1\n"
msgstr ""
-#: audioengine.cc:511
+#: audioengine.cc:518
msgid "AudioEngine: cannot load module \"%1\" (%2)"
msgstr ""
-#: audioengine.cc:517
+#: audioengine.cc:524
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr ""
-#: audioengine.cc:589
+#: audioengine.cc:596
msgid "Could not create backend for %1: %2"
msgstr ""
-#: audioregion.cc:1643
+#: audioregion.cc:1651
msgid ""
"You have requested an operation that requires audio analysis.\n"
"\n"
@@ -216,11 +216,11 @@ msgid ""
"this and future transient-detection operations.\n"
msgstr ""
-#: audiosource.cc:199
+#: audiosource.cc:210
msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
msgstr ""
-#: audiosource.cc:226
+#: audiosource.cc:239
msgid "AudioSource: cannot stat peakfile \"%1\""
msgstr ""
@@ -228,47 +228,68 @@ msgstr ""
msgid "cannot read sample data for unscaled peak computation"
msgstr ""
-#: audiosource.cc:387
+#: audiosource.cc:386
msgid "AudioSource: cannot open peakpath (a) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:463
+#: audiosource.cc:395 audiosource.cc:473
+msgid ""
+"AudioSource: could not seek to correct location in peak file \"%1\" (%2)"
+msgstr ""
+
+#: audiosource.cc:453
msgid "AudioSource: cannot open peakpath (b) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:587
+#: audiosource.cc:567
msgid ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
msgstr ""
-#: audiosource.cc:667
+#: audiosource.cc:634
msgid "%1: could not write read raw data for peak computation (%2)"
msgstr ""
-#: audiosource.cc:706
+#: audiosource.cc:672
msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:773 audiosource.cc:886
+#: audiosource.cc:739 audiosource.cc:861
+msgid "%1: could not seek in peak file data (%2)"
+msgstr ""
+
+#: audiosource.cc:744 audiosource.cc:870
msgid "%1: could not write peak file data (%2)"
msgstr ""
-#: audiosource.cc:924
+#: audiosource.cc:903
msgid "could not truncate peakfile %1 to %2 (error: %3)"
msgstr ""
-#: auditioner.cc:87
-msgid "no outputs available for auditioner - manual connection required"
+#: auditioner.cc:95
+msgid "Falling back to Reasonable Synth for Midi Audition"
+msgstr ""
+
+#: auditioner.cc:97
+msgid "No synth for midi-audition found."
msgstr ""
-#: auditioner.cc:135
-msgid "Auditioning of non-audio regions not yet supported"
+#: auditioner.cc:152
+msgid "no outputs available for auditioner - manual connection required"
msgstr ""
-#: auditioner.cc:160
+#: auditioner.cc:392 auditioner.cc:438
msgid "Cannot setup auditioner processing flow for %1 channels"
msgstr ""
+#: auditioner.cc:426
+msgid "Failed to load synth for MIDI-Audition."
+msgstr ""
+
+#: auditioner.cc:445
+msgid "Auditioning of regions other than Audio or Midi is not supported."
+msgstr ""
+
#: automatable.cc:81
msgid "Automation node has no path property"
msgstr ""
@@ -304,23 +325,23 @@ msgid ""
"AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
msgstr ""
-#: butler.cc:91
+#: butler.cc:80
msgid "Cannot create transport request signal pipe (%1)"
msgstr ""
-#: butler.cc:97 butler.cc:103
+#: butler.cc:86 butler.cc:92
msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)"
msgstr ""
-#: butler.cc:109
+#: butler.cc:124
msgid "Session: could not create butler thread"
msgstr ""
-#: butler.cc:156
+#: butler.cc:165
msgid "poll on butler request pipe failed (%1)"
msgstr ""
-#: butler.cc:163
+#: butler.cc:172
msgid "Error on butler thread request pipe: fd=%1 err=%2"
msgstr ""
@@ -328,56 +349,56 @@ msgstr ""
msgid "Error reading from butler request pipe"
msgstr ""
-#: butler.cc:248
+#: butler.cc:301
msgid "Butler read ahead failure on dstream %1"
msgstr ""
-#: butler.cc:285
+#: butler.cc:338
msgid "Butler write-behind failure on dstream %1"
msgstr ""
-#: control_protocol_manager.cc:134
+#: control_protocol_manager.cc:164
msgid "control protocol name \"%1\" has no descriptor"
msgstr ""
-#: control_protocol_manager.cc:141
+#: control_protocol_manager.cc:171
msgid "control protocol name \"%1\" could not be initialized"
msgstr ""
-#: control_protocol_manager.cc:201
+#: control_protocol_manager.cc:237
msgid "Instantiating mandatory control protocol %1"
msgstr ""
-#: control_protocol_manager.cc:222
+#: control_protocol_manager.cc:258
msgid "looking for control protocols in %1\n"
msgstr ""
-#: control_protocol_manager.cc:247
+#: control_protocol_manager.cc:283
msgid "Control protocol %1 not usable"
msgstr ""
-#: control_protocol_manager.cc:264
+#: control_protocol_manager.cc:300
msgid "Control surface protocol discovered: \"%1\"\n"
msgstr ""
-#: control_protocol_manager.cc:282
+#: control_protocol_manager.cc:318
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
msgstr ""
-#: control_protocol_manager.cc:290
+#: control_protocol_manager.cc:324
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr ""
-#: cycle_timer.cc:38
+#: cycle_timer.cc:40
msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
msgstr "CycleTimer::get_mhz(): impossibile accedere a /proc/cpuinfo"
-#: cycle_timer.cc:50
+#: cycle_timer.cc:52
msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo"
msgstr ""
"CycleTimer::get_mhz(): impossibile localizzare \"cpu MHz\" in /proc/cpuinfo"
-#: cycle_timer.cc:73
+#: cycle_timer.cc:75
msgid "cannot locate cpu MHz in /proc/cpuinfo"
msgstr "impossibile localizzare \"cpu MHz\" in /proc/cpuinfo"
@@ -385,7 +406,7 @@ msgstr "impossibile localizzare \"cpu MHz\" in /proc/cpuinfo"
msgid "audio"
msgstr ""
-#: data_type.cc:28 session.cc:1791 session.cc:1794
+#: data_type.cc:28 session.cc:1808 session.cc:1811
msgid "MIDI"
msgstr ""
@@ -393,15 +414,15 @@ msgstr ""
msgid "unknown"
msgstr ""
-#: delivery.cc:114
+#: delivery.cc:118
msgid "main outs"
msgstr ""
-#: delivery.cc:117 send.cc:61
+#: delivery.cc:121 send.cc:62
msgid "listen"
msgstr ""
-#: diskstream.cc:303
+#: diskstream.cc:302
msgid "Location \"%1\" not valid for track loop (start >= end)"
msgstr "La Location \"%1\" non valida per il loop (inizio >= fine)"
@@ -413,23 +434,23 @@ msgstr ""
msgid "Export failed: %1"
msgstr ""
-#: export_filename.cc:118
+#: export_filename.cc:119
msgid "Existing export folder for this session (%1) does not exist - ignored"
msgstr ""
-#: export_filename.cc:229
+#: export_filename.cc:230
msgid "No Time"
msgstr ""
-#: export_filename.cc:238
+#: export_filename.cc:239
msgid "Invalid time format"
msgstr ""
-#: export_filename.cc:247
+#: export_filename.cc:248
msgid "No Date"
msgstr ""
-#: export_filename.cc:262
+#: export_filename.cc:263
msgid "Invalid date format"
msgstr ""
@@ -497,7 +518,7 @@ msgstr ""
msgid "Rectangular"
msgstr ""
-#: export_formats.cc:52 session.cc:5014 session.cc:5030
+#: export_formats.cc:52 session.cc:5006 session.cc:5022
msgid "None"
msgstr ""
@@ -537,15 +558,15 @@ msgstr ""
msgid "No sample format"
msgstr ""
-#: export_handler.cc:335
+#: export_handler.cc:343
msgid "Editor: cannot open \"%1\" as export file for CD marker file"
msgstr ""
-#: export_handler.cc:417 export_handler.cc:420
+#: export_handler.cc:425 export_handler.cc:428
msgid "an error occured while writing a TOC/CUE file: %1"
msgstr ""
-#: export_handler.cc:642 export_handler.cc:700
+#: export_handler.cc:650 export_handler.cc:708
msgid "Cannot convert %1 to Latin-1 text"
msgstr ""
@@ -607,7 +628,7 @@ msgid ""
"configuration"
msgstr ""
-#: file_source.cc:198 session_state.cc:2807
+#: file_source.cc:198 session_state.cc:2843
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr ""
@@ -617,37 +638,35 @@ msgstr ""
msgid "cannot rename file source from %1 to %2 (%3)"
msgstr ""
-#: file_source.cc:250 file_source.cc:378
+#: file_source.cc:248 file_source.cc:372
msgid "FileSource: search path not set"
msgstr "FileSource: percorso di ricerca non specificato"
-#: file_source.cc:313 file_source.cc:448
-msgid "Filesource: cannot find required file (%1): while searching %2"
+#: file_source.cc:309 file_source.cc:439
+msgid "Filesource: cannot find required file (%1)"
msgstr ""
-#: file_source.cc:440
+#: file_source.cc:432
msgid ""
-"FileSource: \"%1\" is ambigous when searching %2\n"
+"FileSource: \"%1\" is ambigous when searching\n"
"\t"
msgstr ""
-"FileSource: \"%1\" è risultato ambiguo nel cercare %2\n"
-"\t"
-#: file_source.cc:494
+#: file_source.cc:484
msgid "Filesource: cannot find required file (%1): %2"
msgstr "FileSource: impossibile trovare il file richiesto (%1): %2"
-#: file_source.cc:501
+#: file_source.cc:492
msgid "Filesource: cannot check for existing file (%1): %2"
msgstr "FileSource: impossibile controllare il file esistente (%1): %2"
-#: file_source.cc:535
+#: file_source.cc:526
msgid ""
"Programming error! %1 tried to rename a file over another file! It's safe to "
"continue working, but please report this to the developers."
msgstr ""
-#: file_source.cc:540
+#: file_source.cc:531
msgid "cannot rename file %1 to %2 (%3)"
msgstr ""
@@ -661,15 +680,15 @@ msgid ""
"cannot run"
msgstr ""
-#: filesystem_paths.cc:91
+#: filesystem_paths.cc:96
msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
msgstr ""
-#: filesystem_paths.cc:107
+#: filesystem_paths.cc:125
msgid "ARDOUR_CONFIG_PATH not set in environment - exiting\n"
msgstr ""
-#: filesystem_paths.cc:127
+#: filesystem_paths.cc:148
msgid "ARDOUR_DATA_PATH not set in environment - exiting\n"
msgstr ""
@@ -681,87 +700,83 @@ msgstr ""
msgid "filter: error creating new file %1 (%2)"
msgstr ""
-#: find_session.cc:51
-msgid "Could not resolve path: %1 (%2)"
-msgstr ""
-
-#: find_session.cc:63
+#: find_session.cc:59
msgid "cannot check session path %1 (%2)"
msgstr "impossibile controllare il percorso %1 (%2)"
-#: find_session.cc:89
+#: find_session.cc:85
msgid "cannot check statefile %1 (%2)"
msgstr "impossibile controllare il file di stato %1 (%2)"
-#: find_session.cc:125
+#: find_session.cc:121
msgid "%1 is not a snapshot file"
msgstr ""
-#: find_session.cc:142
+#: find_session.cc:138
msgid "cannot determine current working directory (%1)"
msgstr "impossibile determinare la cartella di lavoro corrente (%1)"
-#: find_session.cc:159
+#: find_session.cc:155
msgid "unknown file type for session %1"
msgstr "tipo di fle sconosciuto per la sessione %1"
-#: globals.cc:207
+#: globals.cc:216
msgid "Could not set system open files limit to \"unlimited\""
msgstr ""
-#: globals.cc:209
+#: globals.cc:218
msgid "Could not set system open files limit to %1"
msgstr ""
-#: globals.cc:213
+#: globals.cc:222
msgid "Your system is configured to limit %1 to only %2 open files"
msgstr ""
-#: globals.cc:217
+#: globals.cc:226
msgid "Could not get system open files limit (%1)"
msgstr ""
-#: globals.cc:268
+#: globals.cc:280
msgid "Loading configuration"
msgstr ""
-#: import.cc:207
+#: import.cc:208
msgid "Could not find a source for %1 even though we are updating this file!"
msgstr ""
-#: import.cc:236
+#: import.cc:237
msgid "Unable to create file %1 during import"
msgstr ""
-#: import.cc:262
+#: import.cc:263
msgid "Resampling %1 from %2kHz to %3kHz"
msgstr ""
-#: import.cc:268
+#: import.cc:269
msgid "Copying %1"
msgstr ""
-#: import.cc:446
+#: import.cc:455
msgid "Track %1 of %2 contained no usable MIDI data"
msgstr ""
-#: import.cc:453
+#: import.cc:462
msgid "MIDI file %1 was not readable (no reason available)"
msgstr ""
-#: import.cc:499
+#: import.cc:508
msgid "Import: cannot open input sound file \"%1\""
msgstr "Import: impossibile aprire il file audio di input \"%1\""
-#: import.cc:510
+#: import.cc:519
msgid "Import: error opening MIDI file"
msgstr ""
-#: import.cc:549
+#: import.cc:558
msgid "Loading MIDI file %1"
msgstr ""
-#: import.cc:614
+#: import.cc:623
msgid "Failed to remove some files after failed/cancelled import operation"
msgstr ""
@@ -773,153 +788,153 @@ msgstr ""
msgid "preset %1 (bank %2)"
msgstr ""
-#: internal_send.cc:278 internal_send.cc:279
+#: internal_send.cc:300 internal_send.cc:301
msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
msgstr ""
-#: io.cc:208
+#: io.cc:209
msgid "IO: cannot disconnect port %1 from %2"
msgstr ""
-#: io.cc:343 io.cc:428
+#: io.cc:344 io.cc:431
msgid "IO: cannot register input port %1"
msgstr "IO: impossibile registrare la porta %1"
-#: io.cc:348 io.cc:433
+#: io.cc:349 io.cc:436
msgid "IO: cannot register output port %1"
msgstr "IO: impossibile registrare la porta %1"
-#: io.cc:591 io.cc:647
+#: io.cc:598 io.cc:654
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr ""
-#: io.cc:706
+#: io.cc:713
msgid "in"
msgstr ""
-#: io.cc:706
+#: io.cc:713
msgid "out"
msgstr ""
-#: io.cc:707
+#: io.cc:714
msgid "input"
msgstr ""
-#: io.cc:707
+#: io.cc:714
msgid "output"
msgstr ""
-#: io.cc:717
+#: io.cc:724
msgid "Unknown bundle \"%1\" listed for %2 of %3"
msgstr ""
-#: io.cc:783
+#: io.cc:790
msgid "Bundle %1 was not available - \"%2\" used instead"
msgstr ""
-#: io.cc:786
+#: io.cc:793
msgid "No %1 bundles available as a replacement"
msgstr ""
-#: io.cc:889
+#: io.cc:896
msgid "%1: cannot create I/O ports"
msgstr ""
-#: io.cc:1017 io.cc:1121
+#: io.cc:1024 io.cc:1128
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr "IO: stringa malformata nel nodo XML per le entrate \"%1\""
-#: io.cc:1022 io.cc:1126
+#: io.cc:1029 io.cc:1133
msgid "bad input string in XML node \"%1\""
msgstr "stringa malformata nel nodo XML \"%1\""
-#: io.cc:1060
+#: io.cc:1067
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr "IO: stringa mal formata nel nodo XML per le uscite \"%1\""
-#: io.cc:1065
+#: io.cc:1072
msgid "IO: bad output string in XML node \"%1\""
msgstr "IO: stringa mal formata nel nodo XML \"%1\""
-#: io.cc:1411
+#: io.cc:1417
#, c-format
msgid "%s %u"
msgstr ""
-#: io.cc:1458
+#: io.cc:1464
#, c-format
msgid "%s in"
msgstr ""
-#: io.cc:1460
+#: io.cc:1466
#, c-format
msgid "%s out"
msgstr ""
-#: io.cc:1535 session.cc:686 session.cc:715
+#: io.cc:1541 session.cc:689 session.cc:718
msgid "mono"
msgstr ""
-#: io.cc:1537 session.cc:699 session.cc:729
+#: io.cc:1543 session.cc:702 session.cc:732
msgid "L"
msgstr ""
-#: io.cc:1537 session.cc:701 session.cc:731
+#: io.cc:1543 session.cc:704 session.cc:734
msgid "R"
msgstr ""
-#: io.cc:1539 io.cc:1545
+#: io.cc:1545 io.cc:1551
#, c-format
msgid "%d"
msgstr ""
-#: ladspa_plugin.cc:86
+#: ladspa_plugin.cc:93
+msgid "LADSPA: Unable to open module: "
+msgstr ""
+
+#: ladspa_plugin.cc:99
msgid "LADSPA: module has no descriptor function."
msgstr "LADSPA: il modulo non ha alcuna funzione descriptor."
-#: ladspa_plugin.cc:91
+#: ladspa_plugin.cc:106
msgid "LADSPA: plugin has gone away since discovery!"
msgstr "LADSPA: il plugin è stato rimosso"
-#: ladspa_plugin.cc:98
+#: ladspa_plugin.cc:113
msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
msgstr ""
-#: ladspa_plugin.cc:297
+#: ladspa_plugin.cc:311
msgid ""
"illegal parameter number used with plugin \"%1\". This may indicate a change "
"in the plugin design, and presets may be invalid"
msgstr ""
-#: ladspa_plugin.cc:376 ladspa_plugin.cc:426
+#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr ""
-#: ladspa_plugin.cc:391 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
msgid "LADSPA: no ladspa port number"
msgstr ""
-#: ladspa_plugin.cc:397 ladspa_plugin.cc:446
+#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
msgid "LADSPA: no ladspa port data"
msgstr ""
-#: ladspa_plugin.cc:717
-msgid "LADSPA: cannot load module from \"%1\""
-msgstr "LADPSA: impossibile caricare il modulo da \"%1\""
-
-#: ladspa_plugin.cc:827
+#: ladspa_plugin.cc:840
msgid "Could not locate HOME. Preset not removed."
msgstr ""
-#: ladspa_plugin.cc:864 ladspa_plugin.cc:870
+#: ladspa_plugin.cc:879 ladspa_plugin.cc:885
msgid "Could not create %1. Preset not saved. (%2)"
msgstr "Impossibile creare %1 . Preset non salvato. (%2)"
-#: ladspa_plugin.cc:877
+#: ladspa_plugin.cc:892
msgid "Error saving presets file %1."
msgstr "Errore nel salvare il file di preset %1."
-#: ladspa_plugin.cc:915
+#: ladspa_plugin.cc:934
msgid "Could not locate HOME. Preset not saved."
msgstr "impossibile localizzare HOME. Preset non salvato."
@@ -959,7 +974,7 @@ msgstr ""
msgid "incorrect XML mode passed to Locations::set_state"
msgstr ""
-#: location.cc:842 session.cc:4516 session_state.cc:1031
+#: location.cc:842 session.cc:4533 session_state.cc:1025
msgid "session"
msgstr ""
@@ -1014,40 +1029,39 @@ msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
msgstr ""
#: ltc_slave.cc:591
-#, c-format
msgid "flywheel"
msgstr ""
-#: midi_diskstream.cc:167
+#: midi_diskstream.cc:166
msgid ""
"%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
msgstr ""
-#: midi_diskstream.cc:219
+#: midi_diskstream.cc:218
msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
msgstr ""
-#: midi_diskstream.cc:270
+#: midi_diskstream.cc:269
msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
-#: midi_diskstream.cc:699
+#: midi_diskstream.cc:698
msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-#: midi_diskstream.cc:834
+#: midi_diskstream.cc:833
msgid "MidiDiskstream %1: cannot write to disk"
msgstr ""
-#: midi_diskstream.cc:868
+#: midi_diskstream.cc:867
msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: midi_diskstream.cc:955
+#: midi_diskstream.cc:954
msgid "%1: could not create region for complete midi file"
msgstr ""
-#: midi_diskstream.cc:992
+#: midi_diskstream.cc:991
msgid "MidiDiskstream: could not create region for captured midi!"
msgstr ""
@@ -1059,27 +1073,27 @@ msgstr ""
msgid "No SysExID found for sys-ex property change - ignored"
msgstr ""
-#: midi_model.cc:2010
+#: midi_model.cc:2012
msgid "transpose"
msgstr ""
-#: midi_patch_manager.cc:126
+#: midi_patch_manager.cc:127
msgid "Duplicate MIDI device `%1' in `%2' ignored"
msgstr ""
-#: midi_source.cc:125
+#: midi_source.cc:124
msgid "Missing parameter property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:132
+#: midi_source.cc:131
msgid "Missing style property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:144
+#: midi_source.cc:143
msgid "Missing parameter property on AutomationState"
msgstr ""
-#: midi_source.cc:151
+#: midi_source.cc:150
msgid "Missing state property on AutomationState"
msgstr ""
@@ -1123,21 +1137,21 @@ msgstr ""
msgid "solo control"
msgstr ""
-#: mtc_slave.cc:238
+#: mtc_slave.cc:240
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr ""
-#: mtc_slave.cc:361
+#: mtc_slave.cc:362
msgid ""
"Unknown rate/drop value %1 in incoming MTC stream, session values used "
"instead"
msgstr ""
-#: mtc_slave.cc:381
+#: mtc_slave.cc:382
msgid "Session framerate adjusted from %1 TO: MTC's %2."
msgstr ""
-#: mtc_slave.cc:395
+#: mtc_slave.cc:396
msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
msgstr ""
@@ -1197,31 +1211,35 @@ msgstr ""
msgid "Pannable given XML data for %1 - ignored"
msgstr ""
-#: panner_manager.cc:76
-msgid "looking for panners in %1"
+#: panner_manager.cc:80
+msgid "looking for panners in %1\n"
msgstr ""
-#: panner_manager.cc:100
-msgid "Panner discovered: \"%1\" in %2"
+#: panner_manager.cc:108
+msgid "Panner discovered: \"%1\" in %2\n"
msgstr ""
-#: panner_manager.cc:117
+#: panner_manager.cc:125
msgid "PannerManager: cannot load module \"%1\" (%2)"
msgstr ""
-#: panner_manager.cc:124
+#: panner_manager.cc:132
msgid "PannerManager: module \"%1\" has no descriptor function."
msgstr ""
-#: panner_manager.cc:187
+#: panner_manager.cc:219
msgid "no panner discovered for in/out = %1/%2"
msgstr ""
-#: panner_shell.cc:179
+#: panner_shell.cc:126
+msgid "select panner: %1\n"
+msgstr ""
+
+#: panner_shell.cc:245
msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
msgstr ""
-#: panner_shell.cc:185
+#: panner_shell.cc:251
msgid "panner plugin node has no type information!"
msgstr ""
@@ -1241,19 +1259,19 @@ msgstr ""
msgid "Could not construct playlist for PlaylistSource from session data!"
msgstr ""
-#: plugin.cc:324
+#: plugin.cc:328
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin.cc:398
+#: plugin.cc:402
msgid ""
"Saving plugin settings is not supported in this build of %1. Consider paying "
"for the full version"
msgstr ""
-#: plugin_insert.cc:598
+#: plugin_insert.cc:589
msgid "programming error: "
msgstr "errore di programmazione: "
@@ -1289,43 +1307,43 @@ msgstr ""
msgid "PluginInsert: automatable control %1 not found - ignored"
msgstr ""
-#: plugin_manager.cc:161
+#: plugin_manager.cc:165
msgid "Discovering Plugins"
msgstr ""
-#: plugin_manager.cc:335
+#: plugin_manager.cc:286
msgid "Could not parse rdf file: %1"
msgstr ""
-#: plugin_manager.cc:374
+#: plugin_manager.cc:330
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr "LADSPA: impossibile caricare il modulo \"%1\" (%2)"
-#: plugin_manager.cc:381
+#: plugin_manager.cc:337
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr "LADSPA: il modulo \"%1\" non ha alcuna funzione descriptor."
-#: plugin_manager.cc:602
+#: plugin_manager.cc:567
msgid ""
"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
"at this time"
msgstr ""
-#: plugin_manager.cc:709
+#: plugin_manager.cc:680
msgid ""
"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
"in %2 at this time"
msgstr ""
-#: plugin_manager.cc:870
+#: plugin_manager.cc:841
msgid "unknown plugin status type \"%1\" - all entries ignored"
msgstr ""
-#: plugin_manager.cc:887
+#: plugin_manager.cc:858
msgid "unknown plugin type \"%1\" - ignored"
msgstr ""
-#: port.cc:410
+#: port.cc:412
msgid "could not reregister %1"
msgstr ""
@@ -1333,11 +1351,11 @@ msgstr ""
msgid "insert %1"
msgstr ""
-#: port_insert.cc:198
+#: port_insert.cc:197
msgid "XML node describing port insert is missing the `type' field"
msgstr ""
-#: port_insert.cc:203
+#: port_insert.cc:202
msgid "non-port insert XML used for port plugin insert"
msgstr "insert non-port XML usato per insert di plugin di porta"
@@ -1369,11 +1387,11 @@ msgstr ""
msgid "Re-establising port %1 failed"
msgstr ""
-#: processor.cc:207
+#: processor.cc:208
msgid "No %1 property flag in element %2"
msgstr ""
-#: processor.cc:216
+#: processor.cc:217
msgid "No child node with active property"
msgstr ""
@@ -1437,11 +1455,11 @@ msgstr ""
msgid "cannot create new name for region \"%1\""
msgstr "impossibile creare un nuovo nome per la regione \"%1\""
-#: resampled_source.cc:98
+#: resampled_source.cc:102
msgid "Import: %1"
msgstr ""
-#: resampled_source.cc:128
+#: resampled_source.cc:132 srcfilesource.cc:76
msgid "Import: src_new() failed : %1"
msgstr ""
@@ -1449,27 +1467,27 @@ msgstr ""
msgid "return %1"
msgstr ""
-#: route.cc:1075 route.cc:2528
+#: route.cc:1081 route.cc:2541
msgid "unknown Processor type \"%1\"; ignored"
msgstr ""
-#: route.cc:1087
+#: route.cc:1093
msgid "processor could not be created. Ignored."
msgstr ""
-#: route.cc:1962 route.cc:2187
+#: route.cc:1975 route.cc:2200
msgid "Bad node sent to Route::set_state() [%1]"
msgstr ""
-#: route.cc:2022
+#: route.cc:2035
msgid "Pannable state found for route (%1) without a panner!"
msgstr ""
-#: route.cc:2096 route.cc:2100 route.cc:2301 route.cc:2305
+#: route.cc:2109 route.cc:2113 route.cc:2314 route.cc:2318
msgid "badly formed order key string in state file! [%1] ... ignored."
msgstr ""
-#: route.cc:2311
+#: route.cc:2324
msgid "Converting deprecated order key for %1 using Editor order %2"
msgstr ""
@@ -1485,15 +1503,15 @@ msgstr ""
msgid "error writing tempo-adjusted data to %1"
msgstr ""
-#: send.cc:59
+#: send.cc:60
msgid "aux %1"
msgstr ""
-#: send.cc:63
+#: send.cc:64
msgid "send %1"
msgstr ""
-#: send.cc:65
+#: send.cc:66
msgid "programming error: send created using role %1"
msgstr ""
@@ -1517,148 +1535,148 @@ msgstr ""
msgid "Set up standard connections"
msgstr ""
-#: session.cc:635
+#: session.cc:638
msgid "could not setup Click I/O"
msgstr "impossibile impostare entrata/uscita del click"
-#: session.cc:683
+#: session.cc:686
#, c-format
msgid "out %<PRIu32>"
msgstr ""
-#: session.cc:697
+#: session.cc:700
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr ""
-#: session.cc:712
+#: session.cc:715
#, c-format
msgid "in %<PRIu32>"
msgstr ""
-#: session.cc:726
+#: session.cc:729
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr ""
-#: session.cc:790
+#: session.cc:793
msgid "cannot connect master output %1 to %2"
msgstr ""
-#: session.cc:849
+#: session.cc:862
msgid "monitor"
msgstr ""
-#: session.cc:894
+#: session.cc:907
msgid "cannot connect control input %1 to %2"
msgstr ""
-#: session.cc:914
+#: session.cc:927
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr ""
-#: session.cc:945
+#: session.cc:958
msgid "cannot connect control output %1 to %2"
msgstr ""
-#: session.cc:1009
+#: session.cc:1026
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr "impossibile creare l'Auditioner"
-#: session.cc:1193
+#: session.cc:1210
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
"Sessione: non si può usare quella location per l'auto punch (inizio <= fine)"
-#: session.cc:1233
+#: session.cc:1250
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
msgstr ""
-#: session.cc:1547
+#: session.cc:1564
msgid "feedback loop setup between %1 and %2"
msgstr ""
-#: session.cc:1843
+#: session.cc:1860
msgid "Session: could not create new midi track."
msgstr ""
-#: session.cc:1849
+#: session.cc:1866
msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks."
msgstr ""
-#: session.cc:2026 session.cc:2029
+#: session.cc:2043 session.cc:2046
msgid "Audio"
msgstr ""
-#: session.cc:2053 session.cc:2061 session.cc:2138 session.cc:2146
+#: session.cc:2070 session.cc:2078 session.cc:2155 session.cc:2163
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr ""
-#: session.cc:2084
+#: session.cc:2101
msgid "Session: could not create new audio track."
msgstr "Sessione: impossibile creare una nuova traccia audio"
-#: session.cc:2116 session.cc:2119
+#: session.cc:2133 session.cc:2136
msgid "Bus"
msgstr ""
-#: session.cc:2169
+#: session.cc:2186
msgid "Session: could not create new audio route."
msgstr ""
-#: session.cc:2228 session.cc:2238
+#: session.cc:2245 session.cc:2255
msgid "Session: UINT_MAX routes? impossible!"
msgstr ""
-#: session.cc:2260
+#: session.cc:2277
msgid "Session: cannot create track/bus from template description"
msgstr ""
-#: session.cc:2286
+#: session.cc:2303
msgid "Session: could not create new route from template"
msgstr ""
-#: session.cc:2315
+#: session.cc:2332
msgid "Adding new tracks/busses failed"
msgstr ""
-#: session.cc:3419
+#: session.cc:3436
msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename"
msgstr ""
-#: session.cc:3539 session.cc:3597
+#: session.cc:3556 session.cc:3614
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr "Ci sono già %1 registrazioni per %2, che io considero troppe"
-#: session.cc:3987
+#: session.cc:4004
msgid "send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:3999
+#: session.cc:4016
msgid "aux send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4011
+#: session.cc:4028
msgid "return ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4023
+#: session.cc:4040
msgid "insert ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4150
+#: session.cc:4167
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr ""
-#: session.cc:4179
+#: session.cc:4196
msgid "too many bounced versions of playlist \"%1\""
msgstr ""
-#: session.cc:4189
+#: session.cc:4206
msgid "cannot create new audio file \"%1\" for %2"
msgstr "impossibile creare un nuovo file audio \"%1\" per %2"
@@ -1693,7 +1711,7 @@ msgstr ""
msgid "Session subdirectory does not exist at path %1"
msgstr ""
-#: session_events.cc:184
+#: session_events.cc:185
msgid "Session: cannot have two events of type %1 at the same frame (%2)."
msgstr ""
@@ -1705,13 +1723,13 @@ msgstr ""
msgid "Export ended unexpectedly: %1"
msgstr ""
-#: session_ltc.cc:222
+#: session_ltc.cc:221
msgid ""
"LTC encoder: invalid framerate - LTC encoding is disabled for the remainder "
"of this session."
msgstr ""
-#: session_midi.cc:520
+#: session_midi.cc:519
msgid "Session: cannot send quarter-frame MTC message (%1)"
msgstr ""
@@ -1723,351 +1741,343 @@ msgstr "Sessione: impossibile creare Playlist dalla descrizione XML"
msgid "Session: error in no roll for %1"
msgstr ""
-#: session_process.cc:1157
+#: session_process.cc:1159
msgid "Programming error: illegal event type in process_event (%1)"
msgstr ""
-#: session_state.cc:140
-msgid "Could not use path %1 (%2)"
-msgstr ""
-
-#: session_state.cc:184
+#: session_state.cc:178
msgid "solo cut control (dB)"
msgstr ""
-#: session_state.cc:208
+#: session_state.cc:202
msgid "Set block size and sample rate"
msgstr ""
-#: session_state.cc:213
+#: session_state.cc:207
msgid "Using configuration"
msgstr ""
-#: session_state.cc:325
+#: session_state.cc:319
msgid "Reset Remote Controls"
msgstr ""
-#: session_state.cc:417
+#: session_state.cc:411
msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:424
+#: session_state.cc:418
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr ""
"Sessione: impossibile creare la cartella sounds per la sessione \"%1\" (%2)"
-#: session_state.cc:431
+#: session_state.cc:425
msgid "Session: cannot create session midi dir \"%1\" (%2)"
msgstr ""
-#: session_state.cc:438
+#: session_state.cc:432
msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:445
+#: session_state.cc:439
msgid "Session: cannot create session export folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:452
+#: session_state.cc:446
msgid "Session: cannot create session analysis folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:459
+#: session_state.cc:453
msgid "Session: cannot create session plugins folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:466
+#: session_state.cc:460
msgid "Session: cannot create session externals folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:480
+#: session_state.cc:474
msgid "Session: cannot create session folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:514
+#: session_state.cc:508
msgid "Could not open %1 for writing session template"
msgstr ""
-#: session_state.cc:520
+#: session_state.cc:514
msgid "Could not open session template %1 for reading"
msgstr ""
-#: session_state.cc:539
+#: session_state.cc:533
msgid "master"
msgstr ""
-#: session_state.cc:600
+#: session_state.cc:594
msgid "Could not remove pending capture state at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:624
+#: session_state.cc:618
msgid "could not rename snapshot %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:652
+#: session_state.cc:646
msgid "Could not remove session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:669
+#: session_state.cc:663
msgid ""
"the %1 audio engine is not connected and state saving would lose all I/O "
"connections. Session not saved"
msgstr ""
-#: session_state.cc:720
+#: session_state.cc:714
msgid "state could not be saved to %1"
msgstr ""
-#: session_state.cc:722 session_state.cc:733
+#: session_state.cc:716 session_state.cc:727
msgid "Could not remove temporary session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:730
-msgid "could not rename temporary session file %1 to %2"
+#: session_state.cc:724
+msgid "could not rename temporary session file %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:798
+#: session_state.cc:792
msgid "%1: session file \"%2\" doesn't exist!"
msgstr ""
-#: session_state.cc:810
+#: session_state.cc:804
msgid "Could not understand session file %1"
msgstr ""
-#: session_state.cc:819
+#: session_state.cc:813
msgid "Session file %1 is not a session"
msgstr ""
-#: session_state.cc:1125
+#: session_state.cc:1119
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
-#: session_state.cc:1179
+#: session_state.cc:1173
msgid "Session: XML state has no options section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione option"
-#: session_state.cc:1184
+#: session_state.cc:1178
msgid "Session: XML state has no metadata section"
msgstr ""
-#: session_state.cc:1195
+#: session_state.cc:1189
msgid "Session: XML state has no sources section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione sources"
-#: session_state.cc:1202
+#: session_state.cc:1196
msgid "Session: XML state has no Tempo Map section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione Tempo Map"
-#: session_state.cc:1209
+#: session_state.cc:1203
msgid "Session: XML state has no locations section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione locations"
-#: session_state.cc:1235
+#: session_state.cc:1229
msgid "Session: XML state has no Regions section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione Regions"
-#: session_state.cc:1242
+#: session_state.cc:1236
msgid "Session: XML state has no playlists section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione playlist"
-#: session_state.cc:1262
+#: session_state.cc:1256
msgid "Session: XML state has no bundles section"
msgstr ""
-#: session_state.cc:1274
+#: session_state.cc:1268
msgid "Session: XML state has no diskstreams section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione diskstream"
-#: session_state.cc:1282
+#: session_state.cc:1276
msgid "Session: XML state has no routes section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione routes"
-#: session_state.cc:1294
+#: session_state.cc:1288
msgid "Session: XML state has no route groups section"
msgstr ""
-#: session_state.cc:1303
+#: session_state.cc:1297
msgid "Session: XML state has no edit groups section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione edit groups"
-#: session_state.cc:1310
+#: session_state.cc:1304
msgid "Session: XML state has no mix groups section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione mix groups"
-#: session_state.cc:1318
+#: session_state.cc:1312
msgid "Session: XML state has no click section"
msgstr ""
-#: session_state.cc:1360
+#: session_state.cc:1354
msgid "Session: cannot create Route from XML description."
msgstr "Sessione: impossibile creare Route dalla descrizione XML"
-#: session_state.cc:1364
+#: session_state.cc:1358
msgid "Loaded track/bus %1"
msgstr ""
-#: session_state.cc:1462
+#: session_state.cc:1456
msgid "Could not find diskstream for route"
msgstr ""
-#: session_state.cc:1516
+#: session_state.cc:1510
msgid "Session: cannot create Region from XML description."
msgstr "Sessione: impossibile creare regione dalla descrizione XML"
-#: session_state.cc:1520
+#: session_state.cc:1514
msgid "Can not load state for region '%1'"
msgstr ""
-#: session_state.cc:1556
+#: session_state.cc:1550
msgid "Regions in compound description not found (ID's %1 and %2): ignored"
msgstr ""
-#: session_state.cc:1584
+#: session_state.cc:1578
msgid "Nested source has no ID info in session file! (ignored)"
msgstr ""
-#: session_state.cc:1596
+#: session_state.cc:1590
msgid "Cannot reconstruct nested source for region %1"
msgstr ""
-#: session_state.cc:1658
+#: session_state.cc:1652
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707
+#: session_state.cc:1660 session_state.cc:1681 session_state.cc:1701
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713
+#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
msgstr ""
-#: session_state.cc:1736
+#: session_state.cc:1730
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
msgstr ""
-#: session_state.cc:1770
+#: session_state.cc:1764
msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1778
+#: session_state.cc:1772
msgid ""
"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1784
+#: session_state.cc:1778
msgid ""
"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
msgstr ""
-#: session_state.cc:1852
+#: session_state.cc:1846
msgid ""
"cannot create new file from region name \"%1\" with ident = \"%2\": too many "
"existing files with similar names"
msgstr ""
-#: session_state.cc:1875
+#: session_state.cc:1869
msgid "Session: cannot create Source from XML description."
msgstr "Sessione: impossibile creare Source dalla descrizione XML"
-#: session_state.cc:1909
+#: session_state.cc:1903
msgid "A sound file is missing. It will be replaced by silence."
msgstr ""
-#: session_state.cc:1932
+#: session_state.cc:1926
msgid "Found a sound file that cannot be used by %1. Talk to the progammers."
msgstr ""
-#: session_state.cc:1949
+#: session_state.cc:1943
msgid "Could not create templates directory \"%1\" (%2)"
msgstr ""
-#: session_state.cc:1962
+#: session_state.cc:1956
msgid "Template \"%1\" already exists - new version not created"
msgstr "Il modello \"%1\" esiste già - non è stata creata una nuova versione"
-#: session_state.cc:1968
+#: session_state.cc:1962
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr ""
-#: session_state.cc:1978
+#: session_state.cc:1972
msgid "template not saved"
msgstr ""
-#: session_state.cc:1988
+#: session_state.cc:1982
msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
msgstr ""
-#: session_state.cc:2183
+#: session_state.cc:2225
msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr ""
-#: session_state.cc:2725 session_state.cc:2731
-msgid "Cannot expand path %1 (%2)"
-msgstr ""
-
-#: session_state.cc:2784
+#: session_state.cc:2820
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:2823
+#: session_state.cc:2859
msgid "cannot rename unused file source from %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:2841
+#: session_state.cc:2877
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr "impossibile eliminare il peakfile %1 per %2 (%3)"
-#: session_state.cc:3143
+#: session_state.cc:3179
msgid "could not backup old history file, current history not saved"
msgstr ""
-#: session_state.cc:3156
+#: session_state.cc:3192
msgid "history could not be saved to %1"
msgstr ""
-#: session_state.cc:3159
+#: session_state.cc:3195
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:3163
+#: session_state.cc:3199
msgid "could not restore history file from backup %1 (%2)"
msgstr ""
-#: session_state.cc:3188
+#: session_state.cc:3224
msgid "%1: no history file \"%2\" for this session."
msgstr ""
-#: session_state.cc:3194
+#: session_state.cc:3230
msgid "Could not understand session history file \"%1\""
msgstr ""
-#: session_state.cc:3236
+#: session_state.cc:3272
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr ""
-#: session_state.cc:3247
+#: session_state.cc:3283
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr ""
-#: session_state.cc:3258
+#: session_state.cc:3294
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr ""
-#: session_state.cc:3266
+#: session_state.cc:3302
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr ""
-#: session_state.cc:3502
+#: session_state.cc:3538
msgid "Session: unknown diskstream type in XML"
msgstr ""
-#: session_state.cc:3507
+#: session_state.cc:3543
msgid "Session: could not load diskstream via XML state"
msgstr ""
@@ -2091,115 +2101,115 @@ msgid ""
"control"
msgstr ""
-#: smf_source.cc:252
+#: smf_source.cc:262
msgid "Unable to read event prefix, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:265
+#: smf_source.cc:275
msgid "Event has time and size but no body, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:271
+#: smf_source.cc:281
msgid "Event time is before MIDI source position"
msgstr ""
-#: smf_source.cc:306 smf_source.cc:345
+#: smf_source.cc:316 smf_source.cc:355
msgid "Skipping event with unordered time %1"
msgstr ""
-#: smf_source.cc:410
+#: smf_source.cc:420
msgid "cannot open MIDI file %1 for write"
msgstr ""
-#: sndfile_helpers.cc:32
+#: sndfile_helpers.cc:34
msgid "WAV"
msgstr ""
-#: sndfile_helpers.cc:33
+#: sndfile_helpers.cc:35
msgid "AIFF"
msgstr ""
-#: sndfile_helpers.cc:34
+#: sndfile_helpers.cc:36
msgid "CAF"
msgstr ""
-#: sndfile_helpers.cc:35
+#: sndfile_helpers.cc:37
msgid "W64 (64 bit WAV)"
msgstr ""
-#: sndfile_helpers.cc:36
+#: sndfile_helpers.cc:38
msgid "FLAC"
msgstr ""
-#: sndfile_helpers.cc:37
+#: sndfile_helpers.cc:39
msgid "Ogg/Vorbis"
msgstr ""
-#: sndfile_helpers.cc:38
+#: sndfile_helpers.cc:40
msgid "raw (no header)"
msgstr ""
-#: sndfile_helpers.cc:43
+#: sndfile_helpers.cc:45
msgid ".wav"
msgstr ""
-#: sndfile_helpers.cc:44
+#: sndfile_helpers.cc:46
msgid ".aiff"
msgstr ""
-#: sndfile_helpers.cc:45
+#: sndfile_helpers.cc:47
msgid ".caf"
msgstr ""
-#: sndfile_helpers.cc:46
+#: sndfile_helpers.cc:48
msgid ".w64"
msgstr ""
-#: sndfile_helpers.cc:47
+#: sndfile_helpers.cc:49
msgid ".flac"
msgstr ""
-#: sndfile_helpers.cc:48
+#: sndfile_helpers.cc:50
msgid ".ogg"
msgstr ""
-#: sndfile_helpers.cc:49
+#: sndfile_helpers.cc:51
msgid ".raw"
msgstr ""
-#: sndfile_helpers.cc:64
+#: sndfile_helpers.cc:66
msgid "Signed 16 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:65
+#: sndfile_helpers.cc:67
msgid "Signed 24 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:66
+#: sndfile_helpers.cc:68
msgid "Signed 32 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:67
+#: sndfile_helpers.cc:69
msgid "Signed 8 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:68
+#: sndfile_helpers.cc:70
msgid "32 bit float"
msgstr ""
-#: sndfile_helpers.cc:81
+#: sndfile_helpers.cc:83
msgid "Little-endian (Intel)"
msgstr ""
-#: sndfile_helpers.cc:82
+#: sndfile_helpers.cc:84
msgid "Big-endian (PowerPC)"
msgstr ""
-#: sndfilesource.cc:201
+#: sndfilesource.cc:210
msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
msgstr ""
-#: sndfilesource.cc:209
+#: sndfilesource.cc:218
msgid ""
"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
"number"
@@ -2207,84 +2217,92 @@ msgstr ""
"SndFileSource: il file contiene solo %1 canali; %2 non è valido come numero "
"di canale"
-#: sndfilesource.cc:255 sndfilesource.cc:571 sndfilesource.cc:595
+#: sndfilesource.cc:264 sndfilesource.cc:604 sndfilesource.cc:628
msgid ""
"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
"for this file"
msgstr ""
-#: sndfilesource.cc:302
+#: sndfilesource.cc:311
msgid "could not allocate file %1 for reading."
msgstr ""
-#: sndfilesource.cc:337
+#: sndfilesource.cc:346
msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
msgstr ""
-#: sndfilesource.cc:347
+#: sndfilesource.cc:356
msgid ""
"SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
msgstr ""
-#: sndfilesource.cc:391 sndfilesource.cc:420
+#: sndfilesource.cc:400 sndfilesource.cc:429
msgid "attempt to write a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:396 utils.cc:510 utils.cc:534 utils.cc:548 utils.cc:567
+#: sndfilesource.cc:405 utils.cc:547 utils.cc:571 utils.cc:585 utils.cc:604
msgid "programming error: %1 %2"
msgstr ""
-#: sndfilesource.cc:523
+#: sndfilesource.cc:532 sndfilesource.cc:562
msgid "attempt to flush a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:528
+#: sndfilesource.cc:537 sndfilesource.cc:557
msgid "attempt to flush an un-opened audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:534
+#: sndfilesource.cc:543
msgid "could not allocate file %1 to write header"
msgstr ""
-#: sndfilesource.cc:548
+#: sndfilesource.cc:568
+msgid "could not allocate file %1 to flush contents"
+msgstr ""
+
+#: sndfilesource.cc:581
msgid ""
"attempt to store broadcast info in a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:553
+#: sndfilesource.cc:586
msgid "attempt to set BWF info for an un-opened audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:614
+#: sndfilesource.cc:647
msgid "%1: cannot seek to %2 (libsndfile error: %3)"
msgstr ""
-#: sndfilesource.cc:727
+#: sndfilesource.cc:760
msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
msgstr ""
-#: sndfilesource.cc:740 sndfilesource.cc:790 sndfilesource.cc:797
+#: sndfilesource.cc:773 sndfilesource.cc:823 sndfilesource.cc:830
msgid "SndFileSource: \"%1\" bad write (%2)"
msgstr ""
-#: sndfilesource.cc:820
+#: sndfilesource.cc:853
msgid ""
"Filesource: start time is already set for existing file (%1): Cannot change "
"start time."
msgstr ""
-#: speakers.cc:239
+#: speakers.cc:280
msgid "Speaker information is missing azimuth - speaker ignored"
msgstr ""
-#: speakers.cc:245
+#: speakers.cc:286
msgid "Speaker information is missing elevation - speaker ignored"
msgstr ""
-#: speakers.cc:251
+#: speakers.cc:292
msgid "Speaker information is missing distance - speaker ignored"
msgstr ""
+#: srcfilesource.cc:135
+msgid "SrcFileSource: %1"
+msgstr ""
+
#: tape_file_matcher.cc:46
msgid "Cannot compile tape track regexp for use (%1)"
msgstr ""
@@ -2432,54 +2450,64 @@ msgstr ""
msgid "Node for Port has no \"name\" property"
msgstr ""
-#: utils.cc:358 utils.cc:382
+#: utils.cc:395 utils.cc:419
msgid "Splice"
msgstr ""
-#: utils.cc:360 utils.cc:375
+#: utils.cc:397 utils.cc:412
msgid "Slide"
msgstr ""
-#: utils.cc:362 utils.cc:378
+#: utils.cc:399 utils.cc:415
msgid "Lock"
msgstr ""
-#: utils.cc:365
+#: utils.cc:402
msgid "programming error: unknown edit mode string \"%1\""
msgstr ""
-#: utils.cc:389 utils.cc:421
+#: utils.cc:426 utils.cc:458
msgid "MIDI Timecode"
msgstr ""
-#: utils.cc:389 utils.cc:419
+#: utils.cc:426 utils.cc:456
msgid "MTC"
msgstr ""
-#: utils.cc:393 utils.cc:428
+#: utils.cc:430 utils.cc:465
msgid "MIDI Clock"
msgstr ""
-#: utils.cc:397 utils.cc:415 utils.cc:435
+#: utils.cc:434 utils.cc:452 utils.cc:472
msgid "JACK"
msgstr ""
-#: utils.cc:401
+#: utils.cc:438
msgid "programming error: unknown sync source string \"%1\""
msgstr ""
-#: utils.cc:426
+#: utils.cc:463
msgid "M-Clock"
msgstr ""
-#: utils.cc:432
+#: utils.cc:469
msgid "LTC"
msgstr ""
-#: utils.cc:602
+#: utils.cc:639
msgid "programming error: unknown native header format: %1"
msgstr ""
-#: utils.cc:617
+#: utils.cc:654
msgid "cannot open directory %1 (%2)"
msgstr ""
+
+#~ msgid ""
+#~ "FileSource: \"%1\" is ambigous when searching %2\n"
+#~ "\t"
+#~ msgstr ""
+#~ "FileSource: \"%1\" è risultato ambiguo nel cercare %2\n"
+#~ "\t"
+
+#~ msgid "LADSPA: cannot load module from \"%1\""
+#~ msgstr "LADPSA: impossibile caricare il modulo da \"%1\""
diff --git a/libs/ardour/po/nn.po b/libs/ardour/po/nn.po
index 2356a737f4..53e9c9d5c7 100644
--- a/libs/ardour/po/nn.po
+++ b/libs/ardour/po/nn.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: libardour\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-11-05 11:11-0500\n"
+"POT-Creation-Date: 2014-02-10 17:53+0100\n"
"PO-Revision-Date: 2011-09-13 22:43+0100\n"
"Last-Translator: Eivind Ødegård <meinmycell-lists@yahoo.no>\n"
"Language-Team: Nynorsk <i18n-nn@lister.ping.uio.no>\n"
@@ -24,66 +24,66 @@ msgstr ""
msgid "Fader"
msgstr "Dempar"
-#: audio_diskstream.cc:244
+#: audio_diskstream.cc:242
msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
msgstr "Lyd-diskstraum: Spelelista \"%1\" er ikkje ei lydspeleliste"
-#: audio_diskstream.cc:296
+#: audio_diskstream.cc:294
msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
msgstr "Lyd-diskstraum %1: det finst inga speleliste å kopiera!"
-#: audio_diskstream.cc:848 audio_diskstream.cc:858
+#: audio_diskstream.cc:846 audio_diskstream.cc:856
msgid ""
"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
msgstr ""
"Lyd-diskstraum %1: greidde ikkje lesa %2 frå spelelista, ramme %3, ved "
"attfylling"
-#: audio_diskstream.cc:1014
+#: audio_diskstream.cc:1012
msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr "Lyd-diskstraum %1: greidde ikkje lesa %2 frå spelelista, ramme %3"
-#: audio_diskstream.cc:1383 audio_diskstream.cc:1400
+#: audio_diskstream.cc:1381 audio_diskstream.cc:1398
msgid "AudioDiskstream %1: cannot write to disk"
msgstr "Lyd-diskstraum %1: greidde ikkje skriva til disk"
-#: audio_diskstream.cc:1443
+#: audio_diskstream.cc:1441
msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
msgstr "Lyd-diskstraum \"%1\": greier ikkje skriva opptaket til disken!"
-#: audio_diskstream.cc:1537
+#: audio_diskstream.cc:1535
msgid "%1: could not create region for complete audio file"
msgstr "%1: greidde ikkje laga bolk for heil lydfil"
-#: audio_diskstream.cc:1571
+#: audio_diskstream.cc:1569
msgid "AudioDiskstream: could not create region for captured audio!"
msgstr "Lyd-diskstraum: greidde ikkje laga bolk frå opptaket!"
-#: audio_diskstream.cc:1679
+#: audio_diskstream.cc:1677
msgid "programmer error: %1"
msgstr "Programmerarfeil: %1"
-#: audio_diskstream.cc:1905
+#: audio_diskstream.cc:1903
msgid "AudioDiskstream: channel %1 out of range"
msgstr "Lyd-diskstraum: kanal %1 utanfor rekkjevidd"
-#: audio_diskstream.cc:1919 midi_diskstream.cc:1210
+#: audio_diskstream.cc:1917 midi_diskstream.cc:1209
msgid "%1:%2 new capture file not initialized correctly"
msgstr "%1: ny opptaksfil %2 vart ikkje påbyrja rett"
-#: audio_diskstream.cc:2200
+#: audio_diskstream.cc:2198
msgid "%1: cannot restore pending capture source file %2"
msgstr "%1: greidde ikkje henta fram att den ventande opptakskjeldefila %2"
-#: audio_diskstream.cc:2222
+#: audio_diskstream.cc:2220
msgid "%1: incorrect number of pending sources listed - ignoring them all"
msgstr "%1: feil tal på ventande kjelder på lista - ser bort frå alle"
-#: audio_diskstream.cc:2246
+#: audio_diskstream.cc:2244
msgid "%1: cannot create whole-file region from pending capture sources"
msgstr "%1: greidde ikkje laga heilfilbolk frå ventande opptakskjelder"
-#: audio_library.cc:71
+#: audio_library.cc:81
msgid "Could not open %1. Audio Library not saved"
msgstr "Greidde ikkje opna %1. Lydbiblioteket er ikkje lagra"
@@ -123,11 +123,11 @@ msgstr ""
msgid "Audio Playlists (unused)"
msgstr "Lydspelelister (ubrukte)"
-#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529
+#: audio_playlist_source.cc:171 audiosource.cc:891 file_source.cc:520
#: midi_playlist_source.cc:144 midi_playlist_source.cc:152
-#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643
-#: rb_effect.cc:333 session.cc:2619 session.cc:2652 session.cc:3797
-#: session_handle.cc:87 sndfilesource.cc:121
+#: midi_playlist_source.cc:159 midi_source.cc:370 plugin_insert.cc:634
+#: rb_effect.cc:333 session.cc:2636 session.cc:2669 session.cc:3814
+#: session_handle.cc:87 sndfilesource.cc:122
msgid "programming error: %1"
msgstr "Programmeringsfeil: %1"
@@ -155,23 +155,23 @@ msgstr ""
"\n"
"Kanalar:"
-#: audio_track.cc:167
+#: audio_track.cc:161
msgid "Unknown bundle \"%1\" listed for input of %2"
msgstr "Ukjend bundel \"%1\" lista opp for inngangen på %2"
-#: audio_track.cc:169
+#: audio_track.cc:163
msgid "in 1"
msgstr "inn 1"
-#: audio_track.cc:170
+#: audio_track.cc:164
msgid "No input bundles available as a replacement"
msgstr "Ingen inngangsbundlar klare som erstatting"
-#: audio_track.cc:174
+#: audio_track.cc:168
msgid "Bundle %1 was not available - \"in 1\" used instead"
msgstr "Bundelen %1 var ikkje tilgjengeleg - brukar \"inn 1\" i staden for"
-#: audio_track.cc:183
+#: audio_track.cc:177
msgid "improper input channel list in XML node (%1)"
msgstr "Feil inngangskanalliste i XML-node (%1)"
@@ -195,23 +195,23 @@ msgstr "greier ikkje lasta VAMP-innstikket \"%1\""
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr "VAMP-innstikket \"%1\" vart ikkje lasta"
-#: audioengine.cc:488
+#: audioengine.cc:495
msgid "looking for backends in %1\n"
msgstr ""
-#: audioengine.cc:511
+#: audioengine.cc:518
msgid "AudioEngine: cannot load module \"%1\" (%2)"
msgstr ""
-#: audioengine.cc:517
+#: audioengine.cc:524
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr ""
-#: audioengine.cc:589
+#: audioengine.cc:596
msgid "Could not create backend for %1: %2"
msgstr ""
-#: audioregion.cc:1643
+#: audioregion.cc:1651
msgid ""
"You have requested an operation that requires audio analysis.\n"
"\n"
@@ -236,11 +236,11 @@ msgstr ""
"Denne ruta blir ikkje synt på nytt, men du vil kanskje merka små "
"forseinkingar i denne og framtidige lydtoppdata-søk.\n"
-#: audiosource.cc:199
+#: audiosource.cc:210
msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
msgstr "kan ikkje døypa om toppfil for %1 frå %2 til %3 (%4)"
-#: audiosource.cc:226
+#: audiosource.cc:239
msgid "AudioSource: cannot stat peakfile \"%1\""
msgstr "Lydkjelde: kan ikkje bruka toppfil \"%1\""
@@ -248,49 +248,70 @@ msgstr "Lydkjelde: kan ikkje bruka toppfil \"%1\""
msgid "cannot read sample data for unscaled peak computation"
msgstr "kan ikkje lesa lyddata for uskalert topputrekning"
-#: audiosource.cc:387
+#: audiosource.cc:386
msgid "AudioSource: cannot open peakpath (a) \"%1\" (%2)"
msgstr "Lydkjelde: kan ikkje opna toppstig (a) \"%1\" (%2)"
-#: audiosource.cc:463
+#: audiosource.cc:395 audiosource.cc:473
+msgid ""
+"AudioSource: could not seek to correct location in peak file \"%1\" (%2)"
+msgstr ""
+
+#: audiosource.cc:453
msgid "AudioSource: cannot open peakpath (b) \"%1\" (%2)"
msgstr "Lydkjelde: kan ikkje opna toppstig (b) \"%1\" (%2)"
-#: audiosource.cc:587
+#: audiosource.cc:567
msgid ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
msgstr ""
"AudioSource [%1]: topplesing - kan ikkje lesa %2 punkt ved forskuvinga %3 av "
"%4 (%5)"
-#: audiosource.cc:667
+#: audiosource.cc:634
msgid "%1: could not write read raw data for peak computation (%2)"
msgstr "%1 greidde ikkje skriva/lesa rådata for topputrekninga (%2)"
-#: audiosource.cc:706
+#: audiosource.cc:672
msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
msgstr "Lydkjelde: kan ikkje opna toppstig (c) \"%1\" (%2)"
-#: audiosource.cc:773 audiosource.cc:886
+#: audiosource.cc:739 audiosource.cc:861
+msgid "%1: could not seek in peak file data (%2)"
+msgstr ""
+
+#: audiosource.cc:744 audiosource.cc:870
msgid "%1: could not write peak file data (%2)"
msgstr "%1: greidde ikkje skriva toppfildata (%2)"
-#: audiosource.cc:924
+#: audiosource.cc:903
msgid "could not truncate peakfile %1 to %2 (error: %3)"
msgstr ""
-#: auditioner.cc:87
+#: auditioner.cc:95
+msgid "Falling back to Reasonable Synth for Midi Audition"
+msgstr ""
+
+#: auditioner.cc:97
+msgid "No synth for midi-audition found."
+msgstr ""
+
+#: auditioner.cc:152
msgid "no outputs available for auditioner - manual connection required"
msgstr "ingen utgangar for lyttinga - du må kopla til manuelt"
-#: auditioner.cc:135
-msgid "Auditioning of non-audio regions not yet supported"
-msgstr "Me har ikkje laga lytting for bolkar som ikkje er lyd enno"
-
-#: auditioner.cc:160
+#: auditioner.cc:392 auditioner.cc:438
msgid "Cannot setup auditioner processing flow for %1 channels"
msgstr "Greier ikkje setja opp lyttehandteringsflyt for %1 kanalar"
+#: auditioner.cc:426
+msgid "Failed to load synth for MIDI-Audition."
+msgstr ""
+
+#: auditioner.cc:445
+msgid "Auditioning of regions other than Audio or Midi is not supported."
+msgstr ""
+
#: automatable.cc:81
msgid "Automation node has no path property"
msgstr "Automasjonspunktet har ingen stigeigenskapar"
@@ -330,24 +351,24 @@ msgstr ""
"AutomationList: gav XML-node med namet %1, ikkje \"AutomationList\" - såg "
"bort frå."
-#: butler.cc:91
+#: butler.cc:80
msgid "Cannot create transport request signal pipe (%1)"
msgstr "Kan ikkje laga transportspørjingssignalrøyr (%1)"
-#: butler.cc:97 butler.cc:103
+#: butler.cc:86 butler.cc:92
msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)"
msgstr ""
"Grensesnitt: greier ikkje setja opp O_NONBLOCK på butler-spørjingsrøyret (%1)"
-#: butler.cc:109
+#: butler.cc:124
msgid "Session: could not create butler thread"
msgstr "Økt: greier ikkje laga butler-tråd"
-#: butler.cc:156
+#: butler.cc:165
msgid "poll on butler request pipe failed (%1)"
msgstr "undersøkjing på butler-spørjingsrøyret mislukka (%1)"
-#: butler.cc:163
+#: butler.cc:172
msgid "Error on butler thread request pipe: fd=%1 err=%2"
msgstr "Feil på butler-spørsjingsrøyret: fd=%1 feil=%2"
@@ -355,56 +376,56 @@ msgstr "Feil på butler-spørsjingsrøyret: fd=%1 feil=%2"
msgid "Error reading from butler request pipe"
msgstr "Feil: greidde ikkje lesa frå butlerspørjingsrøyr"
-#: butler.cc:248
+#: butler.cc:301
msgid "Butler read ahead failure on dstream %1"
msgstr "Butler-førlesingsfeil på dstream %1"
-#: butler.cc:285
+#: butler.cc:338
msgid "Butler write-behind failure on dstream %1"
msgstr "Butler-etterskrivingsfeil på dstream %1"
-#: control_protocol_manager.cc:134
+#: control_protocol_manager.cc:164
msgid "control protocol name \"%1\" has no descriptor"
msgstr "kontrollprotokollnamnet \"%1\" har inga skildring"
-#: control_protocol_manager.cc:141
+#: control_protocol_manager.cc:171
msgid "control protocol name \"%1\" could not be initialized"
msgstr "kontrollprotokollnamnet \"%1\" greidde ikkje starta opp"
-#: control_protocol_manager.cc:201
+#: control_protocol_manager.cc:237
msgid "Instantiating mandatory control protocol %1"
msgstr "Lagar obligatorisk kontrollprotokolløkt %1"
-#: control_protocol_manager.cc:222
+#: control_protocol_manager.cc:258
msgid "looking for control protocols in %1\n"
msgstr ""
-#: control_protocol_manager.cc:247
+#: control_protocol_manager.cc:283
msgid "Control protocol %1 not usable"
msgstr "Kontrollprotokollen %1 er ikkje brukande"
-#: control_protocol_manager.cc:264
+#: control_protocol_manager.cc:300
msgid "Control surface protocol discovered: \"%1\"\n"
msgstr ""
-#: control_protocol_manager.cc:282
+#: control_protocol_manager.cc:318
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
msgstr "Kontrollprotokollstyring: kan ikkje lasta modulen \"%1\" (%2)"
-#: control_protocol_manager.cc:290
+#: control_protocol_manager.cc:324
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr "Kontrollprotokollstyring: modulen \"%1\" har ingen skildringsfunksjon."
-#: cycle_timer.cc:38
+#: cycle_timer.cc:40
msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
msgstr "CycleTimer::get:mhz()-funksjonen: kan ikkje opna /proc/cpuinfo"
-#: cycle_timer.cc:50
+#: cycle_timer.cc:52
msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo"
msgstr ""
"CycleTimer::get:mhz()-funksjonen: finn ikkje prosessor-MHz i /proc/cpuinfo"
-#: cycle_timer.cc:73
+#: cycle_timer.cc:75
msgid "cannot locate cpu MHz in /proc/cpuinfo"
msgstr "finn ikkje prosessor-MHz i /proc/cpuinfo"
@@ -412,7 +433,7 @@ msgstr "finn ikkje prosessor-MHz i /proc/cpuinfo"
msgid "audio"
msgstr "lyd"
-#: data_type.cc:28 session.cc:1791 session.cc:1794
+#: data_type.cc:28 session.cc:1808 session.cc:1811
msgid "MIDI"
msgstr "MIDI"
@@ -420,15 +441,15 @@ msgstr "MIDI"
msgid "unknown"
msgstr "ukjend"
-#: delivery.cc:114
+#: delivery.cc:118
msgid "main outs"
msgstr "hovudutgangar"
-#: delivery.cc:117 send.cc:61
+#: delivery.cc:121 send.cc:62
msgid "listen"
msgstr "høyr på"
-#: diskstream.cc:303
+#: diskstream.cc:302
msgid "Location \"%1\" not valid for track loop (start >= end)"
msgstr ""
"Staden \"%1\" er ikkje gyldig for å spela spor i lykkje (start >= slutt)"
@@ -441,23 +462,23 @@ msgstr "Greidde ikkje få port for eksportkanalen \"%1\", hoppar over kanalen"
msgid "Export failed: %1"
msgstr "Eksportfeil: %1"
-#: export_filename.cc:118
+#: export_filename.cc:119
msgid "Existing export folder for this session (%1) does not exist - ignored"
msgstr ""
-#: export_filename.cc:229
+#: export_filename.cc:230
msgid "No Time"
msgstr "Inga tid"
-#: export_filename.cc:238
+#: export_filename.cc:239
msgid "Invalid time format"
msgstr "Ugyldig tidsformat"
-#: export_filename.cc:247
+#: export_filename.cc:248
msgid "No Date"
msgstr "Ingen dato"
-#: export_filename.cc:262
+#: export_filename.cc:263
msgid "Invalid date format"
msgstr "Ugyldig datoformat"
@@ -525,7 +546,7 @@ msgstr "Trekant"
msgid "Rectangular"
msgstr "Firkant"
-#: export_formats.cc:52 session.cc:5014 session.cc:5030
+#: export_formats.cc:52 session.cc:5006 session.cc:5022
msgid "None"
msgstr "Ingen"
@@ -565,15 +586,15 @@ msgstr "Vorbis-punktformat"
msgid "No sample format"
msgstr "Ikkje noko punktformat"
-#: export_handler.cc:335
+#: export_handler.cc:343
msgid "Editor: cannot open \"%1\" as export file for CD marker file"
msgstr "Redigering: greier ikkje opna \"%1\" som eksportfil for CD-markørfil"
-#: export_handler.cc:417 export_handler.cc:420
+#: export_handler.cc:425 export_handler.cc:428
msgid "an error occured while writing a TOC/CUE file: %1"
msgstr ""
-#: export_handler.cc:642 export_handler.cc:700
+#: export_handler.cc:650 export_handler.cc:708
msgid "Cannot convert %1 to Latin-1 text"
msgstr ""
@@ -636,7 +657,7 @@ msgid ""
msgstr ""
"%1 støttar berre %2 kanalar, men du har %3 kanalar i kanaloppsettet ditt"
-#: file_source.cc:198 session_state.cc:2807
+#: file_source.cc:198 session_state.cc:2843
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr "Det er alt 1000 filer med namn som %1, kuttar ut versjonsnamn"
@@ -645,31 +666,29 @@ msgstr "Det er alt 1000 filer med namn som %1, kuttar ut versjonsnamn"
msgid "cannot rename file source from %1 to %2 (%3)"
msgstr "kan ikkje døypa om filkjelda frå %1 til %2 (%3)"
-#: file_source.cc:250 file_source.cc:378
+#: file_source.cc:248 file_source.cc:372
msgid "FileSource: search path not set"
msgstr "Filkjelde: søkjestigen er ikkje sett opp"
-#: file_source.cc:313 file_source.cc:448
-msgid "Filesource: cannot find required file (%1): while searching %2"
-msgstr "Filkjelde: Kan ikkje finna fila (%1) under søking i %2"
+#: file_source.cc:309 file_source.cc:439
+msgid "Filesource: cannot find required file (%1)"
+msgstr ""
-#: file_source.cc:440
+#: file_source.cc:432
msgid ""
-"FileSource: \"%1\" is ambigous when searching %2\n"
+"FileSource: \"%1\" is ambigous when searching\n"
"\t"
msgstr ""
-"Filkjelde: \"%1\" er tvetydig når du søkjer %2\n"
-"\t"
-#: file_source.cc:494
+#: file_source.cc:484
msgid "Filesource: cannot find required file (%1): %2"
msgstr "Filkjelde: Kan ikkje finna den naudsynte fila %1: %2"
-#: file_source.cc:501
+#: file_source.cc:492
msgid "Filesource: cannot check for existing file (%1): %2"
msgstr "Filkjelde:Kan ikkje sjå etter eksisterande fil %1: %2"
-#: file_source.cc:535
+#: file_source.cc:526
msgid ""
"Programming error! %1 tried to rename a file over another file! It's safe to "
"continue working, but please report this to the developers."
@@ -678,7 +697,7 @@ msgstr ""
"eksisterer. Det er trygt å halda fram å arbeida, men ver god å seia frå til "
"utviklarane."
-#: file_source.cc:540
+#: file_source.cc:531
msgid "cannot rename file %1 to %2 (%3)"
msgstr "kan ikkje døypa om %1 til %2 (%3)"
@@ -692,15 +711,15 @@ msgid ""
"cannot run"
msgstr ""
-#: filesystem_paths.cc:91
+#: filesystem_paths.cc:96
msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
msgstr ""
-#: filesystem_paths.cc:107
+#: filesystem_paths.cc:125
msgid "ARDOUR_CONFIG_PATH not set in environment - exiting\n"
msgstr ""
-#: filesystem_paths.cc:127
+#: filesystem_paths.cc:148
msgid "ARDOUR_DATA_PATH not set in environment - exiting\n"
msgstr ""
@@ -712,88 +731,84 @@ msgstr "lydfilter: feil med å laga namn for ny fil bygd på %1"
msgid "filter: error creating new file %1 (%2)"
msgstr "lydfilter: feil med å laga den nye fila %1 (%2)"
-#: find_session.cc:51
-msgid "Could not resolve path: %1 (%2)"
-msgstr "Greidde ikkje finna stigen: %1: (%2)"
-
-#: find_session.cc:63
+#: find_session.cc:59
msgid "cannot check session path %1 (%2)"
msgstr "greier ikkje sjekka øktstigen %1 (%2)"
-#: find_session.cc:89
+#: find_session.cc:85
msgid "cannot check statefile %1 (%2)"
msgstr "greier ikkje sjekka tilstandsfila %1 (%2)"
-#: find_session.cc:125
+#: find_session.cc:121
msgid "%1 is not a snapshot file"
msgstr "%1 er ikkje ei snøggbiletefil"
-#: find_session.cc:142
+#: find_session.cc:138
msgid "cannot determine current working directory (%1)"
msgstr "greier ikkje avgjera kva som er arbeidsmappa no (%1)"
-#: find_session.cc:159
+#: find_session.cc:155
msgid "unknown file type for session %1"
msgstr "ukjend filtype for økta %1"
-#: globals.cc:207
+#: globals.cc:216
msgid "Could not set system open files limit to \"unlimited\""
msgstr "Greidde ikkje setja systemgrensa for opne filer til \"uavgrensa\""
-#: globals.cc:209
+#: globals.cc:218
msgid "Could not set system open files limit to %1"
msgstr "Greidde ikkje setja grensa for opne systemfiler til %1"
-#: globals.cc:213
+#: globals.cc:222
msgid "Your system is configured to limit %1 to only %2 open files"
msgstr ""
-#: globals.cc:217
+#: globals.cc:226
msgid "Could not get system open files limit (%1)"
msgstr "Greidde ikkje få tak i grensa for opne systemfiler (%1)"
-#: globals.cc:268
+#: globals.cc:280
msgid "Loading configuration"
msgstr "Lastar oppsettet"
-#: import.cc:207
+#: import.cc:208
msgid "Could not find a source for %1 even though we are updating this file!"
msgstr ""
"Greier ikkje finna kjelda for %1, sjølv om det er denne fila me oppdaterer!"
-#: import.cc:236
+#: import.cc:237
msgid "Unable to create file %1 during import"
msgstr "Greier ikkje laga fila %1 under import!"
-#: import.cc:262
+#: import.cc:263
msgid "Resampling %1 from %2kHz to %3kHz"
msgstr "Kodar om %1 frå %2kHz til %3kHz"
-#: import.cc:268
+#: import.cc:269
msgid "Copying %1"
msgstr "Kopierer%1"
-#: import.cc:446
+#: import.cc:455
msgid "Track %1 of %2 contained no usable MIDI data"
msgstr "Spor %1 av %2 inneheld ingen brukbare MIDI-data"
-#: import.cc:453
+#: import.cc:462
msgid "MIDI file %1 was not readable (no reason available)"
msgstr ""
-#: import.cc:499
+#: import.cc:508
msgid "Import: cannot open input sound file \"%1\""
msgstr "Import: greier ikkje opna inn-lydfila \"%1\""
-#: import.cc:510
+#: import.cc:519
msgid "Import: error opening MIDI file"
msgstr "Import: greidde ikkje opna MIDI-fil"
-#: import.cc:549
+#: import.cc:558
msgid "Loading MIDI file %1"
msgstr "Lastar MIDI-fila %1"
-#: import.cc:614
+#: import.cc:623
msgid "Failed to remove some files after failed/cancelled import operation"
msgstr ""
@@ -805,154 +820,154 @@ msgstr ""
msgid "preset %1 (bank %2)"
msgstr ""
-#: internal_send.cc:278 internal_send.cc:279
+#: internal_send.cc:300 internal_send.cc:301
msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
msgstr ""
-#: io.cc:208
+#: io.cc:209
msgid "IO: cannot disconnect port %1 from %2"
msgstr "IU: kan ikkje kopla porten %1 frå %2"
-#: io.cc:343 io.cc:428
+#: io.cc:344 io.cc:431
msgid "IO: cannot register input port %1"
msgstr "IU: greier ikkje registrera inngangsporten %1"
-#: io.cc:348 io.cc:433
+#: io.cc:349 io.cc:436
msgid "IO: cannot register output port %1"
msgstr "IU: greier ikkje registrera utgangsporten %1"
-#: io.cc:591 io.cc:647
+#: io.cc:598 io.cc:654
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr "feil XML-punkt, \"%1\", sendt til IU-objektet"
-#: io.cc:706
+#: io.cc:713
msgid "in"
msgstr "inn"
-#: io.cc:706
+#: io.cc:713
msgid "out"
msgstr "ut"
-#: io.cc:707
+#: io.cc:714
msgid "input"
msgstr "inngang"
-#: io.cc:707
+#: io.cc:714
msgid "output"
msgstr "utgang"
-#: io.cc:717
+#: io.cc:724
msgid "Unknown bundle \"%1\" listed for %2 of %3"
msgstr "Ukjend bundel \"%1\" lista for %2 av %3"
-#: io.cc:783
+#: io.cc:790
msgid "Bundle %1 was not available - \"%2\" used instead"
msgstr "Bundelen %1 var ikkje tilgjengeleg - brukte \"%2\" i staden"
-#: io.cc:786
+#: io.cc:793
msgid "No %1 bundles available as a replacement"
msgstr "Ingen %1-bundlar klare som erstatting"
-#: io.cc:889
+#: io.cc:896
msgid "%1: cannot create I/O ports"
msgstr "%1: greier ikkje laga I/U-portar"
-#: io.cc:1017 io.cc:1121
+#: io.cc:1024 io.cc:1128
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr "IU: feilforma streng i XML-opunkt for inngangane \"%1\""
-#: io.cc:1022 io.cc:1126
+#: io.cc:1029 io.cc:1133
msgid "bad input string in XML node \"%1\""
msgstr "feil inngangsstreng i XML-punktet \"%1\""
-#: io.cc:1060
+#: io.cc:1067
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr "IU: feilforma streng i XML-punktet for utgangane \"%1\""
-#: io.cc:1065
+#: io.cc:1072
msgid "IO: bad output string in XML node \"%1\""
msgstr "IU: feil utgangsstreng i XML-punktet \"%1\""
-#: io.cc:1411
+#: io.cc:1417
#, c-format
msgid "%s %u"
msgstr "%s %u"
-#: io.cc:1458
+#: io.cc:1464
#, c-format
msgid "%s in"
msgstr " %s inn"
-#: io.cc:1460
+#: io.cc:1466
#, c-format
msgid "%s out"
msgstr "%s ut"
-#: io.cc:1535 session.cc:686 session.cc:715
+#: io.cc:1541 session.cc:689 session.cc:718
msgid "mono"
msgstr "mono"
-#: io.cc:1537 session.cc:699 session.cc:729
+#: io.cc:1543 session.cc:702 session.cc:732
msgid "L"
msgstr "V"
-#: io.cc:1537 session.cc:701 session.cc:731
+#: io.cc:1543 session.cc:704 session.cc:734
msgid "R"
msgstr "H"
-#: io.cc:1539 io.cc:1545
+#: io.cc:1545 io.cc:1551
#, c-format
msgid "%d"
msgstr "%d"
-#: ladspa_plugin.cc:86
+#: ladspa_plugin.cc:93
+msgid "LADSPA: Unable to open module: "
+msgstr ""
+
+#: ladspa_plugin.cc:99
msgid "LADSPA: module has no descriptor function."
msgstr "LADSPA: modulen har ingen skildringsfunksjon"
-#: ladspa_plugin.cc:91
+#: ladspa_plugin.cc:106
msgid "LADSPA: plugin has gone away since discovery!"
msgstr "LADSPA: tilleggsprogrammet har vorte borte sidan det vart oppdaga!"
-#: ladspa_plugin.cc:98
+#: ladspa_plugin.cc:113
msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
msgstr ""
"LADSPA: kan ikkje bruka \"%1\", sidan han ikkje kan prosessera på staden"
-#: ladspa_plugin.cc:297
+#: ladspa_plugin.cc:311
msgid ""
"illegal parameter number used with plugin \"%1\". This may indicate a change "
"in the plugin design, and presets may be invalid"
msgstr ""
-#: ladspa_plugin.cc:376 ladspa_plugin.cc:426
+#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr "Feil punkt sendt til LadspaPlugin::set_state"
-#: ladspa_plugin.cc:391 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
msgid "LADSPA: no ladspa port number"
msgstr "LADSPA: ikkje noko Ladspa-portnummer"
-#: ladspa_plugin.cc:397 ladspa_plugin.cc:446
+#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
msgid "LADSPA: no ladspa port data"
msgstr "LADSPA: ingen portdata"
-#: ladspa_plugin.cc:717
-msgid "LADSPA: cannot load module from \"%1\""
-msgstr "LADSPA: greier ikkje lasta modul frå \"%1\""
-
-#: ladspa_plugin.cc:827
+#: ladspa_plugin.cc:840
msgid "Could not locate HOME. Preset not removed."
msgstr "Greidde ikkje finna heimemappa. Har ikkje fjera ferdigoppsett."
-#: ladspa_plugin.cc:864 ladspa_plugin.cc:870
+#: ladspa_plugin.cc:879 ladspa_plugin.cc:885
msgid "Could not create %1. Preset not saved. (%2)"
msgstr "Greidde ikkje laga %1. Har ikkje lagra ferdigoppsett. (%2)"
-#: ladspa_plugin.cc:877
+#: ladspa_plugin.cc:892
msgid "Error saving presets file %1."
msgstr "Feil med å lagra ferdigoppsettfila %1."
-#: ladspa_plugin.cc:915
+#: ladspa_plugin.cc:934
msgid "Could not locate HOME. Preset not saved."
msgstr "Greidde ikkje finna heimemappa. Har ikkje lagra ferdigoppsett."
@@ -992,7 +1007,7 @@ msgstr "Stader: forsøk på å bruka ukjend stad som vald stad"
msgid "incorrect XML mode passed to Locations::set_state"
msgstr "feil XML-modus send til Locations::set_state"
-#: location.cc:842 session.cc:4516 session_state.cc:1031
+#: location.cc:842 session.cc:4533 session_state.cc:1025
msgid "session"
msgstr "økt"
@@ -1057,40 +1072,39 @@ msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
msgstr ""
#: ltc_slave.cc:591
-#, c-format
msgid "flywheel"
msgstr ""
-#: midi_diskstream.cc:167
+#: midi_diskstream.cc:166
msgid ""
"%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
msgstr "%1: I/U-oppsettsendringa %4 ba om å bruka %2, men kanaloppsettet er %3"
-#: midi_diskstream.cc:219
+#: midi_diskstream.cc:218
msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
msgstr ""
-#: midi_diskstream.cc:270
+#: midi_diskstream.cc:269
msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
msgstr "MIDI-diskstraum %1: det finst inga speleliste å kopiera!"
-#: midi_diskstream.cc:699
+#: midi_diskstream.cc:698
msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr "MIDI-diskstraum %1: greidde ikkje lesa %2 frå spelelista, ramme %3"
-#: midi_diskstream.cc:834
+#: midi_diskstream.cc:833
msgid "MidiDiskstream %1: cannot write to disk"
msgstr "MIDI-diskstraum %1: greidde ikkje skriva til disk"
-#: midi_diskstream.cc:868
+#: midi_diskstream.cc:867
msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
msgstr "MIDI-diskstraum \"%1\": greier ikkje skriva opptaket til disken!"
-#: midi_diskstream.cc:955
+#: midi_diskstream.cc:954
msgid "%1: could not create region for complete midi file"
msgstr "%1: greidde ikkje laga bolk for heil midifil"
-#: midi_diskstream.cc:992
+#: midi_diskstream.cc:991
msgid "MidiDiskstream: could not create region for captured midi!"
msgstr "MIDI-diskstraum: greidde ikkje laga bolk frå midi-opptaket!"
@@ -1102,27 +1116,27 @@ msgstr "Fann ingen NoteID for noteeigenskapsendringa - såg bort frå"
msgid "No SysExID found for sys-ex property change - ignored"
msgstr "Fann ingen SysExID for sys-ex-eigenskapsendring - såg bort frå"
-#: midi_model.cc:2010
+#: midi_model.cc:2012
msgid "transpose"
msgstr "transponer"
-#: midi_patch_manager.cc:126
+#: midi_patch_manager.cc:127
msgid "Duplicate MIDI device `%1' in `%2' ignored"
msgstr ""
-#: midi_source.cc:125
+#: midi_source.cc:124
msgid "Missing parameter property on InterpolationStyle"
msgstr "Manglar parametereigenskap på InterpolationStyle"
-#: midi_source.cc:132
+#: midi_source.cc:131
msgid "Missing style property on InterpolationStyle"
msgstr "Manglar stileigenskap på InterpolationStyle"
-#: midi_source.cc:144
+#: midi_source.cc:143
msgid "Missing parameter property on AutomationState"
msgstr "Manglar parameterigenskap på AutomationStyle"
-#: midi_source.cc:151
+#: midi_source.cc:150
msgid "Missing state property on AutomationState"
msgstr "Manglar statuseigenskap på AutomationState"
@@ -1166,22 +1180,22 @@ msgstr "polaritetskontroll"
msgid "solo control"
msgstr "solo kontroll"
-#: mtc_slave.cc:238
+#: mtc_slave.cc:240
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr "MTC-slave: greidde ikkje lesa gyldig tid. Søv."
-#: mtc_slave.cc:361
+#: mtc_slave.cc:362
msgid ""
"Unknown rate/drop value %1 in incoming MTC stream, session values used "
"instead"
msgstr ""
"Ukjent rate/sleppverdi %1 i innkomande MTC-straum, bruker øktverdiar i staden"
-#: mtc_slave.cc:381
+#: mtc_slave.cc:382
msgid "Session framerate adjusted from %1 TO: MTC's %2."
msgstr ""
-#: mtc_slave.cc:395
+#: mtc_slave.cc:396
msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
msgstr ""
@@ -1241,33 +1255,37 @@ msgstr "fast tid-bolkkopi"
msgid "Pannable given XML data for %1 - ignored"
msgstr "Panoreringa fekk XML-data for %1 - ignorert"
-#: panner_manager.cc:76
-msgid "looking for panners in %1"
-msgstr "ser etter panoreringar i %1"
+#: panner_manager.cc:80
+msgid "looking for panners in %1\n"
+msgstr ""
-#: panner_manager.cc:100
-msgid "Panner discovered: \"%1\" in %2"
+#: panner_manager.cc:108
+msgid "Panner discovered: \"%1\" in %2\n"
msgstr ""
-#: panner_manager.cc:117
+#: panner_manager.cc:125
msgid "PannerManager: cannot load module \"%1\" (%2)"
msgstr "Panoreringsstyring: kan ikkje lasta modulen \"%1\" (%2)"
-#: panner_manager.cc:124
+#: panner_manager.cc:132
msgid "PannerManager: module \"%1\" has no descriptor function."
msgstr "Panoreringsstyring: modulen \"%1\" har ingen skildringsfunksjon."
-#: panner_manager.cc:187
+#: panner_manager.cc:219
msgid "no panner discovered for in/out = %1/%2"
msgstr "fann inga panorering for inn/ut = %1/%2"
-#: panner_shell.cc:179
+#: panner_shell.cc:126
+msgid "select panner: %1\n"
+msgstr ""
+
+#: panner_shell.cc:245
msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
msgstr ""
"Ukjent panoreringstilleggsprogram, \"%1\", funne i panoreringstilstand. "
"Hoppa over."
-#: panner_shell.cc:185
+#: panner_shell.cc:251
msgid "panner plugin node has no type information!"
msgstr "tilleggsprogrampunktet for panoreringa har ingen typeinformasjon!"
@@ -1287,19 +1305,19 @@ msgstr "Fann ingen speleliste-ID i PlaylistSource-XML!"
msgid "Could not construct playlist for PlaylistSource from session data!"
msgstr "Greidde ikkje byggja speleliste for PlaylistSource frå øktdata!"
-#: plugin.cc:324
+#: plugin.cc:328
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin.cc:398
+#: plugin.cc:402
msgid ""
"Saving plugin settings is not supported in this build of %1. Consider paying "
"for the full version"
msgstr ""
-#: plugin_insert.cc:598
+#: plugin_insert.cc:589
msgid "programming error: "
msgstr "programmeringsfeil: "
@@ -1337,43 +1355,43 @@ msgstr ""
"PluginInsert: fann ikkje den automasjonsferdige kontrollen %1, såg bort frå "
"han."
-#: plugin_manager.cc:161
+#: plugin_manager.cc:165
msgid "Discovering Plugins"
msgstr "Finn innstikk"
-#: plugin_manager.cc:335
+#: plugin_manager.cc:286
msgid "Could not parse rdf file: %1"
msgstr "Greidde ikkje tolka rdf-fila: %1"
-#: plugin_manager.cc:374
+#: plugin_manager.cc:330
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr "LADSPA: greier ikkje lasta modulen \"%1\" (%2)"
-#: plugin_manager.cc:381
+#: plugin_manager.cc:337
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr "LADSPA: modulen \"%1\" har ingen skildringsfunksjon."
-#: plugin_manager.cc:602
+#: plugin_manager.cc:567
msgid ""
"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
"at this time"
msgstr ""
-#: plugin_manager.cc:709
+#: plugin_manager.cc:680
msgid ""
"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
"in %2 at this time"
msgstr ""
-#: plugin_manager.cc:870
+#: plugin_manager.cc:841
msgid "unknown plugin status type \"%1\" - all entries ignored"
msgstr "\"%1\" er ein ukjend utvidingsstatustype, såg bort frå alt"
-#: plugin_manager.cc:887
+#: plugin_manager.cc:858
msgid "unknown plugin type \"%1\" - ignored"
msgstr "\"%1\" er ein ukjend innstikktype - hoppa over"
-#: port.cc:410
+#: port.cc:412
msgid "could not reregister %1"
msgstr "greidde ikkje registrera %1."
@@ -1381,11 +1399,11 @@ msgstr "greidde ikkje registrera %1."
msgid "insert %1"
msgstr "set inn %1"
-#: port_insert.cc:198
+#: port_insert.cc:197
msgid "XML node describing port insert is missing the `type' field"
msgstr "XML-punktet som skildrar portinnstikket manglar 'type'-feltet"
-#: port_insert.cc:203
+#: port_insert.cc:202
msgid "non-port insert XML used for port plugin insert"
msgstr ""
"tappingspunkt-XML som ikkje er ein port er brukt for porttilleggstapping"
@@ -1420,11 +1438,11 @@ msgstr "Lydmaskineri: Klarte ikkje kopla %1 (%2) til %3 (%4)."
msgid "Re-establising port %1 failed"
msgstr ""
-#: processor.cc:207
+#: processor.cc:208
msgid "No %1 property flag in element %2"
msgstr "Ikkje noko %1-eigenskapsflagg i elementet %2"
-#: processor.cc:216
+#: processor.cc:217
msgid "No child node with active property"
msgstr "Ingen undernode med aktiv eigenskap"
@@ -1490,11 +1508,11 @@ msgstr "%1 samansett-%2.1 (%3)"
msgid "cannot create new name for region \"%1\""
msgstr "greier ikkje laga nytt namn for bolken \"%1\""
-#: resampled_source.cc:98
+#: resampled_source.cc:102
msgid "Import: %1"
msgstr "Import: %1"
-#: resampled_source.cc:128
+#: resampled_source.cc:132 srcfilesource.cc:76
msgid "Import: src_new() failed : %1"
msgstr "Import: src_new()-funkjsonen lukkast ikkje: %1"
@@ -1502,27 +1520,27 @@ msgstr "Import: src_new()-funkjsonen lukkast ikkje: %1"
msgid "return %1"
msgstr "retur %1"
-#: route.cc:1075 route.cc:2528
+#: route.cc:1081 route.cc:2541
msgid "unknown Processor type \"%1\"; ignored"
msgstr "\"%1\" er ein ukjend prosesseringstype, hoppa over"
-#: route.cc:1087
+#: route.cc:1093
msgid "processor could not be created. Ignored."
msgstr "greidde ikkje laga prosessering. Hoppa over."
-#: route.cc:1962 route.cc:2187
+#: route.cc:1975 route.cc:2200
msgid "Bad node sent to Route::set_state() [%1]"
msgstr "Feil punkt sendt til Route::set_state()-funksjonen [%1]"
-#: route.cc:2022
+#: route.cc:2035
msgid "Pannable state found for route (%1) without a panner!"
msgstr "Fann panoreringsstatus for ruta (%1) utan panorering!"
-#: route.cc:2096 route.cc:2100 route.cc:2301 route.cc:2305
+#: route.cc:2109 route.cc:2113 route.cc:2314 route.cc:2318
msgid "badly formed order key string in state file! [%1] ... ignored."
msgstr "feilforma tingingsnykjelstreng i tilstandsfil! [%1] ... hoppa over."
-#: route.cc:2311
+#: route.cc:2324
msgid "Converting deprecated order key for %1 using Editor order %2"
msgstr ""
@@ -1539,15 +1557,15 @@ msgstr ""
msgid "error writing tempo-adjusted data to %1"
msgstr "greidde ikkje skriva tempo-justert fil til %1"
-#: send.cc:59
+#: send.cc:60
msgid "aux %1"
msgstr ""
-#: send.cc:63
+#: send.cc:64
msgid "send %1"
msgstr "send %1"
-#: send.cc:65
+#: send.cc:66
msgid "programming error: send created using role %1"
msgstr ""
@@ -1571,149 +1589,149 @@ msgstr ""
msgid "Set up standard connections"
msgstr "Set opp standartilkoplingar"
-#: session.cc:635
+#: session.cc:638
msgid "could not setup Click I/O"
msgstr "greidde ikkje setja opp klikk-I/U"
-#: session.cc:683
+#: session.cc:686
#, c-format
msgid "out %<PRIu32>"
msgstr "ut %<PRIu32>"
-#: session.cc:697
+#: session.cc:700
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr "ut %<PRIu32>+%<PRIu32>"
-#: session.cc:712
+#: session.cc:715
#, c-format
msgid "in %<PRIu32>"
msgstr "inn %<PRIu32>"
-#: session.cc:726
+#: session.cc:729
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr "inn %<PRIu32>+%<PRIu32>"
-#: session.cc:790
+#: session.cc:793
msgid "cannot connect master output %1 to %2"
msgstr "greier ikkje kopla til hovudutgangane %1 til %2"
-#: session.cc:849
+#: session.cc:862
msgid "monitor"
msgstr "lytting"
-#: session.cc:894
+#: session.cc:907
msgid "cannot connect control input %1 to %2"
msgstr "greier ikkje kopla til kontrollinngangane %1 til %2"
-#: session.cc:914
+#: session.cc:927
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr "Greidde ikkje finna føretrekt I/U for lyttebussen (%1)"
-#: session.cc:945
+#: session.cc:958
msgid "cannot connect control output %1 to %2"
msgstr "greier ikkje kopla til kontrollutgangane %1 til %2"
-#: session.cc:1009
+#: session.cc:1026
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr "greier ikkje laga Lytting: det er ikkje råd å lytta på nokon bolkar."
-#: session.cc:1193
+#: session.cc:1210
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr "Økt: du kan ikkje bruka denne staden for autoinnslag (start<=slutt)"
-#: session.cc:1233
+#: session.cc:1250
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
msgstr ""
-#: session.cc:1547
+#: session.cc:1564
msgid "feedback loop setup between %1 and %2"
msgstr "rundgang-lykkjeoppsett mellom %1 og %2"
-#: session.cc:1843
+#: session.cc:1860
msgid "Session: could not create new midi track."
msgstr "Økt: greidde ikkje laga nytt midispor."
-#: session.cc:1849
+#: session.cc:1866
msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks."
msgstr ""
-#: session.cc:2026 session.cc:2029
+#: session.cc:2043 session.cc:2046
msgid "Audio"
msgstr "Lyd"
-#: session.cc:2053 session.cc:2061 session.cc:2138 session.cc:2146
+#: session.cc:2070 session.cc:2078 session.cc:2155 session.cc:2163
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr ""
"greier ikkje stilla inn %1 inn/%2 ut-innstillingane for det nye lydsporet"
-#: session.cc:2084
+#: session.cc:2101
msgid "Session: could not create new audio track."
msgstr "Økt: greidde ikkje laga nytt lydspor."
-#: session.cc:2116 session.cc:2119
+#: session.cc:2133 session.cc:2136
msgid "Bus"
msgstr "Buss"
-#: session.cc:2169
+#: session.cc:2186
msgid "Session: could not create new audio route."
msgstr "Økt: greidde ikkje laga ny lydrute."
-#: session.cc:2228 session.cc:2238
+#: session.cc:2245 session.cc:2255
msgid "Session: UINT_MAX routes? impossible!"
msgstr "Økt: UINT_MAX-ruter? Går ikkje an!"
-#: session.cc:2260
+#: session.cc:2277
msgid "Session: cannot create track/bus from template description"
msgstr "Økt: greier ikkje laga spor/buss frå malskildringa"
-#: session.cc:2286
+#: session.cc:2303
msgid "Session: could not create new route from template"
msgstr "Økt: greidde ikkje laga ny lydrute frå malen"
-#: session.cc:2315
+#: session.cc:2332
msgid "Adding new tracks/busses failed"
msgstr ""
-#: session.cc:3419
+#: session.cc:3436
msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename"
msgstr ""
"ALVORLEG FEIL! Greidde ikkje finna ei høveleg utgåve av %1 for å døypa om"
-#: session.cc:3539 session.cc:3597
+#: session.cc:3556 session.cc:3614
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr "Det er alt %1 opptak for %2, og eg synest det er for mange."
-#: session.cc:3987
+#: session.cc:4004
msgid "send ID %1 appears to be in use already"
msgstr "send-IDen %1 ser ut til å vera i bruk frå før"
-#: session.cc:3999
+#: session.cc:4016
msgid "aux send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4011
+#: session.cc:4028
msgid "return ID %1 appears to be in use already"
msgstr "retur-IDen %1 ser ut til å vera i bruk frå før"
-#: session.cc:4023
+#: session.cc:4040
msgid "insert ID %1 appears to be in use already"
msgstr "send-IDen %2 ser ut til å vera i bruk frå før"
-#: session.cc:4150
+#: session.cc:4167
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr "Kan ikkje skriva eit område der slutten <= starten (td. %1 <= %2)"
-#: session.cc:4179
+#: session.cc:4196
msgid "too many bounced versions of playlist \"%1\""
msgstr "for mange samanmiksa versjonar av spelelista \"%1\""
-#: session.cc:4189
+#: session.cc:4206
msgid "cannot create new audio file \"%1\" for %2"
msgstr "greier ikkje laga ny lydfil \"%1\" for %2"
@@ -1752,7 +1770,7 @@ msgstr "greier ikkje laga øktmappa i stigen \"%1\", feil: %2"
msgid "Session subdirectory does not exist at path %1"
msgstr "Undermappa for økta finst ikkje i stigen %1"
-#: session_events.cc:184
+#: session_events.cc:185
msgid "Session: cannot have two events of type %1 at the same frame (%2)."
msgstr "Økt: du kan ikkje ha to handlingar av typen %1 på same ramma (%2)."
@@ -1764,13 +1782,13 @@ msgstr "%1: greier ikkje finna %2 for eksportering"
msgid "Export ended unexpectedly: %1"
msgstr ""
-#: session_ltc.cc:222
+#: session_ltc.cc:221
msgid ""
"LTC encoder: invalid framerate - LTC encoding is disabled for the remainder "
"of this session."
msgstr ""
-#: session_midi.cc:520
+#: session_midi.cc:519
msgid "Session: cannot send quarter-frame MTC message (%1)"
msgstr "Økt: greidde ikkje senda kvartramme-MTC-melding (%1)"
@@ -1782,91 +1800,87 @@ msgstr "Økt: greier ikkje laga speleliste ut frå XML-skildringa."
msgid "Session: error in no roll for %1"
msgstr "Økt: feil på ingen rull for %1"
-#: session_process.cc:1157
+#: session_process.cc:1159
msgid "Programming error: illegal event type in process_event (%1)"
msgstr "Programmeringsfeil: ulovleg handlingstype i process-event (%1)"
-#: session_state.cc:140
-msgid "Could not use path %1 (%2)"
-msgstr ""
-
-#: session_state.cc:184
+#: session_state.cc:178
msgid "solo cut control (dB)"
msgstr "solokutt-kontroll (dB)"
-#: session_state.cc:208
+#: session_state.cc:202
msgid "Set block size and sample rate"
msgstr "Set blokkstorleik og punktrate"
-#: session_state.cc:213
+#: session_state.cc:207
msgid "Using configuration"
msgstr "Bruker oppsett"
-#: session_state.cc:325
+#: session_state.cc:319
msgid "Reset Remote Controls"
msgstr "Still tilbake fjernkontrollar"
-#: session_state.cc:417
+#: session_state.cc:411
msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
msgstr "Økt: greier ikkje laga mappa \"%1\" for økttoppfiler (%2)"
-#: session_state.cc:424
+#: session_state.cc:418
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr "Økt: greier ikkje laga øktmappa \"%1\" for lydfiler (%2)"
-#: session_state.cc:431
+#: session_state.cc:425
msgid "Session: cannot create session midi dir \"%1\" (%2)"
msgstr "Økt: greier ikkje laga midimappa \"%1\" for økta (%2)"
-#: session_state.cc:438
+#: session_state.cc:432
msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
msgstr "Økt: greier ikkje laga mappa \"%1\" for daudlyd (%2)"
-#: session_state.cc:445
+#: session_state.cc:439
msgid "Session: cannot create session export folder \"%1\" (%2)"
msgstr "Økt: greidde ikkje laga mappa \"%1\" for eksportlyd (%2)"
-#: session_state.cc:452
+#: session_state.cc:446
msgid "Session: cannot create session analysis folder \"%1\" (%2)"
msgstr "Økt: greidde ikkje laga mappa \"%1\" for øktanalyse (%2)"
-#: session_state.cc:459
+#: session_state.cc:453
msgid "Session: cannot create session plugins folder \"%1\" (%2)"
msgstr "Økt: greier ikkje laga utvidingmappa \"%1\" for økta (%2)"
-#: session_state.cc:466
+#: session_state.cc:460
msgid "Session: cannot create session externals folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:480
+#: session_state.cc:474
msgid "Session: cannot create session folder \"%1\" (%2)"
msgstr "Økt: greidde ikkje laga øktmappa \"%1\" (%2)"
-#: session_state.cc:514
+#: session_state.cc:508
msgid "Could not open %1 for writing session template"
msgstr ""
-#: session_state.cc:520
+#: session_state.cc:514
msgid "Could not open session template %1 for reading"
msgstr ""
-#: session_state.cc:539
+#: session_state.cc:533
msgid "master"
msgstr "master"
-#: session_state.cc:600
+#: session_state.cc:594
msgid "Could not remove pending capture state at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:624
+#: session_state.cc:618
msgid "could not rename snapshot %1 to %2 (%3)"
msgstr "greidde ikkje døypa om snøggbiletet %1 til %2 (%3)"
-#: session_state.cc:652
+#: session_state.cc:646
msgid "Could not remove session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:669
+#: session_state.cc:663
msgid ""
"the %1 audio engine is not connected and state saving would lose all I/O "
"connections. Session not saved"
@@ -1874,134 +1888,134 @@ msgstr ""
"lydmotoren i %1 er ikkje kopla til, og å lagra statusen ville kasta bort "
"alle I/U-tilkoplingar. Økta er ikkje lagra"
-#: session_state.cc:720
+#: session_state.cc:714
msgid "state could not be saved to %1"
msgstr "greidde ikkje lagra tilstanden til %1"
-#: session_state.cc:722 session_state.cc:733
+#: session_state.cc:716 session_state.cc:727
msgid "Could not remove temporary session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:730
-msgid "could not rename temporary session file %1 to %2"
-msgstr "greidde ikkje døypa om mellombels øktfil %1 til %2"
+#: session_state.cc:724
+msgid "could not rename temporary session file %1 to %2 (%3)"
+msgstr ""
-#: session_state.cc:798
+#: session_state.cc:792
msgid "%1: session file \"%2\" doesn't exist!"
msgstr ""
-#: session_state.cc:810
+#: session_state.cc:804
msgid "Could not understand session file %1"
msgstr ""
-#: session_state.cc:819
+#: session_state.cc:813
msgid "Session file %1 is not a session"
msgstr "Øktfila %1 er ikkje ei økt"
-#: session_state.cc:1125
+#: session_state.cc:1119
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
"programmeringsfeil: Økt: feil XML-punkt sendt til set_state()-funksjonen"
-#: session_state.cc:1179
+#: session_state.cc:1173
msgid "Session: XML state has no options section"
msgstr "Økt: XML-tilstandsfila har ikkje noko avsnitt om instillingar"
-#: session_state.cc:1184
+#: session_state.cc:1178
msgid "Session: XML state has no metadata section"
msgstr "Økt: XML-fila har inga avdeling for metadata"
-#: session_state.cc:1195
+#: session_state.cc:1189
msgid "Session: XML state has no sources section"
msgstr "Økt: XML-tilstandsfila har ikkje noko avsnitt om kjelder"
-#: session_state.cc:1202
+#: session_state.cc:1196
msgid "Session: XML state has no Tempo Map section"
msgstr "Økt: XML-fila har ikkje noko avsnitt om tempokart"
-#: session_state.cc:1209
+#: session_state.cc:1203
msgid "Session: XML state has no locations section"
msgstr "Økt: XML-fila har ikkje noko avsnitt om stader"
-#: session_state.cc:1235
+#: session_state.cc:1229
msgid "Session: XML state has no Regions section"
msgstr "Økt: XML-tilstandsfila har ikkje noko avsnitt om bolkar"
-#: session_state.cc:1242
+#: session_state.cc:1236
msgid "Session: XML state has no playlists section"
msgstr "Økt: XML-tilstandsfila har ikkje noko avsnitt om spelelister"
-#: session_state.cc:1262
+#: session_state.cc:1256
msgid "Session: XML state has no bundles section"
msgstr "Økt: XML-fila har inga avdeling for bundlar"
-#: session_state.cc:1274
+#: session_state.cc:1268
msgid "Session: XML state has no diskstreams section"
msgstr "Økt: XML-fila har ikkje nok avsnitt om diskstraumar"
-#: session_state.cc:1282
+#: session_state.cc:1276
msgid "Session: XML state has no routes section"
msgstr "Økt: XML-fila har ikkje noko avsnitt om ruter"
-#: session_state.cc:1294
+#: session_state.cc:1288
msgid "Session: XML state has no route groups section"
msgstr "Økt: XML-fila har inga avdeling for rutegrupper"
-#: session_state.cc:1303
+#: session_state.cc:1297
msgid "Session: XML state has no edit groups section"
msgstr "Økt: XML-fila har ikkje noko avsnitt om grupperedigering"
-#: session_state.cc:1310
+#: session_state.cc:1304
msgid "Session: XML state has no mix groups section"
msgstr "Økt: XML-fila har ikkje noko avsnitt om miksgrupper"
-#: session_state.cc:1318
+#: session_state.cc:1312
msgid "Session: XML state has no click section"
msgstr "Økt: XML-fila har ikkje noko avsnitt om klikk"
-#: session_state.cc:1360
+#: session_state.cc:1354
msgid "Session: cannot create Route from XML description."
msgstr "Økt: greier ikkje laga rute ut frå XML-skildringa."
-#: session_state.cc:1364
+#: session_state.cc:1358
msgid "Loaded track/bus %1"
msgstr "Lasta spor/buss %1"
-#: session_state.cc:1462
+#: session_state.cc:1456
msgid "Could not find diskstream for route"
msgstr "Greidde ikkje finna diskstraumen for rute"
-#: session_state.cc:1516
+#: session_state.cc:1510
msgid "Session: cannot create Region from XML description."
msgstr "Økt: greier ikkje laga bolkar ut frå XML-skildringa."
-#: session_state.cc:1520
+#: session_state.cc:1514
msgid "Can not load state for region '%1'"
msgstr "Greier ikkje laga status for bolken '%1'"
-#: session_state.cc:1556
+#: session_state.cc:1550
msgid "Regions in compound description not found (ID's %1 and %2): ignored"
msgstr "Fann ikkje bolkar i samansetjingsstatus (IDar %1 og %2): ignorert"
-#: session_state.cc:1584
+#: session_state.cc:1578
msgid "Nested source has no ID info in session file! (ignored)"
msgstr ""
-#: session_state.cc:1596
+#: session_state.cc:1590
msgid "Cannot reconstruct nested source for region %1"
msgstr "Greier ikkje rekonstruera nøsta kjelde for bolken %1"
-#: session_state.cc:1658
+#: session_state.cc:1652
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr "Økt: XML-punktet som skildrar ein lydbolk er uferdig (manglar kjelde)"
-#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707
+#: session_state.cc:1660 session_state.cc:1681 session_state.cc:1701
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
"Økt: XML-punktet som skildrar ein lydbolk peikar på ein ukjend kjelde-ID = %1"
-#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713
+#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
@@ -2009,7 +2023,7 @@ msgstr ""
"Økt: XML-punktet som skildrar ein lydbolk peikar på ein kjelde-ID %1 som "
"ikkje er ei lydfil"
-#: session_state.cc:1736
+#: session_state.cc:1730
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
@@ -2017,25 +2031,25 @@ msgstr ""
"Økt: XML-punktet som skildrar ein lydbolk manglar nokre masterkjelder, ser "
"bort frå"
-#: session_state.cc:1770
+#: session_state.cc:1764
msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
msgstr "Økt: XML-punktet som skildrar ein midibolk er uferdig (manglar kjelde)"
-#: session_state.cc:1778
+#: session_state.cc:1772
msgid ""
"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
msgstr ""
"Økt: XML-punktet som skildrar ein midibolk peikar på ein ukjend kjelde-ID = "
"%1"
-#: session_state.cc:1784
+#: session_state.cc:1778
msgid ""
"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
msgstr ""
"Økt: XML-punktet som skildrar ein midibolk peikar på ein kjelde-ID %1 som "
"ikkje er ei midi-fil"
-#: session_state.cc:1852
+#: session_state.cc:1846
msgid ""
"cannot create new file from region name \"%1\" with ident = \"%2\": too many "
"existing files with similar names"
@@ -2043,105 +2057,101 @@ msgstr ""
"greier ikkje laga ny fil frå bolknamn \"%1\" med ident = \"%2\": det finst "
"for mange med same namnet"
-#: session_state.cc:1875
+#: session_state.cc:1869
msgid "Session: cannot create Source from XML description."
msgstr "Økt: greier ikkje laga kjelde ut frå XML-skildringa."
-#: session_state.cc:1909
+#: session_state.cc:1903
msgid "A sound file is missing. It will be replaced by silence."
msgstr "Det manglar ei lydfil. Ho vil bli erstatta med stille."
-#: session_state.cc:1932
+#: session_state.cc:1926
msgid "Found a sound file that cannot be used by %1. Talk to the progammers."
msgstr "Fann ei lydfil som %1 ikkje kan bruka. Prat med utviklarane."
-#: session_state.cc:1949
+#: session_state.cc:1943
msgid "Could not create templates directory \"%1\" (%2)"
msgstr ""
-#: session_state.cc:1962
+#: session_state.cc:1956
msgid "Template \"%1\" already exists - new version not created"
msgstr "Malen \"%1\" finst alt - laga ingen ny versjon"
-#: session_state.cc:1968
+#: session_state.cc:1962
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr ""
-#: session_state.cc:1978
+#: session_state.cc:1972
msgid "template not saved"
msgstr "malen vart ikkje lagra"
-#: session_state.cc:1988
+#: session_state.cc:1982
msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
msgstr ""
-#: session_state.cc:2183
+#: session_state.cc:2225
msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr ""
-#: session_state.cc:2725 session_state.cc:2731
-msgid "Cannot expand path %1 (%2)"
-msgstr "Greier ikkje utvida stigen %1 (%2)"
-
-#: session_state.cc:2784
+#: session_state.cc:2820
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr "Økt: greier ikkje laga mappa \"%1\" for daudlyd (%2)"
-#: session_state.cc:2823
+#: session_state.cc:2859
msgid "cannot rename unused file source from %1 to %2 (%3)"
msgstr "kan ikkje døypa om den ubrukte filkjelda frå %1 til %2 (%3)"
-#: session_state.cc:2841
+#: session_state.cc:2877
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr "kan ikkje fjerna toppfil %1 for %2 (%3)"
-#: session_state.cc:3143
+#: session_state.cc:3179
msgid "could not backup old history file, current history not saved"
msgstr ""
"greidde ikkje ta tryggingskopi av den gamle historiefila, noverande historie "
"vart ikkje lagra."
-#: session_state.cc:3156
+#: session_state.cc:3192
msgid "history could not be saved to %1"
msgstr "greidde ikkje lagra historia til %1"
-#: session_state.cc:3159
+#: session_state.cc:3195
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:3163
+#: session_state.cc:3199
msgid "could not restore history file from backup %1 (%2)"
msgstr "greidde ikkje henta fram att historiefila frå tryggingskopien %1 (%2)"
-#: session_state.cc:3188
+#: session_state.cc:3224
msgid "%1: no history file \"%2\" for this session."
msgstr "%1: inga historiefil \"%2\" for denne økta."
-#: session_state.cc:3194
+#: session_state.cc:3230
msgid "Could not understand session history file \"%1\""
msgstr "Skjønte ikkje økthistoriefila \"%1\""
-#: session_state.cc:3236
+#: session_state.cc:3272
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr "Greidde ikkje kasta ned midi-kjelde for NoteDiffCommand"
-#: session_state.cc:3247
+#: session_state.cc:3283
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr "Greidde ikkje kasta ned midi-kjelde for SysExDiffCommand"
-#: session_state.cc:3258
+#: session_state.cc:3294
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr "Greidde ikkje kasta ned midi-kjelde for PatchChangeDiffCommand"
-#: session_state.cc:3266
+#: session_state.cc:3302
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr "Fann ikkje ut korleis eg skal laga ein kommando av eit %1-XML-punkt."
-#: session_state.cc:3502
+#: session_state.cc:3538
msgid "Session: unknown diskstream type in XML"
msgstr "Økt: ukjend diskstraumtype i XML"
-#: session_state.cc:3507
+#: session_state.cc:3543
msgid "Session: could not load diskstream via XML state"
msgstr "Økt: greidde ikkje lasta diskstraumen via XML-tilstand"
@@ -2169,122 +2179,122 @@ msgstr ""
"Allmenn varifart-kontroll kan ikkje brukast når %1 er kopla til JACK-"
"transportkontrollen"
-#: smf_source.cc:252
+#: smf_source.cc:262
msgid "Unable to read event prefix, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:265
+#: smf_source.cc:275
msgid "Event has time and size but no body, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:271
+#: smf_source.cc:281
msgid "Event time is before MIDI source position"
msgstr ""
-#: smf_source.cc:306 smf_source.cc:345
+#: smf_source.cc:316 smf_source.cc:355
msgid "Skipping event with unordered time %1"
msgstr ""
-#: smf_source.cc:410
+#: smf_source.cc:420
msgid "cannot open MIDI file %1 for write"
msgstr "greier ikkje opna MIDI-fila %1 for skriving"
-#: sndfile_helpers.cc:32
+#: sndfile_helpers.cc:34
msgid "WAV"
msgstr "WAV"
-#: sndfile_helpers.cc:33
+#: sndfile_helpers.cc:35
msgid "AIFF"
msgstr "AIFF"
-#: sndfile_helpers.cc:34
+#: sndfile_helpers.cc:36
msgid "CAF"
msgstr "CAF"
-#: sndfile_helpers.cc:35
+#: sndfile_helpers.cc:37
msgid "W64 (64 bit WAV)"
msgstr "W64 (64-bits WAV)"
-#: sndfile_helpers.cc:36
+#: sndfile_helpers.cc:38
msgid "FLAC"
msgstr "FLAC"
-#: sndfile_helpers.cc:37
+#: sndfile_helpers.cc:39
msgid "Ogg/Vorbis"
msgstr "Ogg/Vorbis"
-#: sndfile_helpers.cc:38
+#: sndfile_helpers.cc:40
msgid "raw (no header)"
msgstr "rå fil (utan tittellinje)"
-#: sndfile_helpers.cc:43
+#: sndfile_helpers.cc:45
msgid ".wav"
msgstr ".wav"
-#: sndfile_helpers.cc:44
+#: sndfile_helpers.cc:46
msgid ".aiff"
msgstr ".aiff"
-#: sndfile_helpers.cc:45
+#: sndfile_helpers.cc:47
msgid ".caf"
msgstr ".caf"
-#: sndfile_helpers.cc:46
+#: sndfile_helpers.cc:48
msgid ".w64"
msgstr ".w64"
-#: sndfile_helpers.cc:47
+#: sndfile_helpers.cc:49
msgid ".flac"
msgstr ".flac"
-#: sndfile_helpers.cc:48
+#: sndfile_helpers.cc:50
msgid ".ogg"
msgstr ".ogg"
-#: sndfile_helpers.cc:49
+#: sndfile_helpers.cc:51
msgid ".raw"
msgstr ".raw"
-#: sndfile_helpers.cc:64
+#: sndfile_helpers.cc:66
msgid "Signed 16 bit PCM"
msgstr "Signert 16bit PCM"
-#: sndfile_helpers.cc:65
+#: sndfile_helpers.cc:67
msgid "Signed 24 bit PCM"
msgstr "Signert 24bit PCM"
-#: sndfile_helpers.cc:66
+#: sndfile_helpers.cc:68
msgid "Signed 32 bit PCM"
msgstr "Signert 32bit PCM"
-#: sndfile_helpers.cc:67
+#: sndfile_helpers.cc:69
msgid "Signed 8 bit PCM"
msgstr "Signert 8bit PCM"
-#: sndfile_helpers.cc:68
+#: sndfile_helpers.cc:70
msgid "32 bit float"
msgstr "32-bit flytpunkt"
-#: sndfile_helpers.cc:81
+#: sndfile_helpers.cc:83
msgid "Little-endian (Intel)"
msgstr "Liten endian (Intel)"
-#: sndfile_helpers.cc:82
+#: sndfile_helpers.cc:84
msgid "Big-endian (PowerPC)"
msgstr "Viktigaste bit fyrst (Mac)"
-#: sndfilesource.cc:201
+#: sndfilesource.cc:210
msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
msgstr "Lydfilkjelde: greier ikkje opna fila \"%1\" for %2 (%3)"
-#: sndfilesource.cc:209
+#: sndfilesource.cc:218
msgid ""
"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
"number"
msgstr ""
"Lydfilkjelde: fila inneheld berre %1 kanalar, %2 er eit ugyldig kanalnummer"
-#: sndfilesource.cc:255 sndfilesource.cc:571 sndfilesource.cc:595
+#: sndfilesource.cc:264 sndfilesource.cc:604 sndfilesource.cc:628
msgid ""
"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
"for this file"
@@ -2292,62 +2302,66 @@ msgstr ""
"greier ikkje fastsetja kringkastingsinformasjon for lydfila %1 (%2), hoppar "
"over kringkastingsinformasjonen for denne fila"
-#: sndfilesource.cc:302
+#: sndfilesource.cc:311
msgid "could not allocate file %1 for reading."
msgstr "greidde ikkje tildela fila %1 for å lesa"
-#: sndfilesource.cc:337
+#: sndfilesource.cc:346
msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
msgstr "Lydfilkjelde: greier ikkje leita fram til ramma %1 innan %2 (%3)"
-#: sndfilesource.cc:347
+#: sndfilesource.cc:356
msgid ""
"SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
msgstr ""
-#: sndfilesource.cc:391 sndfilesource.cc:420
+#: sndfilesource.cc:400 sndfilesource.cc:429
msgid "attempt to write a non-writable audio file source (%1)"
msgstr "prøvde å skriva til ei ikkje-skrivbar lydkjeldefil (%1)"
-#: sndfilesource.cc:396 utils.cc:510 utils.cc:534 utils.cc:548 utils.cc:567
+#: sndfilesource.cc:405 utils.cc:547 utils.cc:571 utils.cc:585 utils.cc:604
msgid "programming error: %1 %2"
msgstr "programmeringsfeil: %1 %2"
-#: sndfilesource.cc:523
+#: sndfilesource.cc:532 sndfilesource.cc:562
msgid "attempt to flush a non-writable audio file source (%1)"
msgstr "prøvde å tømma ei ikkje-skrivbar lydkjeldefil (%1)"
-#: sndfilesource.cc:528
+#: sndfilesource.cc:537 sndfilesource.cc:557
msgid "attempt to flush an un-opened audio file source (%1)"
msgstr "prøvde å tømma ei uopna lydkjeldefil (%1)"
-#: sndfilesource.cc:534
+#: sndfilesource.cc:543
msgid "could not allocate file %1 to write header"
msgstr "greidde ikkje tildela fila %1 for å skriva hovudet"
-#: sndfilesource.cc:548
+#: sndfilesource.cc:568
+msgid "could not allocate file %1 to flush contents"
+msgstr ""
+
+#: sndfilesource.cc:581
msgid ""
"attempt to store broadcast info in a non-writable audio file source (%1)"
msgstr ""
"prøvde å lagra kringastingsinfo til ei ikkje-skrivbar lydkjeldefil (%1)"
-#: sndfilesource.cc:553
+#: sndfilesource.cc:586
msgid "attempt to set BWF info for an un-opened audio file source (%1)"
msgstr "prøvde å laga BWF-info for ei uopna lydkjeldefil (%1)"
-#: sndfilesource.cc:614
+#: sndfilesource.cc:647
msgid "%1: cannot seek to %2 (libsndfile error: %3)"
msgstr ""
-#: sndfilesource.cc:727
+#: sndfilesource.cc:760
msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
msgstr "SndFileSource: \"%1\" feillesen returverdi: %2 av %5 (%3: %4)"
-#: sndfilesource.cc:740 sndfilesource.cc:790 sndfilesource.cc:797
+#: sndfilesource.cc:773 sndfilesource.cc:823 sndfilesource.cc:830
msgid "SndFileSource: \"%1\" bad write (%2)"
msgstr "SndFileSource: \"%1\" feilskriving (%2)"
-#: sndfilesource.cc:820
+#: sndfilesource.cc:853
msgid ""
"Filesource: start time is already set for existing file (%1): Cannot change "
"start time."
@@ -2355,21 +2369,25 @@ msgstr ""
"Filkjelde: starttida er alt sett for denne fila (%1): kan ikkje endra "
"starttid."
-#: speakers.cc:239
+#: speakers.cc:280
msgid "Speaker information is missing azimuth - speaker ignored"
msgstr "Høgtalaroppsettet manglar asimutvinkel - høgtalaren ikkje medteken"
-#: speakers.cc:245
+#: speakers.cc:286
msgid "Speaker information is missing elevation - speaker ignored"
msgstr ""
"Høgtalaroppsettet manglar opplysingar om høgd over golvet - høgtalaren ikkje "
"medteken"
-#: speakers.cc:251
+#: speakers.cc:292
msgid "Speaker information is missing distance - speaker ignored"
msgstr ""
"Høgtalaroppsettet manglar opplysingar om avstand - høgtalaren ikkje medteken"
+#: srcfilesource.cc:135
+msgid "SrcFileSource: %1"
+msgstr ""
+
#: tape_file_matcher.cc:46
msgid "Cannot compile tape track regexp for use (%1)"
msgstr "Greier ikkje setja saman bandspor-reguttrykk til bruk (%1)"
@@ -2522,54 +2540,82 @@ msgstr "Punktet for kanalen har ingen \"type\"-eigenskap"
msgid "Node for Port has no \"name\" property"
msgstr "Punktet for porten har ingen \"namn\"-eigenskap"
-#: utils.cc:358 utils.cc:382
+#: utils.cc:395 utils.cc:419
msgid "Splice"
msgstr "Splitt"
-#: utils.cc:360 utils.cc:375
+#: utils.cc:397 utils.cc:412
msgid "Slide"
msgstr "Gli"
-#: utils.cc:362 utils.cc:378
+#: utils.cc:399 utils.cc:415
msgid "Lock"
msgstr "LÃ¥s"
-#: utils.cc:365
+#: utils.cc:402
msgid "programming error: unknown edit mode string \"%1\""
msgstr "programmeringsfeil: ukjend redigeringsmodus-streng \"%1\""
-#: utils.cc:389 utils.cc:421
+#: utils.cc:426 utils.cc:458
msgid "MIDI Timecode"
msgstr "MIDI-tidskode"
-#: utils.cc:389 utils.cc:419
+#: utils.cc:426 utils.cc:456
msgid "MTC"
msgstr "MTC"
-#: utils.cc:393 utils.cc:428
+#: utils.cc:430 utils.cc:465
msgid "MIDI Clock"
msgstr "MIDI-klokke"
-#: utils.cc:397 utils.cc:415 utils.cc:435
+#: utils.cc:434 utils.cc:452 utils.cc:472
msgid "JACK"
msgstr "JACK"
-#: utils.cc:401
+#: utils.cc:438
msgid "programming error: unknown sync source string \"%1\""
msgstr "programmeringsfeil: ukjend synkkjeldestreng \"%1\""
-#: utils.cc:426
+#: utils.cc:463
msgid "M-Clock"
msgstr ""
-#: utils.cc:432
+#: utils.cc:469
msgid "LTC"
msgstr ""
-#: utils.cc:602
+#: utils.cc:639
msgid "programming error: unknown native header format: %1"
msgstr "programmeringsfeil: ukjent opphavleg hovudformat: \"%1\""
-#: utils.cc:617
+#: utils.cc:654
msgid "cannot open directory %1 (%2)"
msgstr "greier ikkje opna mappa %1 (%2)"
+
+#~ msgid "Auditioning of non-audio regions not yet supported"
+#~ msgstr "Me har ikkje laga lytting for bolkar som ikkje er lyd enno"
+
+#~ msgid "Filesource: cannot find required file (%1): while searching %2"
+#~ msgstr "Filkjelde: Kan ikkje finna fila (%1) under søking i %2"
+
+#~ msgid ""
+#~ "FileSource: \"%1\" is ambigous when searching %2\n"
+#~ "\t"
+#~ msgstr ""
+#~ "Filkjelde: \"%1\" er tvetydig når du søkjer %2\n"
+#~ "\t"
+
+#~ msgid "Could not resolve path: %1 (%2)"
+#~ msgstr "Greidde ikkje finna stigen: %1: (%2)"
+
+#~ msgid "LADSPA: cannot load module from \"%1\""
+#~ msgstr "LADSPA: greier ikkje lasta modul frå \"%1\""
+
+#~ msgid "looking for panners in %1"
+#~ msgstr "ser etter panoreringar i %1"
+
+#~ msgid "could not rename temporary session file %1 to %2"
+#~ msgstr "greidde ikkje døypa om mellombels øktfil %1 til %2"
+
+#~ msgid "Cannot expand path %1 (%2)"
+#~ msgstr "Greier ikkje utvida stigen %1 (%2)"
diff --git a/libs/ardour/po/pl.po b/libs/ardour/po/pl.po
index 05dd5c642a..bab49e326f 100644
--- a/libs/ardour/po/pl.po
+++ b/libs/ardour/po/pl.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: libardour3\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-11-05 11:11-0500\n"
+"POT-Creation-Date: 2014-02-10 17:53+0100\n"
"PO-Revision-Date: 2008-04-10 10:51+0100\n"
"Last-Translator: Piotr Zaryk <pzaryk@gmail.com>\n"
"Language-Team: Polish <pl@li.org>\n"
@@ -20,64 +20,64 @@ msgstr ""
msgid "Fader"
msgstr ""
-#: audio_diskstream.cc:244
+#: audio_diskstream.cc:242
msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
msgstr ""
-#: audio_diskstream.cc:296
+#: audio_diskstream.cc:294
msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
-#: audio_diskstream.cc:848 audio_diskstream.cc:858
+#: audio_diskstream.cc:846 audio_diskstream.cc:856
msgid ""
"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
msgstr ""
-#: audio_diskstream.cc:1014
+#: audio_diskstream.cc:1012
msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-#: audio_diskstream.cc:1383 audio_diskstream.cc:1400
+#: audio_diskstream.cc:1381 audio_diskstream.cc:1398
msgid "AudioDiskstream %1: cannot write to disk"
msgstr ""
-#: audio_diskstream.cc:1443
+#: audio_diskstream.cc:1441
msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: audio_diskstream.cc:1537
+#: audio_diskstream.cc:1535
msgid "%1: could not create region for complete audio file"
msgstr ""
-#: audio_diskstream.cc:1571
+#: audio_diskstream.cc:1569
msgid "AudioDiskstream: could not create region for captured audio!"
msgstr ""
-#: audio_diskstream.cc:1679
+#: audio_diskstream.cc:1677
msgid "programmer error: %1"
msgstr "błąd programisty: %1"
-#: audio_diskstream.cc:1905
+#: audio_diskstream.cc:1903
msgid "AudioDiskstream: channel %1 out of range"
msgstr ""
-#: audio_diskstream.cc:1919 midi_diskstream.cc:1210
+#: audio_diskstream.cc:1917 midi_diskstream.cc:1209
msgid "%1:%2 new capture file not initialized correctly"
msgstr ""
-#: audio_diskstream.cc:2200
+#: audio_diskstream.cc:2198
msgid "%1: cannot restore pending capture source file %2"
msgstr ""
-#: audio_diskstream.cc:2222
+#: audio_diskstream.cc:2220
msgid "%1: incorrect number of pending sources listed - ignoring them all"
msgstr ""
-#: audio_diskstream.cc:2246
+#: audio_diskstream.cc:2244
msgid "%1: cannot create whole-file region from pending capture sources"
msgstr ""
-#: audio_library.cc:71
+#: audio_library.cc:81
msgid "Could not open %1. Audio Library not saved"
msgstr ""
@@ -117,11 +117,11 @@ msgstr ""
msgid "Audio Playlists (unused)"
msgstr ""
-#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529
+#: audio_playlist_source.cc:171 audiosource.cc:891 file_source.cc:520
#: midi_playlist_source.cc:144 midi_playlist_source.cc:152
-#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643
-#: rb_effect.cc:333 session.cc:2619 session.cc:2652 session.cc:3797
-#: session_handle.cc:87 sndfilesource.cc:121
+#: midi_playlist_source.cc:159 midi_source.cc:370 plugin_insert.cc:634
+#: rb_effect.cc:333 session.cc:2636 session.cc:2669 session.cc:3814
+#: session_handle.cc:87 sndfilesource.cc:122
msgid "programming error: %1"
msgstr ""
@@ -145,23 +145,23 @@ msgid ""
"Channels: "
msgstr ""
-#: audio_track.cc:167
+#: audio_track.cc:161
msgid "Unknown bundle \"%1\" listed for input of %2"
msgstr ""
-#: audio_track.cc:169
+#: audio_track.cc:163
msgid "in 1"
msgstr "wejście 1"
-#: audio_track.cc:170
+#: audio_track.cc:164
msgid "No input bundles available as a replacement"
msgstr ""
-#: audio_track.cc:174
+#: audio_track.cc:168
msgid "Bundle %1 was not available - \"in 1\" used instead"
msgstr ""
-#: audio_track.cc:183
+#: audio_track.cc:177
msgid "improper input channel list in XML node (%1)"
msgstr ""
@@ -185,23 +185,23 @@ msgstr ""
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr ""
-#: audioengine.cc:488
+#: audioengine.cc:495
msgid "looking for backends in %1\n"
msgstr ""
-#: audioengine.cc:511
+#: audioengine.cc:518
msgid "AudioEngine: cannot load module \"%1\" (%2)"
msgstr ""
-#: audioengine.cc:517
+#: audioengine.cc:524
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr ""
-#: audioengine.cc:589
+#: audioengine.cc:596
msgid "Could not create backend for %1: %2"
msgstr ""
-#: audioregion.cc:1643
+#: audioregion.cc:1651
msgid ""
"You have requested an operation that requires audio analysis.\n"
"\n"
@@ -216,11 +216,11 @@ msgid ""
"this and future transient-detection operations.\n"
msgstr ""
-#: audiosource.cc:199
+#: audiosource.cc:210
msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
msgstr ""
-#: audiosource.cc:226
+#: audiosource.cc:239
msgid "AudioSource: cannot stat peakfile \"%1\""
msgstr ""
@@ -228,47 +228,68 @@ msgstr ""
msgid "cannot read sample data for unscaled peak computation"
msgstr ""
-#: audiosource.cc:387
+#: audiosource.cc:386
msgid "AudioSource: cannot open peakpath (a) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:463
+#: audiosource.cc:395 audiosource.cc:473
+msgid ""
+"AudioSource: could not seek to correct location in peak file \"%1\" (%2)"
+msgstr ""
+
+#: audiosource.cc:453
msgid "AudioSource: cannot open peakpath (b) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:587
+#: audiosource.cc:567
msgid ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
msgstr ""
-#: audiosource.cc:667
+#: audiosource.cc:634
msgid "%1: could not write read raw data for peak computation (%2)"
msgstr ""
-#: audiosource.cc:706
+#: audiosource.cc:672
msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:773 audiosource.cc:886
+#: audiosource.cc:739 audiosource.cc:861
+msgid "%1: could not seek in peak file data (%2)"
+msgstr ""
+
+#: audiosource.cc:744 audiosource.cc:870
msgid "%1: could not write peak file data (%2)"
msgstr ""
-#: audiosource.cc:924
+#: audiosource.cc:903
msgid "could not truncate peakfile %1 to %2 (error: %3)"
msgstr ""
-#: auditioner.cc:87
-msgid "no outputs available for auditioner - manual connection required"
+#: auditioner.cc:95
+msgid "Falling back to Reasonable Synth for Midi Audition"
+msgstr ""
+
+#: auditioner.cc:97
+msgid "No synth for midi-audition found."
msgstr ""
-#: auditioner.cc:135
-msgid "Auditioning of non-audio regions not yet supported"
+#: auditioner.cc:152
+msgid "no outputs available for auditioner - manual connection required"
msgstr ""
-#: auditioner.cc:160
+#: auditioner.cc:392 auditioner.cc:438
msgid "Cannot setup auditioner processing flow for %1 channels"
msgstr ""
+#: auditioner.cc:426
+msgid "Failed to load synth for MIDI-Audition."
+msgstr ""
+
+#: auditioner.cc:445
+msgid "Auditioning of regions other than Audio or Midi is not supported."
+msgstr ""
+
#: automatable.cc:81
msgid "Automation node has no path property"
msgstr ""
@@ -300,23 +321,23 @@ msgid ""
"AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
msgstr ""
-#: butler.cc:91
+#: butler.cc:80
msgid "Cannot create transport request signal pipe (%1)"
msgstr ""
-#: butler.cc:97 butler.cc:103
+#: butler.cc:86 butler.cc:92
msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)"
msgstr ""
-#: butler.cc:109
+#: butler.cc:124
msgid "Session: could not create butler thread"
msgstr ""
-#: butler.cc:156
+#: butler.cc:165
msgid "poll on butler request pipe failed (%1)"
msgstr ""
-#: butler.cc:163
+#: butler.cc:172
msgid "Error on butler thread request pipe: fd=%1 err=%2"
msgstr ""
@@ -324,55 +345,55 @@ msgstr ""
msgid "Error reading from butler request pipe"
msgstr ""
-#: butler.cc:248
+#: butler.cc:301
msgid "Butler read ahead failure on dstream %1"
msgstr ""
-#: butler.cc:285
+#: butler.cc:338
msgid "Butler write-behind failure on dstream %1"
msgstr ""
-#: control_protocol_manager.cc:134
+#: control_protocol_manager.cc:164
msgid "control protocol name \"%1\" has no descriptor"
msgstr ""
-#: control_protocol_manager.cc:141
+#: control_protocol_manager.cc:171
msgid "control protocol name \"%1\" could not be initialized"
msgstr ""
-#: control_protocol_manager.cc:201
+#: control_protocol_manager.cc:237
msgid "Instantiating mandatory control protocol %1"
msgstr ""
-#: control_protocol_manager.cc:222
+#: control_protocol_manager.cc:258
msgid "looking for control protocols in %1\n"
msgstr ""
-#: control_protocol_manager.cc:247
+#: control_protocol_manager.cc:283
msgid "Control protocol %1 not usable"
msgstr ""
-#: control_protocol_manager.cc:264
+#: control_protocol_manager.cc:300
msgid "Control surface protocol discovered: \"%1\"\n"
msgstr ""
-#: control_protocol_manager.cc:282
+#: control_protocol_manager.cc:318
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
msgstr ""
-#: control_protocol_manager.cc:290
+#: control_protocol_manager.cc:324
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr ""
-#: cycle_timer.cc:38
+#: cycle_timer.cc:40
msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
msgstr ""
-#: cycle_timer.cc:50
+#: cycle_timer.cc:52
msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo"
msgstr ""
-#: cycle_timer.cc:73
+#: cycle_timer.cc:75
msgid "cannot locate cpu MHz in /proc/cpuinfo"
msgstr "nie można zlokalizować taktowania CPU w /proc/cpuinfo"
@@ -380,7 +401,7 @@ msgstr "nie można zlokalizować taktowania CPU w /proc/cpuinfo"
msgid "audio"
msgstr ""
-#: data_type.cc:28 session.cc:1791 session.cc:1794
+#: data_type.cc:28 session.cc:1808 session.cc:1811
msgid "MIDI"
msgstr ""
@@ -388,15 +409,15 @@ msgstr ""
msgid "unknown"
msgstr ""
-#: delivery.cc:114
+#: delivery.cc:118
msgid "main outs"
msgstr ""
-#: delivery.cc:117 send.cc:61
+#: delivery.cc:121 send.cc:62
msgid "listen"
msgstr ""
-#: diskstream.cc:303
+#: diskstream.cc:302
msgid "Location \"%1\" not valid for track loop (start >= end)"
msgstr ""
@@ -408,23 +429,23 @@ msgstr ""
msgid "Export failed: %1"
msgstr ""
-#: export_filename.cc:118
+#: export_filename.cc:119
msgid "Existing export folder for this session (%1) does not exist - ignored"
msgstr ""
-#: export_filename.cc:229
+#: export_filename.cc:230
msgid "No Time"
msgstr ""
-#: export_filename.cc:238
+#: export_filename.cc:239
msgid "Invalid time format"
msgstr ""
-#: export_filename.cc:247
+#: export_filename.cc:248
msgid "No Date"
msgstr ""
-#: export_filename.cc:262
+#: export_filename.cc:263
msgid "Invalid date format"
msgstr ""
@@ -492,7 +513,7 @@ msgstr ""
msgid "Rectangular"
msgstr ""
-#: export_formats.cc:52 session.cc:5014 session.cc:5030
+#: export_formats.cc:52 session.cc:5006 session.cc:5022
msgid "None"
msgstr ""
@@ -532,15 +553,15 @@ msgstr ""
msgid "No sample format"
msgstr ""
-#: export_handler.cc:335
+#: export_handler.cc:343
msgid "Editor: cannot open \"%1\" as export file for CD marker file"
msgstr ""
-#: export_handler.cc:417 export_handler.cc:420
+#: export_handler.cc:425 export_handler.cc:428
msgid "an error occured while writing a TOC/CUE file: %1"
msgstr ""
-#: export_handler.cc:642 export_handler.cc:700
+#: export_handler.cc:650 export_handler.cc:708
msgid "Cannot convert %1 to Latin-1 text"
msgstr ""
@@ -602,7 +623,7 @@ msgid ""
"configuration"
msgstr ""
-#: file_source.cc:198 session_state.cc:2807
+#: file_source.cc:198 session_state.cc:2843
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr ""
@@ -611,35 +632,35 @@ msgstr ""
msgid "cannot rename file source from %1 to %2 (%3)"
msgstr ""
-#: file_source.cc:250 file_source.cc:378
+#: file_source.cc:248 file_source.cc:372
msgid "FileSource: search path not set"
msgstr ""
-#: file_source.cc:313 file_source.cc:448
-msgid "Filesource: cannot find required file (%1): while searching %2"
+#: file_source.cc:309 file_source.cc:439
+msgid "Filesource: cannot find required file (%1)"
msgstr ""
-#: file_source.cc:440
+#: file_source.cc:432
msgid ""
-"FileSource: \"%1\" is ambigous when searching %2\n"
+"FileSource: \"%1\" is ambigous when searching\n"
"\t"
msgstr ""
-#: file_source.cc:494
+#: file_source.cc:484
msgid "Filesource: cannot find required file (%1): %2"
msgstr ""
-#: file_source.cc:501
+#: file_source.cc:492
msgid "Filesource: cannot check for existing file (%1): %2"
msgstr ""
-#: file_source.cc:535
+#: file_source.cc:526
msgid ""
"Programming error! %1 tried to rename a file over another file! It's safe to "
"continue working, but please report this to the developers."
msgstr ""
-#: file_source.cc:540
+#: file_source.cc:531
msgid "cannot rename file %1 to %2 (%3)"
msgstr ""
@@ -653,15 +674,15 @@ msgid ""
"cannot run"
msgstr ""
-#: filesystem_paths.cc:91
+#: filesystem_paths.cc:96
msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
msgstr ""
-#: filesystem_paths.cc:107
+#: filesystem_paths.cc:125
msgid "ARDOUR_CONFIG_PATH not set in environment - exiting\n"
msgstr ""
-#: filesystem_paths.cc:127
+#: filesystem_paths.cc:148
msgid "ARDOUR_DATA_PATH not set in environment - exiting\n"
msgstr ""
@@ -673,87 +694,83 @@ msgstr ""
msgid "filter: error creating new file %1 (%2)"
msgstr ""
-#: find_session.cc:51
-msgid "Could not resolve path: %1 (%2)"
-msgstr ""
-
-#: find_session.cc:63
+#: find_session.cc:59
msgid "cannot check session path %1 (%2)"
msgstr ""
-#: find_session.cc:89
+#: find_session.cc:85
msgid "cannot check statefile %1 (%2)"
msgstr ""
-#: find_session.cc:125
+#: find_session.cc:121
msgid "%1 is not a snapshot file"
msgstr ""
-#: find_session.cc:142
+#: find_session.cc:138
msgid "cannot determine current working directory (%1)"
msgstr ""
-#: find_session.cc:159
+#: find_session.cc:155
msgid "unknown file type for session %1"
msgstr ""
-#: globals.cc:207
+#: globals.cc:216
msgid "Could not set system open files limit to \"unlimited\""
msgstr ""
-#: globals.cc:209
+#: globals.cc:218
msgid "Could not set system open files limit to %1"
msgstr ""
-#: globals.cc:213
+#: globals.cc:222
msgid "Your system is configured to limit %1 to only %2 open files"
msgstr ""
-#: globals.cc:217
+#: globals.cc:226
msgid "Could not get system open files limit (%1)"
msgstr ""
-#: globals.cc:268
+#: globals.cc:280
msgid "Loading configuration"
msgstr ""
-#: import.cc:207
+#: import.cc:208
msgid "Could not find a source for %1 even though we are updating this file!"
msgstr ""
-#: import.cc:236
+#: import.cc:237
msgid "Unable to create file %1 during import"
msgstr ""
-#: import.cc:262
+#: import.cc:263
msgid "Resampling %1 from %2kHz to %3kHz"
msgstr ""
-#: import.cc:268
+#: import.cc:269
msgid "Copying %1"
msgstr ""
-#: import.cc:446
+#: import.cc:455
msgid "Track %1 of %2 contained no usable MIDI data"
msgstr ""
-#: import.cc:453
+#: import.cc:462
msgid "MIDI file %1 was not readable (no reason available)"
msgstr ""
-#: import.cc:499
+#: import.cc:508
msgid "Import: cannot open input sound file \"%1\""
msgstr ""
-#: import.cc:510
+#: import.cc:519
msgid "Import: error opening MIDI file"
msgstr ""
-#: import.cc:549
+#: import.cc:558
msgid "Loading MIDI file %1"
msgstr ""
-#: import.cc:614
+#: import.cc:623
msgid "Failed to remove some files after failed/cancelled import operation"
msgstr ""
@@ -765,153 +782,153 @@ msgstr ""
msgid "preset %1 (bank %2)"
msgstr ""
-#: internal_send.cc:278 internal_send.cc:279
+#: internal_send.cc:300 internal_send.cc:301
msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
msgstr ""
-#: io.cc:208
+#: io.cc:209
msgid "IO: cannot disconnect port %1 from %2"
msgstr ""
-#: io.cc:343 io.cc:428
+#: io.cc:344 io.cc:431
msgid "IO: cannot register input port %1"
msgstr ""
-#: io.cc:348 io.cc:433
+#: io.cc:349 io.cc:436
msgid "IO: cannot register output port %1"
msgstr ""
-#: io.cc:591 io.cc:647
+#: io.cc:598 io.cc:654
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr ""
-#: io.cc:706
+#: io.cc:713
msgid "in"
msgstr "wejście"
-#: io.cc:706
+#: io.cc:713
msgid "out"
msgstr "wyjście"
-#: io.cc:707
+#: io.cc:714
msgid "input"
msgstr ""
-#: io.cc:707
+#: io.cc:714
msgid "output"
msgstr ""
-#: io.cc:717
+#: io.cc:724
msgid "Unknown bundle \"%1\" listed for %2 of %3"
msgstr ""
-#: io.cc:783
+#: io.cc:790
msgid "Bundle %1 was not available - \"%2\" used instead"
msgstr ""
-#: io.cc:786
+#: io.cc:793
msgid "No %1 bundles available as a replacement"
msgstr ""
-#: io.cc:889
+#: io.cc:896
msgid "%1: cannot create I/O ports"
msgstr ""
-#: io.cc:1017 io.cc:1121
+#: io.cc:1024 io.cc:1128
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr ""
-#: io.cc:1022 io.cc:1126
+#: io.cc:1029 io.cc:1133
msgid "bad input string in XML node \"%1\""
msgstr ""
-#: io.cc:1060
+#: io.cc:1067
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr ""
-#: io.cc:1065
+#: io.cc:1072
msgid "IO: bad output string in XML node \"%1\""
msgstr ""
-#: io.cc:1411
+#: io.cc:1417
#, c-format
msgid "%s %u"
msgstr "%s %u"
-#: io.cc:1458
+#: io.cc:1464
#, c-format
msgid "%s in"
msgstr ""
-#: io.cc:1460
+#: io.cc:1466
#, c-format
msgid "%s out"
msgstr ""
-#: io.cc:1535 session.cc:686 session.cc:715
+#: io.cc:1541 session.cc:689 session.cc:718
msgid "mono"
msgstr ""
-#: io.cc:1537 session.cc:699 session.cc:729
+#: io.cc:1543 session.cc:702 session.cc:732
msgid "L"
msgstr ""
-#: io.cc:1537 session.cc:701 session.cc:731
+#: io.cc:1543 session.cc:704 session.cc:734
msgid "R"
msgstr ""
-#: io.cc:1539 io.cc:1545
+#: io.cc:1545 io.cc:1551
#, c-format
msgid "%d"
msgstr ""
-#: ladspa_plugin.cc:86
+#: ladspa_plugin.cc:93
+msgid "LADSPA: Unable to open module: "
+msgstr ""
+
+#: ladspa_plugin.cc:99
msgid "LADSPA: module has no descriptor function."
msgstr ""
-#: ladspa_plugin.cc:91
+#: ladspa_plugin.cc:106
msgid "LADSPA: plugin has gone away since discovery!"
msgstr ""
-#: ladspa_plugin.cc:98
+#: ladspa_plugin.cc:113
msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
msgstr ""
-#: ladspa_plugin.cc:297
+#: ladspa_plugin.cc:311
msgid ""
"illegal parameter number used with plugin \"%1\". This may indicate a change "
"in the plugin design, and presets may be invalid"
msgstr ""
-#: ladspa_plugin.cc:376 ladspa_plugin.cc:426
+#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr ""
-#: ladspa_plugin.cc:391 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
msgid "LADSPA: no ladspa port number"
msgstr ""
-#: ladspa_plugin.cc:397 ladspa_plugin.cc:446
+#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
msgid "LADSPA: no ladspa port data"
msgstr ""
-#: ladspa_plugin.cc:717
-msgid "LADSPA: cannot load module from \"%1\""
-msgstr ""
-
-#: ladspa_plugin.cc:827
+#: ladspa_plugin.cc:840
msgid "Could not locate HOME. Preset not removed."
msgstr ""
-#: ladspa_plugin.cc:864 ladspa_plugin.cc:870
+#: ladspa_plugin.cc:879 ladspa_plugin.cc:885
msgid "Could not create %1. Preset not saved. (%2)"
msgstr ""
-#: ladspa_plugin.cc:877
+#: ladspa_plugin.cc:892
msgid "Error saving presets file %1."
msgstr ""
-#: ladspa_plugin.cc:915
+#: ladspa_plugin.cc:934
msgid "Could not locate HOME. Preset not saved."
msgstr ""
@@ -951,7 +968,7 @@ msgstr ""
msgid "incorrect XML mode passed to Locations::set_state"
msgstr ""
-#: location.cc:842 session.cc:4516 session_state.cc:1031
+#: location.cc:842 session.cc:4533 session_state.cc:1025
msgid "session"
msgstr ""
@@ -1006,40 +1023,39 @@ msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
msgstr ""
#: ltc_slave.cc:591
-#, c-format
msgid "flywheel"
msgstr ""
-#: midi_diskstream.cc:167
+#: midi_diskstream.cc:166
msgid ""
"%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
msgstr ""
-#: midi_diskstream.cc:219
+#: midi_diskstream.cc:218
msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
msgstr ""
-#: midi_diskstream.cc:270
+#: midi_diskstream.cc:269
msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
-#: midi_diskstream.cc:699
+#: midi_diskstream.cc:698
msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-#: midi_diskstream.cc:834
+#: midi_diskstream.cc:833
msgid "MidiDiskstream %1: cannot write to disk"
msgstr ""
-#: midi_diskstream.cc:868
+#: midi_diskstream.cc:867
msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: midi_diskstream.cc:955
+#: midi_diskstream.cc:954
msgid "%1: could not create region for complete midi file"
msgstr ""
-#: midi_diskstream.cc:992
+#: midi_diskstream.cc:991
msgid "MidiDiskstream: could not create region for captured midi!"
msgstr ""
@@ -1051,27 +1067,27 @@ msgstr ""
msgid "No SysExID found for sys-ex property change - ignored"
msgstr ""
-#: midi_model.cc:2010
+#: midi_model.cc:2012
msgid "transpose"
msgstr ""
-#: midi_patch_manager.cc:126
+#: midi_patch_manager.cc:127
msgid "Duplicate MIDI device `%1' in `%2' ignored"
msgstr ""
-#: midi_source.cc:125
+#: midi_source.cc:124
msgid "Missing parameter property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:132
+#: midi_source.cc:131
msgid "Missing style property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:144
+#: midi_source.cc:143
msgid "Missing parameter property on AutomationState"
msgstr ""
-#: midi_source.cc:151
+#: midi_source.cc:150
msgid "Missing state property on AutomationState"
msgstr ""
@@ -1115,21 +1131,21 @@ msgstr ""
msgid "solo control"
msgstr ""
-#: mtc_slave.cc:238
+#: mtc_slave.cc:240
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr ""
-#: mtc_slave.cc:361
+#: mtc_slave.cc:362
msgid ""
"Unknown rate/drop value %1 in incoming MTC stream, session values used "
"instead"
msgstr ""
-#: mtc_slave.cc:381
+#: mtc_slave.cc:382
msgid "Session framerate adjusted from %1 TO: MTC's %2."
msgstr ""
-#: mtc_slave.cc:395
+#: mtc_slave.cc:396
msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
msgstr ""
@@ -1189,31 +1205,35 @@ msgstr ""
msgid "Pannable given XML data for %1 - ignored"
msgstr ""
-#: panner_manager.cc:76
-msgid "looking for panners in %1"
+#: panner_manager.cc:80
+msgid "looking for panners in %1\n"
msgstr ""
-#: panner_manager.cc:100
-msgid "Panner discovered: \"%1\" in %2"
+#: panner_manager.cc:108
+msgid "Panner discovered: \"%1\" in %2\n"
msgstr ""
-#: panner_manager.cc:117
+#: panner_manager.cc:125
msgid "PannerManager: cannot load module \"%1\" (%2)"
msgstr ""
-#: panner_manager.cc:124
+#: panner_manager.cc:132
msgid "PannerManager: module \"%1\" has no descriptor function."
msgstr ""
-#: panner_manager.cc:187
+#: panner_manager.cc:219
msgid "no panner discovered for in/out = %1/%2"
msgstr ""
-#: panner_shell.cc:179
+#: panner_shell.cc:126
+msgid "select panner: %1\n"
+msgstr ""
+
+#: panner_shell.cc:245
msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
msgstr ""
-#: panner_shell.cc:185
+#: panner_shell.cc:251
msgid "panner plugin node has no type information!"
msgstr ""
@@ -1233,19 +1253,19 @@ msgstr ""
msgid "Could not construct playlist for PlaylistSource from session data!"
msgstr ""
-#: plugin.cc:324
+#: plugin.cc:328
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin.cc:398
+#: plugin.cc:402
msgid ""
"Saving plugin settings is not supported in this build of %1. Consider paying "
"for the full version"
msgstr ""
-#: plugin_insert.cc:598
+#: plugin_insert.cc:589
msgid "programming error: "
msgstr ""
@@ -1279,43 +1299,43 @@ msgstr ""
msgid "PluginInsert: automatable control %1 not found - ignored"
msgstr ""
-#: plugin_manager.cc:161
+#: plugin_manager.cc:165
msgid "Discovering Plugins"
msgstr ""
-#: plugin_manager.cc:335
+#: plugin_manager.cc:286
msgid "Could not parse rdf file: %1"
msgstr ""
-#: plugin_manager.cc:374
+#: plugin_manager.cc:330
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr ""
-#: plugin_manager.cc:381
+#: plugin_manager.cc:337
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr ""
-#: plugin_manager.cc:602
+#: plugin_manager.cc:567
msgid ""
"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
"at this time"
msgstr ""
-#: plugin_manager.cc:709
+#: plugin_manager.cc:680
msgid ""
"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
"in %2 at this time"
msgstr ""
-#: plugin_manager.cc:870
+#: plugin_manager.cc:841
msgid "unknown plugin status type \"%1\" - all entries ignored"
msgstr ""
-#: plugin_manager.cc:887
+#: plugin_manager.cc:858
msgid "unknown plugin type \"%1\" - ignored"
msgstr ""
-#: port.cc:410
+#: port.cc:412
msgid "could not reregister %1"
msgstr "nie można było zarejestrować %1"
@@ -1323,11 +1343,11 @@ msgstr "nie można było zarejestrować %1"
msgid "insert %1"
msgstr ""
-#: port_insert.cc:198
+#: port_insert.cc:197
msgid "XML node describing port insert is missing the `type' field"
msgstr ""
-#: port_insert.cc:203
+#: port_insert.cc:202
msgid "non-port insert XML used for port plugin insert"
msgstr ""
@@ -1359,11 +1379,11 @@ msgstr ""
msgid "Re-establising port %1 failed"
msgstr ""
-#: processor.cc:207
+#: processor.cc:208
msgid "No %1 property flag in element %2"
msgstr ""
-#: processor.cc:216
+#: processor.cc:217
msgid "No child node with active property"
msgstr ""
@@ -1427,11 +1447,11 @@ msgstr ""
msgid "cannot create new name for region \"%1\""
msgstr ""
-#: resampled_source.cc:98
+#: resampled_source.cc:102
msgid "Import: %1"
msgstr ""
-#: resampled_source.cc:128
+#: resampled_source.cc:132 srcfilesource.cc:76
msgid "Import: src_new() failed : %1"
msgstr ""
@@ -1439,27 +1459,27 @@ msgstr ""
msgid "return %1"
msgstr ""
-#: route.cc:1075 route.cc:2528
+#: route.cc:1081 route.cc:2541
msgid "unknown Processor type \"%1\"; ignored"
msgstr ""
-#: route.cc:1087
+#: route.cc:1093
msgid "processor could not be created. Ignored."
msgstr ""
-#: route.cc:1962 route.cc:2187
+#: route.cc:1975 route.cc:2200
msgid "Bad node sent to Route::set_state() [%1]"
msgstr ""
-#: route.cc:2022
+#: route.cc:2035
msgid "Pannable state found for route (%1) without a panner!"
msgstr ""
-#: route.cc:2096 route.cc:2100 route.cc:2301 route.cc:2305
+#: route.cc:2109 route.cc:2113 route.cc:2314 route.cc:2318
msgid "badly formed order key string in state file! [%1] ... ignored."
msgstr ""
-#: route.cc:2311
+#: route.cc:2324
msgid "Converting deprecated order key for %1 using Editor order %2"
msgstr ""
@@ -1475,15 +1495,15 @@ msgstr ""
msgid "error writing tempo-adjusted data to %1"
msgstr ""
-#: send.cc:59
+#: send.cc:60
msgid "aux %1"
msgstr ""
-#: send.cc:63
+#: send.cc:64
msgid "send %1"
msgstr ""
-#: send.cc:65
+#: send.cc:66
msgid "programming error: send created using role %1"
msgstr ""
@@ -1507,147 +1527,147 @@ msgstr ""
msgid "Set up standard connections"
msgstr ""
-#: session.cc:635
+#: session.cc:638
msgid "could not setup Click I/O"
msgstr "nie można było ustawić I/O metronomu"
-#: session.cc:683
+#: session.cc:686
#, c-format
msgid "out %<PRIu32>"
msgstr "wyjście %<PRIu32>"
-#: session.cc:697
+#: session.cc:700
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr "wyjście %<PRIu32>+%<PRIu32>"
-#: session.cc:712
+#: session.cc:715
#, c-format
msgid "in %<PRIu32>"
msgstr "wejście %<PRIu32>"
-#: session.cc:726
+#: session.cc:729
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr "wejście %<PRIu32>+%<PRIu32>"
-#: session.cc:790
+#: session.cc:793
msgid "cannot connect master output %1 to %2"
msgstr ""
-#: session.cc:849
+#: session.cc:862
msgid "monitor"
msgstr "monitor"
-#: session.cc:894
+#: session.cc:907
msgid "cannot connect control input %1 to %2"
msgstr ""
-#: session.cc:914
+#: session.cc:927
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr ""
-#: session.cc:945
+#: session.cc:958
msgid "cannot connect control output %1 to %2"
msgstr ""
-#: session.cc:1009
+#: session.cc:1026
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr ""
-#: session.cc:1193
+#: session.cc:1210
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
-#: session.cc:1233
+#: session.cc:1250
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
msgstr ""
-#: session.cc:1547
+#: session.cc:1564
msgid "feedback loop setup between %1 and %2"
msgstr ""
-#: session.cc:1843
+#: session.cc:1860
msgid "Session: could not create new midi track."
msgstr ""
-#: session.cc:1849
+#: session.cc:1866
msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks."
msgstr ""
-#: session.cc:2026 session.cc:2029
+#: session.cc:2043 session.cc:2046
msgid "Audio"
msgstr ""
-#: session.cc:2053 session.cc:2061 session.cc:2138 session.cc:2146
+#: session.cc:2070 session.cc:2078 session.cc:2155 session.cc:2163
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr ""
-#: session.cc:2084
+#: session.cc:2101
msgid "Session: could not create new audio track."
msgstr ""
-#: session.cc:2116 session.cc:2119
+#: session.cc:2133 session.cc:2136
msgid "Bus"
msgstr ""
-#: session.cc:2169
+#: session.cc:2186
msgid "Session: could not create new audio route."
msgstr ""
-#: session.cc:2228 session.cc:2238
+#: session.cc:2245 session.cc:2255
msgid "Session: UINT_MAX routes? impossible!"
msgstr ""
-#: session.cc:2260
+#: session.cc:2277
msgid "Session: cannot create track/bus from template description"
msgstr ""
-#: session.cc:2286
+#: session.cc:2303
msgid "Session: could not create new route from template"
msgstr ""
-#: session.cc:2315
+#: session.cc:2332
msgid "Adding new tracks/busses failed"
msgstr ""
-#: session.cc:3419
+#: session.cc:3436
msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename"
msgstr ""
-#: session.cc:3539 session.cc:3597
+#: session.cc:3556 session.cc:3614
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr ""
-#: session.cc:3987
+#: session.cc:4004
msgid "send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:3999
+#: session.cc:4016
msgid "aux send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4011
+#: session.cc:4028
msgid "return ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4023
+#: session.cc:4040
msgid "insert ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4150
+#: session.cc:4167
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr ""
-#: session.cc:4179
+#: session.cc:4196
msgid "too many bounced versions of playlist \"%1\""
msgstr ""
-#: session.cc:4189
+#: session.cc:4206
msgid "cannot create new audio file \"%1\" for %2"
msgstr ""
@@ -1682,7 +1702,7 @@ msgstr ""
msgid "Session subdirectory does not exist at path %1"
msgstr ""
-#: session_events.cc:184
+#: session_events.cc:185
msgid "Session: cannot have two events of type %1 at the same frame (%2)."
msgstr ""
@@ -1694,13 +1714,13 @@ msgstr ""
msgid "Export ended unexpectedly: %1"
msgstr ""
-#: session_ltc.cc:222
+#: session_ltc.cc:221
msgid ""
"LTC encoder: invalid framerate - LTC encoding is disabled for the remainder "
"of this session."
msgstr ""
-#: session_midi.cc:520
+#: session_midi.cc:519
msgid "Session: cannot send quarter-frame MTC message (%1)"
msgstr ""
@@ -1712,350 +1732,342 @@ msgstr ""
msgid "Session: error in no roll for %1"
msgstr ""
-#: session_process.cc:1157
+#: session_process.cc:1159
msgid "Programming error: illegal event type in process_event (%1)"
msgstr ""
-#: session_state.cc:140
-msgid "Could not use path %1 (%2)"
-msgstr ""
-
-#: session_state.cc:184
+#: session_state.cc:178
msgid "solo cut control (dB)"
msgstr ""
-#: session_state.cc:208
+#: session_state.cc:202
msgid "Set block size and sample rate"
msgstr ""
-#: session_state.cc:213
+#: session_state.cc:207
msgid "Using configuration"
msgstr ""
-#: session_state.cc:325
+#: session_state.cc:319
msgid "Reset Remote Controls"
msgstr ""
-#: session_state.cc:417
+#: session_state.cc:411
msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:424
+#: session_state.cc:418
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr ""
-#: session_state.cc:431
+#: session_state.cc:425
msgid "Session: cannot create session midi dir \"%1\" (%2)"
msgstr ""
-#: session_state.cc:438
+#: session_state.cc:432
msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:445
+#: session_state.cc:439
msgid "Session: cannot create session export folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:452
+#: session_state.cc:446
msgid "Session: cannot create session analysis folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:459
+#: session_state.cc:453
msgid "Session: cannot create session plugins folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:466
+#: session_state.cc:460
msgid "Session: cannot create session externals folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:480
+#: session_state.cc:474
msgid "Session: cannot create session folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:514
+#: session_state.cc:508
msgid "Could not open %1 for writing session template"
msgstr ""
-#: session_state.cc:520
+#: session_state.cc:514
msgid "Could not open session template %1 for reading"
msgstr ""
-#: session_state.cc:539
+#: session_state.cc:533
msgid "master"
msgstr "główna"
-#: session_state.cc:600
+#: session_state.cc:594
msgid "Could not remove pending capture state at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:624
+#: session_state.cc:618
msgid "could not rename snapshot %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:652
+#: session_state.cc:646
msgid "Could not remove session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:669
+#: session_state.cc:663
msgid ""
"the %1 audio engine is not connected and state saving would lose all I/O "
"connections. Session not saved"
msgstr ""
-#: session_state.cc:720
+#: session_state.cc:714
msgid "state could not be saved to %1"
msgstr ""
-#: session_state.cc:722 session_state.cc:733
+#: session_state.cc:716 session_state.cc:727
msgid "Could not remove temporary session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:730
-msgid "could not rename temporary session file %1 to %2"
+#: session_state.cc:724
+msgid "could not rename temporary session file %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:798
+#: session_state.cc:792
msgid "%1: session file \"%2\" doesn't exist!"
msgstr ""
-#: session_state.cc:810
+#: session_state.cc:804
msgid "Could not understand session file %1"
msgstr ""
-#: session_state.cc:819
+#: session_state.cc:813
msgid "Session file %1 is not a session"
msgstr ""
-#: session_state.cc:1125
+#: session_state.cc:1119
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
-#: session_state.cc:1179
+#: session_state.cc:1173
msgid "Session: XML state has no options section"
msgstr ""
-#: session_state.cc:1184
+#: session_state.cc:1178
msgid "Session: XML state has no metadata section"
msgstr ""
-#: session_state.cc:1195
+#: session_state.cc:1189
msgid "Session: XML state has no sources section"
msgstr ""
-#: session_state.cc:1202
+#: session_state.cc:1196
msgid "Session: XML state has no Tempo Map section"
msgstr ""
-#: session_state.cc:1209
+#: session_state.cc:1203
msgid "Session: XML state has no locations section"
msgstr ""
-#: session_state.cc:1235
+#: session_state.cc:1229
msgid "Session: XML state has no Regions section"
msgstr ""
-#: session_state.cc:1242
+#: session_state.cc:1236
msgid "Session: XML state has no playlists section"
msgstr ""
-#: session_state.cc:1262
+#: session_state.cc:1256
msgid "Session: XML state has no bundles section"
msgstr ""
-#: session_state.cc:1274
+#: session_state.cc:1268
msgid "Session: XML state has no diskstreams section"
msgstr ""
-#: session_state.cc:1282
+#: session_state.cc:1276
msgid "Session: XML state has no routes section"
msgstr ""
-#: session_state.cc:1294
+#: session_state.cc:1288
msgid "Session: XML state has no route groups section"
msgstr ""
-#: session_state.cc:1303
+#: session_state.cc:1297
msgid "Session: XML state has no edit groups section"
msgstr ""
-#: session_state.cc:1310
+#: session_state.cc:1304
msgid "Session: XML state has no mix groups section"
msgstr ""
-#: session_state.cc:1318
+#: session_state.cc:1312
msgid "Session: XML state has no click section"
msgstr ""
-#: session_state.cc:1360
+#: session_state.cc:1354
msgid "Session: cannot create Route from XML description."
msgstr ""
-#: session_state.cc:1364
+#: session_state.cc:1358
msgid "Loaded track/bus %1"
msgstr ""
-#: session_state.cc:1462
+#: session_state.cc:1456
msgid "Could not find diskstream for route"
msgstr ""
-#: session_state.cc:1516
+#: session_state.cc:1510
msgid "Session: cannot create Region from XML description."
msgstr ""
-#: session_state.cc:1520
+#: session_state.cc:1514
msgid "Can not load state for region '%1'"
msgstr ""
-#: session_state.cc:1556
+#: session_state.cc:1550
msgid "Regions in compound description not found (ID's %1 and %2): ignored"
msgstr ""
-#: session_state.cc:1584
+#: session_state.cc:1578
msgid "Nested source has no ID info in session file! (ignored)"
msgstr ""
-#: session_state.cc:1596
+#: session_state.cc:1590
msgid "Cannot reconstruct nested source for region %1"
msgstr ""
-#: session_state.cc:1658
+#: session_state.cc:1652
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707
+#: session_state.cc:1660 session_state.cc:1681 session_state.cc:1701
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713
+#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
msgstr ""
-#: session_state.cc:1736
+#: session_state.cc:1730
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
msgstr ""
-#: session_state.cc:1770
+#: session_state.cc:1764
msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1778
+#: session_state.cc:1772
msgid ""
"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1784
+#: session_state.cc:1778
msgid ""
"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
msgstr ""
-#: session_state.cc:1852
+#: session_state.cc:1846
msgid ""
"cannot create new file from region name \"%1\" with ident = \"%2\": too many "
"existing files with similar names"
msgstr ""
-#: session_state.cc:1875
+#: session_state.cc:1869
msgid "Session: cannot create Source from XML description."
msgstr ""
-#: session_state.cc:1909
+#: session_state.cc:1903
msgid "A sound file is missing. It will be replaced by silence."
msgstr ""
-#: session_state.cc:1932
+#: session_state.cc:1926
msgid "Found a sound file that cannot be used by %1. Talk to the progammers."
msgstr ""
-#: session_state.cc:1949
+#: session_state.cc:1943
msgid "Could not create templates directory \"%1\" (%2)"
msgstr ""
-#: session_state.cc:1962
+#: session_state.cc:1956
msgid "Template \"%1\" already exists - new version not created"
msgstr ""
-#: session_state.cc:1968
+#: session_state.cc:1962
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr ""
-#: session_state.cc:1978
+#: session_state.cc:1972
msgid "template not saved"
msgstr ""
-#: session_state.cc:1988
+#: session_state.cc:1982
msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
msgstr ""
-#: session_state.cc:2183
+#: session_state.cc:2225
msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr ""
-#: session_state.cc:2725 session_state.cc:2731
-msgid "Cannot expand path %1 (%2)"
-msgstr ""
-
-#: session_state.cc:2784
+#: session_state.cc:2820
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:2823
+#: session_state.cc:2859
msgid "cannot rename unused file source from %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:2841
+#: session_state.cc:2877
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr ""
-#: session_state.cc:3143
+#: session_state.cc:3179
msgid "could not backup old history file, current history not saved"
msgstr ""
-#: session_state.cc:3156
+#: session_state.cc:3192
msgid "history could not be saved to %1"
msgstr ""
-#: session_state.cc:3159
+#: session_state.cc:3195
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:3163
+#: session_state.cc:3199
msgid "could not restore history file from backup %1 (%2)"
msgstr ""
-#: session_state.cc:3188
+#: session_state.cc:3224
msgid "%1: no history file \"%2\" for this session."
msgstr ""
-#: session_state.cc:3194
+#: session_state.cc:3230
msgid "Could not understand session history file \"%1\""
msgstr ""
-#: session_state.cc:3236
+#: session_state.cc:3272
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr ""
-#: session_state.cc:3247
+#: session_state.cc:3283
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr ""
-#: session_state.cc:3258
+#: session_state.cc:3294
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr ""
-#: session_state.cc:3266
+#: session_state.cc:3302
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr ""
-#: session_state.cc:3502
+#: session_state.cc:3538
msgid "Session: unknown diskstream type in XML"
msgstr ""
-#: session_state.cc:3507
+#: session_state.cc:3543
msgid "Session: could not load diskstream via XML state"
msgstr ""
@@ -2079,198 +2091,206 @@ msgid ""
"control"
msgstr ""
-#: smf_source.cc:252
+#: smf_source.cc:262
msgid "Unable to read event prefix, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:265
+#: smf_source.cc:275
msgid "Event has time and size but no body, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:271
+#: smf_source.cc:281
msgid "Event time is before MIDI source position"
msgstr ""
-#: smf_source.cc:306 smf_source.cc:345
+#: smf_source.cc:316 smf_source.cc:355
msgid "Skipping event with unordered time %1"
msgstr ""
-#: smf_source.cc:410
+#: smf_source.cc:420
msgid "cannot open MIDI file %1 for write"
msgstr ""
-#: sndfile_helpers.cc:32
+#: sndfile_helpers.cc:34
msgid "WAV"
msgstr "WAV"
-#: sndfile_helpers.cc:33
+#: sndfile_helpers.cc:35
msgid "AIFF"
msgstr "AIFF"
-#: sndfile_helpers.cc:34
+#: sndfile_helpers.cc:36
msgid "CAF"
msgstr "CAF"
-#: sndfile_helpers.cc:35
+#: sndfile_helpers.cc:37
msgid "W64 (64 bit WAV)"
msgstr "W64 (64 bit WAV)"
-#: sndfile_helpers.cc:36
+#: sndfile_helpers.cc:38
msgid "FLAC"
msgstr ""
-#: sndfile_helpers.cc:37
+#: sndfile_helpers.cc:39
msgid "Ogg/Vorbis"
msgstr ""
-#: sndfile_helpers.cc:38
+#: sndfile_helpers.cc:40
msgid "raw (no header)"
msgstr "raw (brak nagłówka)"
-#: sndfile_helpers.cc:43
+#: sndfile_helpers.cc:45
msgid ".wav"
msgstr ".wav"
-#: sndfile_helpers.cc:44
+#: sndfile_helpers.cc:46
msgid ".aiff"
msgstr ".aiff"
-#: sndfile_helpers.cc:45
+#: sndfile_helpers.cc:47
msgid ".caf"
msgstr ".caf"
-#: sndfile_helpers.cc:46
+#: sndfile_helpers.cc:48
msgid ".w64"
msgstr ".w64"
-#: sndfile_helpers.cc:47
+#: sndfile_helpers.cc:49
msgid ".flac"
msgstr ""
-#: sndfile_helpers.cc:48
+#: sndfile_helpers.cc:50
msgid ".ogg"
msgstr ""
-#: sndfile_helpers.cc:49
+#: sndfile_helpers.cc:51
msgid ".raw"
msgstr ".raw"
-#: sndfile_helpers.cc:64
+#: sndfile_helpers.cc:66
msgid "Signed 16 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:65
+#: sndfile_helpers.cc:67
msgid "Signed 24 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:66
+#: sndfile_helpers.cc:68
msgid "Signed 32 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:67
+#: sndfile_helpers.cc:69
msgid "Signed 8 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:68
+#: sndfile_helpers.cc:70
msgid "32 bit float"
msgstr ""
-#: sndfile_helpers.cc:81
+#: sndfile_helpers.cc:83
msgid "Little-endian (Intel)"
msgstr "Little-endian (Intel)"
-#: sndfile_helpers.cc:82
+#: sndfile_helpers.cc:84
msgid "Big-endian (PowerPC)"
msgstr ""
-#: sndfilesource.cc:201
+#: sndfilesource.cc:210
msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
msgstr ""
-#: sndfilesource.cc:209
+#: sndfilesource.cc:218
msgid ""
"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
"number"
msgstr ""
-#: sndfilesource.cc:255 sndfilesource.cc:571 sndfilesource.cc:595
+#: sndfilesource.cc:264 sndfilesource.cc:604 sndfilesource.cc:628
msgid ""
"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
"for this file"
msgstr ""
-#: sndfilesource.cc:302
+#: sndfilesource.cc:311
msgid "could not allocate file %1 for reading."
msgstr ""
-#: sndfilesource.cc:337
+#: sndfilesource.cc:346
msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
msgstr ""
-#: sndfilesource.cc:347
+#: sndfilesource.cc:356
msgid ""
"SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
msgstr ""
-#: sndfilesource.cc:391 sndfilesource.cc:420
+#: sndfilesource.cc:400 sndfilesource.cc:429
msgid "attempt to write a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:396 utils.cc:510 utils.cc:534 utils.cc:548 utils.cc:567
+#: sndfilesource.cc:405 utils.cc:547 utils.cc:571 utils.cc:585 utils.cc:604
msgid "programming error: %1 %2"
msgstr ""
-#: sndfilesource.cc:523
+#: sndfilesource.cc:532 sndfilesource.cc:562
msgid "attempt to flush a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:528
+#: sndfilesource.cc:537 sndfilesource.cc:557
msgid "attempt to flush an un-opened audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:534
+#: sndfilesource.cc:543
msgid "could not allocate file %1 to write header"
msgstr ""
-#: sndfilesource.cc:548
+#: sndfilesource.cc:568
+msgid "could not allocate file %1 to flush contents"
+msgstr ""
+
+#: sndfilesource.cc:581
msgid ""
"attempt to store broadcast info in a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:553
+#: sndfilesource.cc:586
msgid "attempt to set BWF info for an un-opened audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:614
+#: sndfilesource.cc:647
msgid "%1: cannot seek to %2 (libsndfile error: %3)"
msgstr ""
-#: sndfilesource.cc:727
+#: sndfilesource.cc:760
msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
msgstr ""
-#: sndfilesource.cc:740 sndfilesource.cc:790 sndfilesource.cc:797
+#: sndfilesource.cc:773 sndfilesource.cc:823 sndfilesource.cc:830
msgid "SndFileSource: \"%1\" bad write (%2)"
msgstr ""
-#: sndfilesource.cc:820
+#: sndfilesource.cc:853
msgid ""
"Filesource: start time is already set for existing file (%1): Cannot change "
"start time."
msgstr ""
-#: speakers.cc:239
+#: speakers.cc:280
msgid "Speaker information is missing azimuth - speaker ignored"
msgstr ""
-#: speakers.cc:245
+#: speakers.cc:286
msgid "Speaker information is missing elevation - speaker ignored"
msgstr ""
-#: speakers.cc:251
+#: speakers.cc:292
msgid "Speaker information is missing distance - speaker ignored"
msgstr ""
+#: srcfilesource.cc:135
+msgid "SrcFileSource: %1"
+msgstr ""
+
#: tape_file_matcher.cc:46
msgid "Cannot compile tape track regexp for use (%1)"
msgstr ""
@@ -2418,54 +2438,54 @@ msgstr ""
msgid "Node for Port has no \"name\" property"
msgstr ""
-#: utils.cc:358 utils.cc:382
+#: utils.cc:395 utils.cc:419
msgid "Splice"
msgstr ""
-#: utils.cc:360 utils.cc:375
+#: utils.cc:397 utils.cc:412
msgid "Slide"
msgstr ""
-#: utils.cc:362 utils.cc:378
+#: utils.cc:399 utils.cc:415
msgid "Lock"
msgstr ""
-#: utils.cc:365
+#: utils.cc:402
msgid "programming error: unknown edit mode string \"%1\""
msgstr ""
-#: utils.cc:389 utils.cc:421
+#: utils.cc:426 utils.cc:458
msgid "MIDI Timecode"
msgstr ""
-#: utils.cc:389 utils.cc:419
+#: utils.cc:426 utils.cc:456
msgid "MTC"
msgstr "MTC"
-#: utils.cc:393 utils.cc:428
+#: utils.cc:430 utils.cc:465
msgid "MIDI Clock"
msgstr ""
-#: utils.cc:397 utils.cc:415 utils.cc:435
+#: utils.cc:434 utils.cc:452 utils.cc:472
msgid "JACK"
msgstr "JACK"
-#: utils.cc:401
+#: utils.cc:438
msgid "programming error: unknown sync source string \"%1\""
msgstr ""
-#: utils.cc:426
+#: utils.cc:463
msgid "M-Clock"
msgstr ""
-#: utils.cc:432
+#: utils.cc:469
msgid "LTC"
msgstr ""
-#: utils.cc:602
+#: utils.cc:639
msgid "programming error: unknown native header format: %1"
msgstr ""
-#: utils.cc:617
+#: utils.cc:654
msgid "cannot open directory %1 (%2)"
msgstr ""
diff --git a/libs/ardour/po/ru.po b/libs/ardour/po/ru.po
index fca85fb393..ba0743d83a 100644
--- a/libs/ardour/po/ru.po
+++ b/libs/ardour/po/ru.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: libardour 3\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-01-19 22:43+0400\n"
+"POT-Creation-Date: 2014-02-10 17:53+0100\n"
"PO-Revision-Date: 2014-01-19 22:42+0300\n"
"Last-Translator: ÐлекÑандр Прокудин <alexandre.prokoudine@gmail.com>\n"
"Language-Team: \n"
@@ -24,64 +24,64 @@ msgstr ""
msgid "Fader"
msgstr "Фейдер"
-#: audio_diskstream.cc:244
+#: audio_diskstream.cc:242
msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
msgstr ""
-#: audio_diskstream.cc:296
+#: audio_diskstream.cc:294
msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
-#: audio_diskstream.cc:848 audio_diskstream.cc:858
+#: audio_diskstream.cc:846 audio_diskstream.cc:856
msgid ""
"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
msgstr ""
-#: audio_diskstream.cc:1014
+#: audio_diskstream.cc:1012
msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-#: audio_diskstream.cc:1383 audio_diskstream.cc:1400
+#: audio_diskstream.cc:1381 audio_diskstream.cc:1398
msgid "AudioDiskstream %1: cannot write to disk"
msgstr ""
-#: audio_diskstream.cc:1443
+#: audio_diskstream.cc:1441
msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: audio_diskstream.cc:1537
+#: audio_diskstream.cc:1535
msgid "%1: could not create region for complete audio file"
msgstr ""
-#: audio_diskstream.cc:1571
+#: audio_diskstream.cc:1569
msgid "AudioDiskstream: could not create region for captured audio!"
msgstr ""
-#: audio_diskstream.cc:1679
+#: audio_diskstream.cc:1677
msgid "programmer error: %1"
msgstr ""
-#: audio_diskstream.cc:1905
+#: audio_diskstream.cc:1903
msgid "AudioDiskstream: channel %1 out of range"
msgstr ""
-#: audio_diskstream.cc:1919 midi_diskstream.cc:1210
+#: audio_diskstream.cc:1917 midi_diskstream.cc:1209
msgid "%1:%2 new capture file not initialized correctly"
msgstr ""
-#: audio_diskstream.cc:2200
+#: audio_diskstream.cc:2198
msgid "%1: cannot restore pending capture source file %2"
msgstr ""
-#: audio_diskstream.cc:2222
+#: audio_diskstream.cc:2220
msgid "%1: incorrect number of pending sources listed - ignoring them all"
msgstr ""
-#: audio_diskstream.cc:2246
+#: audio_diskstream.cc:2244
msgid "%1: cannot create whole-file region from pending capture sources"
msgstr ""
-#: audio_library.cc:71
+#: audio_library.cc:81
msgid "Could not open %1. Audio Library not saved"
msgstr ""
@@ -121,11 +121,11 @@ msgstr ""
msgid "Audio Playlists (unused)"
msgstr ""
-#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529
+#: audio_playlist_source.cc:171 audiosource.cc:891 file_source.cc:520
#: midi_playlist_source.cc:144 midi_playlist_source.cc:152
-#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:642
-#: rb_effect.cc:333 session.cc:2633 session.cc:2666 session.cc:3811
-#: session_handle.cc:87 sndfilesource.cc:121
+#: midi_playlist_source.cc:159 midi_source.cc:370 plugin_insert.cc:634
+#: rb_effect.cc:333 session.cc:2636 session.cc:2669 session.cc:3814
+#: session_handle.cc:87 sndfilesource.cc:122
msgid "programming error: %1"
msgstr "programming error: %1"
@@ -153,23 +153,23 @@ msgstr ""
"\n"
"Каналов: "
-#: audio_track.cc:167
+#: audio_track.cc:161
msgid "Unknown bundle \"%1\" listed for input of %2"
msgstr ""
-#: audio_track.cc:169
+#: audio_track.cc:163
msgid "in 1"
msgstr ""
-#: audio_track.cc:170
+#: audio_track.cc:164
msgid "No input bundles available as a replacement"
msgstr ""
-#: audio_track.cc:174
+#: audio_track.cc:168
msgid "Bundle %1 was not available - \"in 1\" used instead"
msgstr ""
-#: audio_track.cc:183
+#: audio_track.cc:177
msgid "improper input channel list in XML node (%1)"
msgstr ""
@@ -193,23 +193,23 @@ msgstr "Ðе удалоÑÑŒ загрузить модуль VAMP под назв
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr "Ðе удалоÑÑŒ загрузить модуль VAMP под названием \"%1\""
-#: audioengine.cc:488
+#: audioengine.cc:495
msgid "looking for backends in %1\n"
msgstr ""
-#: audioengine.cc:511
+#: audioengine.cc:518
msgid "AudioEngine: cannot load module \"%1\" (%2)"
msgstr ""
-#: audioengine.cc:517
+#: audioengine.cc:524
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr ""
-#: audioengine.cc:589
+#: audioengine.cc:596
msgid "Could not create backend for %1: %2"
msgstr "Ðе удалоÑÑŒ Ñоздать движок Ð´Ð»Ñ %1: %2"
-#: audioregion.cc:1643
+#: audioregion.cc:1651
msgid ""
"You have requested an operation that requires audio analysis.\n"
"\n"
@@ -224,11 +224,11 @@ msgid ""
"this and future transient-detection operations.\n"
msgstr ""
-#: audiosource.cc:199
+#: audiosource.cc:210
msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
msgstr "cannot rename peakfile for %1 from %2 to %3 (%4)"
-#: audiosource.cc:226
+#: audiosource.cc:239
msgid "AudioSource: cannot stat peakfile \"%1\""
msgstr "AudioSource: cannot stat peakfile \"%1\""
@@ -236,48 +236,69 @@ msgstr "AudioSource: cannot stat peakfile \"%1\""
msgid "cannot read sample data for unscaled peak computation"
msgstr "cannot read sample data for unscaled peak computation"
-#: audiosource.cc:387
+#: audiosource.cc:386
msgid "AudioSource: cannot open peakpath (a) \"%1\" (%2)"
msgstr "AudioSource: cannot open peakpath (a) \"%1\" (%2)"
-#: audiosource.cc:463
+#: audiosource.cc:395 audiosource.cc:473
+msgid ""
+"AudioSource: could not seek to correct location in peak file \"%1\" (%2)"
+msgstr ""
+
+#: audiosource.cc:453
msgid "AudioSource: cannot open peakpath (b) \"%1\" (%2)"
msgstr "AudioSource: cannot open peakpath (b) \"%1\" (%2)"
-#: audiosource.cc:587
+#: audiosource.cc:567
msgid ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
msgstr ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
-#: audiosource.cc:667
+#: audiosource.cc:634
msgid "%1: could not write read raw data for peak computation (%2)"
msgstr "%1: could not write read raw data for peak computation (%2)"
-#: audiosource.cc:706
+#: audiosource.cc:672
msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
msgstr "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
-#: audiosource.cc:773 audiosource.cc:886
+#: audiosource.cc:739 audiosource.cc:861
+msgid "%1: could not seek in peak file data (%2)"
+msgstr ""
+
+#: audiosource.cc:744 audiosource.cc:870
msgid "%1: could not write peak file data (%2)"
msgstr "%1: could not write peak file data (%2)"
-#: audiosource.cc:924
+#: audiosource.cc:903
msgid "could not truncate peakfile %1 to %2 (error: %3)"
msgstr "could not truncate peakfile %1 to %2 (error: %3)"
-#: auditioner.cc:112
-msgid "no outputs available for auditioner - manual connection required"
+#: auditioner.cc:95
+msgid "Falling back to Reasonable Synth for Midi Audition"
msgstr ""
-#: auditioner.cc:174
-msgid "Auditioning of non-audio regions not yet supported"
+#: auditioner.cc:97
+msgid "No synth for midi-audition found."
msgstr ""
-#: auditioner.cc:199
+#: auditioner.cc:152
+msgid "no outputs available for auditioner - manual connection required"
+msgstr ""
+
+#: auditioner.cc:392 auditioner.cc:438
msgid "Cannot setup auditioner processing flow for %1 channels"
msgstr ""
+#: auditioner.cc:426
+msgid "Failed to load synth for MIDI-Audition."
+msgstr ""
+
+#: auditioner.cc:445
+msgid "Auditioning of regions other than Audio or Midi is not supported."
+msgstr ""
+
#: automatable.cc:81
msgid "Automation node has no path property"
msgstr ""
@@ -311,23 +332,23 @@ msgid ""
"AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
msgstr ""
-#: butler.cc:91
+#: butler.cc:80
msgid "Cannot create transport request signal pipe (%1)"
msgstr ""
-#: butler.cc:97 butler.cc:103
+#: butler.cc:86 butler.cc:92
msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)"
msgstr ""
-#: butler.cc:109
+#: butler.cc:124
msgid "Session: could not create butler thread"
msgstr ""
-#: butler.cc:156
+#: butler.cc:165
msgid "poll on butler request pipe failed (%1)"
msgstr ""
-#: butler.cc:163
+#: butler.cc:172
msgid "Error on butler thread request pipe: fd=%1 err=%2"
msgstr ""
@@ -335,55 +356,55 @@ msgstr ""
msgid "Error reading from butler request pipe"
msgstr ""
-#: butler.cc:256
+#: butler.cc:301
msgid "Butler read ahead failure on dstream %1"
msgstr ""
-#: butler.cc:293
+#: butler.cc:338
msgid "Butler write-behind failure on dstream %1"
msgstr ""
-#: control_protocol_manager.cc:162
+#: control_protocol_manager.cc:164
msgid "control protocol name \"%1\" has no descriptor"
msgstr ""
-#: control_protocol_manager.cc:169
+#: control_protocol_manager.cc:171
msgid "control protocol name \"%1\" could not be initialized"
msgstr ""
-#: control_protocol_manager.cc:233
+#: control_protocol_manager.cc:237
msgid "Instantiating mandatory control protocol %1"
msgstr ""
-#: control_protocol_manager.cc:254
+#: control_protocol_manager.cc:258
msgid "looking for control protocols in %1\n"
msgstr ""
-#: control_protocol_manager.cc:279
+#: control_protocol_manager.cc:283
msgid "Control protocol %1 not usable"
msgstr ""
-#: control_protocol_manager.cc:296
+#: control_protocol_manager.cc:300
msgid "Control surface protocol discovered: \"%1\"\n"
msgstr ""
-#: control_protocol_manager.cc:314
+#: control_protocol_manager.cc:318
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
msgstr "ControlProtocolManager: cannot load module \"%1\" (%2)"
-#: control_protocol_manager.cc:322
+#: control_protocol_manager.cc:324
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr ""
-#: cycle_timer.cc:38
+#: cycle_timer.cc:40
msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
msgstr ""
-#: cycle_timer.cc:50
+#: cycle_timer.cc:52
msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo"
msgstr ""
-#: cycle_timer.cc:73
+#: cycle_timer.cc:75
msgid "cannot locate cpu MHz in /proc/cpuinfo"
msgstr ""
@@ -391,7 +412,7 @@ msgstr ""
msgid "audio"
msgstr ""
-#: data_type.cc:28 session.cc:1805 session.cc:1808
+#: data_type.cc:28 session.cc:1808 session.cc:1811
msgid "MIDI"
msgstr ""
@@ -407,7 +428,7 @@ msgstr ""
msgid "listen"
msgstr ""
-#: diskstream.cc:303
+#: diskstream.cc:302
msgid "Location \"%1\" not valid for track loop (start >= end)"
msgstr ""
@@ -419,23 +440,23 @@ msgstr ""
msgid "Export failed: %1"
msgstr ""
-#: export_filename.cc:118
+#: export_filename.cc:119
msgid "Existing export folder for this session (%1) does not exist - ignored"
msgstr ""
-#: export_filename.cc:229
+#: export_filename.cc:230
msgid "No Time"
msgstr "Без времени"
-#: export_filename.cc:238
+#: export_filename.cc:239
msgid "Invalid time format"
msgstr "Ðекорректный формат времени"
-#: export_filename.cc:247
+#: export_filename.cc:248
msgid "No Date"
msgstr "Без даты"
-#: export_filename.cc:262
+#: export_filename.cc:263
msgid "Invalid date format"
msgstr "Ðекорректный формат даты"
@@ -503,7 +524,7 @@ msgstr "Треугольное"
msgid "Rectangular"
msgstr "ПрÑмоугольное"
-#: export_formats.cc:52 session.cc:5028 session.cc:5044
+#: export_formats.cc:52 session.cc:5006 session.cc:5022
msgid "None"
msgstr "Ðет"
@@ -543,15 +564,15 @@ msgstr "Формат ÑÑмплов Vorbis"
msgid "No sample format"
msgstr "Без формата ÑÑмплов"
-#: export_handler.cc:342
+#: export_handler.cc:343
msgid "Editor: cannot open \"%1\" as export file for CD marker file"
msgstr ""
-#: export_handler.cc:424 export_handler.cc:427
+#: export_handler.cc:425 export_handler.cc:428
msgid "an error occured while writing a TOC/CUE file: %1"
msgstr ""
-#: export_handler.cc:649 export_handler.cc:707
+#: export_handler.cc:650 export_handler.cc:708
msgid "Cannot convert %1 to Latin-1 text"
msgstr ""
@@ -613,7 +634,7 @@ msgid ""
"configuration"
msgstr ""
-#: file_source.cc:198 session_state.cc:2807
+#: file_source.cc:198 session_state.cc:2843
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr ""
@@ -622,35 +643,35 @@ msgstr ""
msgid "cannot rename file source from %1 to %2 (%3)"
msgstr ""
-#: file_source.cc:250 file_source.cc:378
+#: file_source.cc:248 file_source.cc:372
msgid "FileSource: search path not set"
msgstr ""
-#: file_source.cc:313 file_source.cc:448
-msgid "Filesource: cannot find required file (%1): while searching %2"
+#: file_source.cc:309 file_source.cc:439
+msgid "Filesource: cannot find required file (%1)"
msgstr ""
-#: file_source.cc:440
+#: file_source.cc:432
msgid ""
-"FileSource: \"%1\" is ambigous when searching %2\n"
+"FileSource: \"%1\" is ambigous when searching\n"
"\t"
msgstr ""
-#: file_source.cc:494
+#: file_source.cc:484
msgid "Filesource: cannot find required file (%1): %2"
msgstr ""
-#: file_source.cc:501
+#: file_source.cc:492
msgid "Filesource: cannot check for existing file (%1): %2"
msgstr ""
-#: file_source.cc:535
+#: file_source.cc:526
msgid ""
"Programming error! %1 tried to rename a file over another file! It's safe to "
"continue working, but please report this to the developers."
msgstr ""
-#: file_source.cc:540
+#: file_source.cc:531
msgid "cannot rename file %1 to %2 (%3)"
msgstr ""
@@ -664,15 +685,15 @@ msgid ""
"cannot run"
msgstr ""
-#: filesystem_paths.cc:91
+#: filesystem_paths.cc:96
msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
msgstr ""
-#: filesystem_paths.cc:107
+#: filesystem_paths.cc:125
msgid "ARDOUR_CONFIG_PATH not set in environment - exiting\n"
msgstr ""
-#: filesystem_paths.cc:127
+#: filesystem_paths.cc:148
msgid "ARDOUR_DATA_PATH not set in environment - exiting\n"
msgstr ""
@@ -684,87 +705,83 @@ msgstr ""
msgid "filter: error creating new file %1 (%2)"
msgstr ""
-#: find_session.cc:51
-msgid "Could not resolve path: %1 (%2)"
-msgstr ""
-
-#: find_session.cc:63
+#: find_session.cc:59
msgid "cannot check session path %1 (%2)"
msgstr ""
-#: find_session.cc:89
+#: find_session.cc:85
msgid "cannot check statefile %1 (%2)"
msgstr ""
-#: find_session.cc:125
+#: find_session.cc:121
msgid "%1 is not a snapshot file"
msgstr ""
-#: find_session.cc:142
+#: find_session.cc:138
msgid "cannot determine current working directory (%1)"
msgstr ""
-#: find_session.cc:159
+#: find_session.cc:155
msgid "unknown file type for session %1"
msgstr ""
-#: globals.cc:207
+#: globals.cc:216
msgid "Could not set system open files limit to \"unlimited\""
msgstr ""
-#: globals.cc:209
+#: globals.cc:218
msgid "Could not set system open files limit to %1"
msgstr ""
-#: globals.cc:213
+#: globals.cc:222
msgid "Your system is configured to limit %1 to only %2 open files"
msgstr ""
-#: globals.cc:217
+#: globals.cc:226
msgid "Could not get system open files limit (%1)"
msgstr ""
-#: globals.cc:268
+#: globals.cc:280
msgid "Loading configuration"
msgstr ""
-#: import.cc:207
+#: import.cc:208
msgid "Could not find a source for %1 even though we are updating this file!"
msgstr ""
-#: import.cc:236
+#: import.cc:237
msgid "Unable to create file %1 during import"
msgstr ""
-#: import.cc:262
+#: import.cc:263
msgid "Resampling %1 from %2kHz to %3kHz"
msgstr "РеÑÑмплинг %1 из %2КГц в %3КГц"
-#: import.cc:268
+#: import.cc:269
msgid "Copying %1"
msgstr "КопируетÑÑ %1"
-#: import.cc:446
+#: import.cc:455
msgid "Track %1 of %2 contained no usable MIDI data"
msgstr ""
-#: import.cc:453
+#: import.cc:462
msgid "MIDI file %1 was not readable (no reason available)"
msgstr "MIDI-файл %1 нечитаем по неизвеÑтной причине"
-#: import.cc:499
+#: import.cc:508
msgid "Import: cannot open input sound file \"%1\""
msgstr ""
-#: import.cc:510
+#: import.cc:519
msgid "Import: error opening MIDI file"
msgstr ""
-#: import.cc:549
+#: import.cc:558
msgid "Loading MIDI file %1"
msgstr "ЗагружаетÑÑ MIDI-файл %1"
-#: import.cc:614
+#: import.cc:623
msgid "Failed to remove some files after failed/cancelled import operation"
msgstr ""
@@ -780,149 +797,149 @@ msgstr ""
msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
msgstr ""
-#: io.cc:208
+#: io.cc:209
msgid "IO: cannot disconnect port %1 from %2"
msgstr ""
-#: io.cc:343 io.cc:428
+#: io.cc:344 io.cc:431
msgid "IO: cannot register input port %1"
msgstr ""
-#: io.cc:348 io.cc:433
+#: io.cc:349 io.cc:436
msgid "IO: cannot register output port %1"
msgstr ""
-#: io.cc:591 io.cc:647
+#: io.cc:598 io.cc:654
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr ""
-#: io.cc:706
+#: io.cc:713
msgid "in"
msgstr ""
-#: io.cc:706
+#: io.cc:713
msgid "out"
msgstr ""
-#: io.cc:707
+#: io.cc:714
msgid "input"
msgstr ""
-#: io.cc:707
+#: io.cc:714
msgid "output"
msgstr ""
-#: io.cc:717
+#: io.cc:724
msgid "Unknown bundle \"%1\" listed for %2 of %3"
msgstr ""
-#: io.cc:783
+#: io.cc:790
msgid "Bundle %1 was not available - \"%2\" used instead"
msgstr ""
-#: io.cc:786
+#: io.cc:793
msgid "No %1 bundles available as a replacement"
msgstr ""
-#: io.cc:889
+#: io.cc:896
msgid "%1: cannot create I/O ports"
msgstr ""
-#: io.cc:1017 io.cc:1121
+#: io.cc:1024 io.cc:1128
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr ""
-#: io.cc:1022 io.cc:1126
+#: io.cc:1029 io.cc:1133
msgid "bad input string in XML node \"%1\""
msgstr ""
-#: io.cc:1060
+#: io.cc:1067
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr ""
-#: io.cc:1065
+#: io.cc:1072
msgid "IO: bad output string in XML node \"%1\""
msgstr ""
-#: io.cc:1411
+#: io.cc:1417
#, c-format
msgid "%s %u"
msgstr ""
-#: io.cc:1458
+#: io.cc:1464
#, c-format
msgid "%s in"
msgstr ""
-#: io.cc:1460
+#: io.cc:1466
#, c-format
msgid "%s out"
msgstr ""
-#: io.cc:1535 session.cc:686 session.cc:715
+#: io.cc:1541 session.cc:689 session.cc:718
msgid "mono"
msgstr ""
-#: io.cc:1537 session.cc:699 session.cc:729
+#: io.cc:1543 session.cc:702 session.cc:732
msgid "L"
msgstr ""
-#: io.cc:1537 session.cc:701 session.cc:731
+#: io.cc:1543 session.cc:704 session.cc:734
msgid "R"
msgstr ""
-#: io.cc:1539 io.cc:1545
+#: io.cc:1545 io.cc:1551
#, c-format
msgid "%d"
msgstr ""
-#: ladspa_plugin.cc:86
+#: ladspa_plugin.cc:93
+msgid "LADSPA: Unable to open module: "
+msgstr ""
+
+#: ladspa_plugin.cc:99
msgid "LADSPA: module has no descriptor function."
msgstr ""
-#: ladspa_plugin.cc:91
+#: ladspa_plugin.cc:106
msgid "LADSPA: plugin has gone away since discovery!"
msgstr ""
-#: ladspa_plugin.cc:98
+#: ladspa_plugin.cc:113
msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
msgstr ""
-#: ladspa_plugin.cc:297
+#: ladspa_plugin.cc:311
msgid ""
"illegal parameter number used with plugin \"%1\". This may indicate a change "
"in the plugin design, and presets may be invalid"
msgstr ""
-#: ladspa_plugin.cc:376 ladspa_plugin.cc:426
+#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr ""
-#: ladspa_plugin.cc:391 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
msgid "LADSPA: no ladspa port number"
msgstr ""
-#: ladspa_plugin.cc:397 ladspa_plugin.cc:446
+#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
msgid "LADSPA: no ladspa port data"
msgstr ""
-#: ladspa_plugin.cc:717
-msgid "LADSPA: cannot load module from \"%1\""
-msgstr ""
-
-#: ladspa_plugin.cc:827
+#: ladspa_plugin.cc:840
msgid "Could not locate HOME. Preset not removed."
msgstr ""
-#: ladspa_plugin.cc:864 ladspa_plugin.cc:870
+#: ladspa_plugin.cc:879 ladspa_plugin.cc:885
msgid "Could not create %1. Preset not saved. (%2)"
msgstr ""
-#: ladspa_plugin.cc:877
+#: ladspa_plugin.cc:892
msgid "Error saving presets file %1."
msgstr ""
-#: ladspa_plugin.cc:915
+#: ladspa_plugin.cc:934
msgid "Could not locate HOME. Preset not saved."
msgstr ""
@@ -962,7 +979,7 @@ msgstr ""
msgid "incorrect XML mode passed to Locations::set_state"
msgstr ""
-#: location.cc:842 session.cc:4530 session_state.cc:1031
+#: location.cc:842 session.cc:4533 session_state.cc:1025
msgid "session"
msgstr ""
@@ -1021,40 +1038,39 @@ msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
msgstr ""
#: ltc_slave.cc:591
-#, c-format
msgid "flywheel"
msgstr ""
-#: midi_diskstream.cc:167
+#: midi_diskstream.cc:166
msgid ""
"%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
msgstr ""
-#: midi_diskstream.cc:219
+#: midi_diskstream.cc:218
msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
msgstr ""
-#: midi_diskstream.cc:270
+#: midi_diskstream.cc:269
msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
-#: midi_diskstream.cc:699
+#: midi_diskstream.cc:698
msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-#: midi_diskstream.cc:834
+#: midi_diskstream.cc:833
msgid "MidiDiskstream %1: cannot write to disk"
msgstr ""
-#: midi_diskstream.cc:868
+#: midi_diskstream.cc:867
msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: midi_diskstream.cc:955
+#: midi_diskstream.cc:954
msgid "%1: could not create region for complete midi file"
msgstr ""
-#: midi_diskstream.cc:992
+#: midi_diskstream.cc:991
msgid "MidiDiskstream: could not create region for captured midi!"
msgstr ""
@@ -1066,27 +1082,27 @@ msgstr ""
msgid "No SysExID found for sys-ex property change - ignored"
msgstr ""
-#: midi_model.cc:2010
+#: midi_model.cc:2012
msgid "transpose"
msgstr ""
-#: midi_patch_manager.cc:126
+#: midi_patch_manager.cc:127
msgid "Duplicate MIDI device `%1' in `%2' ignored"
msgstr ""
-#: midi_source.cc:125
+#: midi_source.cc:124
msgid "Missing parameter property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:132
+#: midi_source.cc:131
msgid "Missing style property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:144
+#: midi_source.cc:143
msgid "Missing parameter property on AutomationState"
msgstr ""
-#: midi_source.cc:151
+#: midi_source.cc:150
msgid "Missing state property on AutomationState"
msgstr ""
@@ -1130,21 +1146,21 @@ msgstr ""
msgid "solo control"
msgstr ""
-#: mtc_slave.cc:238
+#: mtc_slave.cc:240
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr ""
-#: mtc_slave.cc:361
+#: mtc_slave.cc:362
msgid ""
"Unknown rate/drop value %1 in incoming MTC stream, session values used "
"instead"
msgstr ""
-#: mtc_slave.cc:381
+#: mtc_slave.cc:382
msgid "Session framerate adjusted from %1 TO: MTC's %2."
msgstr ""
-#: mtc_slave.cc:395
+#: mtc_slave.cc:396
msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
msgstr ""
@@ -1204,23 +1220,23 @@ msgstr ""
msgid "Pannable given XML data for %1 - ignored"
msgstr ""
-#: panner_manager.cc:79
+#: panner_manager.cc:80
msgid "looking for panners in %1\n"
msgstr ""
-#: panner_manager.cc:106
+#: panner_manager.cc:108
msgid "Panner discovered: \"%1\" in %2\n"
msgstr ""
-#: panner_manager.cc:123
+#: panner_manager.cc:125
msgid "PannerManager: cannot load module \"%1\" (%2)"
msgstr "PannerManager: cannot load module \"%1\" (%2)"
-#: panner_manager.cc:130
+#: panner_manager.cc:132
msgid "PannerManager: module \"%1\" has no descriptor function."
msgstr ""
-#: panner_manager.cc:215
+#: panner_manager.cc:219
msgid "no panner discovered for in/out = %1/%2"
msgstr ""
@@ -1252,89 +1268,89 @@ msgstr ""
msgid "Could not construct playlist for PlaylistSource from session data!"
msgstr ""
-#: plugin.cc:324
+#: plugin.cc:328
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin.cc:398
+#: plugin.cc:402
msgid ""
"Saving plugin settings is not supported in this build of %1. Consider paying "
"for the full version"
msgstr ""
-#: plugin_insert.cc:597
+#: plugin_insert.cc:589
msgid "programming error: "
msgstr "ошибка программы: "
-#: plugin_insert.cc:934
+#: plugin_insert.cc:926
msgid "XML node describing plugin is missing the `type' field"
msgstr ""
-#: plugin_insert.cc:949
+#: plugin_insert.cc:941
msgid "unknown plugin type %1 in plugin insert state"
msgstr ""
-#: plugin_insert.cc:977
+#: plugin_insert.cc:969
msgid "Plugin has no unique ID field"
msgstr ""
-#: plugin_insert.cc:986
+#: plugin_insert.cc:978
msgid ""
"Found a reference to a plugin (\"%1\") that is unknown.\n"
"Perhaps it was removed or moved since it was last used."
msgstr ""
-#: plugin_insert.cc:1102
+#: plugin_insert.cc:1094
msgid "PluginInsert: Auto: no ladspa port number"
msgstr ""
-#: plugin_insert.cc:1109
+#: plugin_insert.cc:1101
msgid "PluginInsert: Auto: port id out of range"
msgstr ""
-#: plugin_insert.cc:1145
+#: plugin_insert.cc:1137
msgid "PluginInsert: automatable control %1 not found - ignored"
msgstr ""
-#: plugin_manager.cc:161
+#: plugin_manager.cc:165
msgid "Discovering Plugins"
msgstr "Обнаружение модулей"
-#: plugin_manager.cc:335
+#: plugin_manager.cc:286
msgid "Could not parse rdf file: %1"
msgstr ""
-#: plugin_manager.cc:374
+#: plugin_manager.cc:330
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr "LADSPA: не удалоÑÑŒ загрузить модуль \"%1\" (%2)"
-#: plugin_manager.cc:381
+#: plugin_manager.cc:337
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr ""
-#: plugin_manager.cc:602
+#: plugin_manager.cc:567
msgid ""
"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
"at this time"
msgstr ""
-#: plugin_manager.cc:709
+#: plugin_manager.cc:680
msgid ""
"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
"in %2 at this time"
msgstr ""
-#: plugin_manager.cc:870
+#: plugin_manager.cc:841
msgid "unknown plugin status type \"%1\" - all entries ignored"
msgstr ""
-#: plugin_manager.cc:887
+#: plugin_manager.cc:858
msgid "unknown plugin type \"%1\" - ignored"
msgstr ""
-#: port.cc:410
+#: port.cc:412
msgid "could not reregister %1"
msgstr ""
@@ -1446,11 +1462,11 @@ msgstr ""
msgid "cannot create new name for region \"%1\""
msgstr ""
-#: resampled_source.cc:98
+#: resampled_source.cc:102
msgid "Import: %1"
msgstr "Импорт: %1"
-#: resampled_source.cc:128 srcfilesource.cc:76
+#: resampled_source.cc:132 srcfilesource.cc:76
msgid "Import: src_new() failed : %1"
msgstr ""
@@ -1458,27 +1474,27 @@ msgstr ""
msgid "return %1"
msgstr ""
-#: route.cc:1077 route.cc:2518
+#: route.cc:1081 route.cc:2541
msgid "unknown Processor type \"%1\"; ignored"
msgstr ""
-#: route.cc:1089
+#: route.cc:1093
msgid "processor could not be created. Ignored."
msgstr ""
-#: route.cc:1952 route.cc:2177
+#: route.cc:1975 route.cc:2200
msgid "Bad node sent to Route::set_state() [%1]"
msgstr ""
-#: route.cc:2012
+#: route.cc:2035
msgid "Pannable state found for route (%1) without a panner!"
msgstr ""
-#: route.cc:2086 route.cc:2090 route.cc:2291 route.cc:2295
+#: route.cc:2109 route.cc:2113 route.cc:2314 route.cc:2318
msgid "badly formed order key string in state file! [%1] ... ignored."
msgstr ""
-#: route.cc:2301
+#: route.cc:2324
msgid "Converting deprecated order key for %1 using Editor order %2"
msgstr ""
@@ -1526,147 +1542,147 @@ msgstr ""
msgid "Set up standard connections"
msgstr "ÐаÑтройка обычных Ñоединений"
-#: session.cc:635
+#: session.cc:638
msgid "could not setup Click I/O"
msgstr ""
-#: session.cc:683
+#: session.cc:686
#, c-format
msgid "out %<PRIu32>"
msgstr ""
-#: session.cc:697
+#: session.cc:700
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr ""
-#: session.cc:712
+#: session.cc:715
#, c-format
msgid "in %<PRIu32>"
msgstr ""
-#: session.cc:726
+#: session.cc:729
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr ""
-#: session.cc:790
+#: session.cc:793
msgid "cannot connect master output %1 to %2"
msgstr ""
-#: session.cc:859
+#: session.cc:862
msgid "monitor"
msgstr ""
-#: session.cc:904
+#: session.cc:907
msgid "cannot connect control input %1 to %2"
msgstr ""
-#: session.cc:924
+#: session.cc:927
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr ""
-#: session.cc:955
+#: session.cc:958
msgid "cannot connect control output %1 to %2"
msgstr ""
-#: session.cc:1023
+#: session.cc:1026
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr ""
-#: session.cc:1207
+#: session.cc:1210
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
-#: session.cc:1247
+#: session.cc:1250
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
msgstr ""
-#: session.cc:1561
+#: session.cc:1564
msgid "feedback loop setup between %1 and %2"
msgstr ""
-#: session.cc:1857
+#: session.cc:1860
msgid "Session: could not create new midi track."
msgstr ""
-#: session.cc:1863
+#: session.cc:1866
msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks."
msgstr ""
-#: session.cc:2040 session.cc:2043
+#: session.cc:2043 session.cc:2046
msgid "Audio"
msgstr ""
-#: session.cc:2067 session.cc:2075 session.cc:2152 session.cc:2160
+#: session.cc:2070 session.cc:2078 session.cc:2155 session.cc:2163
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr ""
-#: session.cc:2098
+#: session.cc:2101
msgid "Session: could not create new audio track."
msgstr ""
-#: session.cc:2130 session.cc:2133
+#: session.cc:2133 session.cc:2136
msgid "Bus"
msgstr ""
-#: session.cc:2183
+#: session.cc:2186
msgid "Session: could not create new audio route."
msgstr ""
-#: session.cc:2242 session.cc:2252
+#: session.cc:2245 session.cc:2255
msgid "Session: UINT_MAX routes? impossible!"
msgstr ""
-#: session.cc:2274
+#: session.cc:2277
msgid "Session: cannot create track/bus from template description"
msgstr ""
-#: session.cc:2300
+#: session.cc:2303
msgid "Session: could not create new route from template"
msgstr ""
-#: session.cc:2329
+#: session.cc:2332
msgid "Adding new tracks/busses failed"
msgstr "Ðе удалоÑÑŒ добавить новые дорожки/шины"
-#: session.cc:3433
+#: session.cc:3436
msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename"
msgstr ""
-#: session.cc:3553 session.cc:3611
+#: session.cc:3556 session.cc:3614
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr ""
-#: session.cc:4001
+#: session.cc:4004
msgid "send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4013
+#: session.cc:4016
msgid "aux send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4025
+#: session.cc:4028
msgid "return ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4037
+#: session.cc:4040
msgid "insert ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4164
+#: session.cc:4167
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr ""
-#: session.cc:4193
+#: session.cc:4196
msgid "too many bounced versions of playlist \"%1\""
msgstr ""
-#: session.cc:4203
+#: session.cc:4206
msgid "cannot create new audio file \"%1\" for %2"
msgstr ""
@@ -1701,7 +1717,7 @@ msgstr ""
msgid "Session subdirectory does not exist at path %1"
msgstr ""
-#: session_events.cc:184
+#: session_events.cc:185
msgid "Session: cannot have two events of type %1 at the same frame (%2)."
msgstr ""
@@ -1713,13 +1729,13 @@ msgstr ""
msgid "Export ended unexpectedly: %1"
msgstr ""
-#: session_ltc.cc:222
+#: session_ltc.cc:221
msgid ""
"LTC encoder: invalid framerate - LTC encoding is disabled for the remainder "
"of this session."
msgstr ""
-#: session_midi.cc:520
+#: session_midi.cc:519
msgid "Session: cannot send quarter-frame MTC message (%1)"
msgstr ""
@@ -1735,346 +1751,338 @@ msgstr ""
msgid "Programming error: illegal event type in process_event (%1)"
msgstr ""
-#: session_state.cc:140
-msgid "Could not use path %1 (%2)"
-msgstr "Ðе удалоÑÑŒ иÑпользовать раÑположение %1 (%2)"
-
-#: session_state.cc:184
+#: session_state.cc:178
msgid "solo cut control (dB)"
msgstr ""
-#: session_state.cc:208
+#: session_state.cc:202
msgid "Set block size and sample rate"
msgstr "УÑтановка размера блока и чаÑтоты ÑÑмплированиÑ"
-#: session_state.cc:213
+#: session_state.cc:207
msgid "Using configuration"
msgstr "ПрименÑетÑÑ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ"
-#: session_state.cc:325
+#: session_state.cc:319
msgid "Reset Remote Controls"
msgstr "Ð¡Ð±Ñ€Ð¾Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ð¾Ð³Ð¾ управлениÑ"
-#: session_state.cc:417
+#: session_state.cc:411
msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:424
+#: session_state.cc:418
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr ""
-#: session_state.cc:431
+#: session_state.cc:425
msgid "Session: cannot create session midi dir \"%1\" (%2)"
msgstr ""
-#: session_state.cc:438
+#: session_state.cc:432
msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:445
+#: session_state.cc:439
msgid "Session: cannot create session export folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:452
+#: session_state.cc:446
msgid "Session: cannot create session analysis folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:459
+#: session_state.cc:453
msgid "Session: cannot create session plugins folder \"%1\" (%2)"
msgstr "Session: cannot create session plugins folder \"%1\" (%2)"
-#: session_state.cc:466
+#: session_state.cc:460
msgid "Session: cannot create session externals folder \"%1\" (%2)"
msgstr "Session: cannot create session externals folder \"%1\" (%2)"
-#: session_state.cc:480
+#: session_state.cc:474
msgid "Session: cannot create session folder \"%1\" (%2)"
msgstr "Session: cannot create session folder \"%1\" (%2)"
-#: session_state.cc:514
+#: session_state.cc:508
msgid "Could not open %1 for writing session template"
msgstr "Ðе удалоÑÑŒ открыть %1 Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи шаблона ÑеÑÑии"
-#: session_state.cc:520
+#: session_state.cc:514
msgid "Could not open session template %1 for reading"
msgstr ""
-#: session_state.cc:539
+#: session_state.cc:533
msgid "master"
msgstr "master"
-#: session_state.cc:600
+#: session_state.cc:594
msgid "Could not remove pending capture state at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:624
+#: session_state.cc:618
msgid "could not rename snapshot %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:652
+#: session_state.cc:646
msgid "Could not remove session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:669
+#: session_state.cc:663
msgid ""
"the %1 audio engine is not connected and state saving would lose all I/O "
"connections. Session not saved"
msgstr ""
-#: session_state.cc:720
+#: session_state.cc:714
msgid "state could not be saved to %1"
msgstr ""
-#: session_state.cc:722 session_state.cc:733
+#: session_state.cc:716 session_state.cc:727
msgid "Could not remove temporary session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:730
-msgid "could not rename temporary session file %1 to %2"
+#: session_state.cc:724
+msgid "could not rename temporary session file %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:798
+#: session_state.cc:792
msgid "%1: session file \"%2\" doesn't exist!"
msgstr "%1: файл ÑеÑÑии «%2» не ÑущеÑтвует!"
-#: session_state.cc:810
+#: session_state.cc:804
msgid "Could not understand session file %1"
msgstr ""
-#: session_state.cc:819
+#: session_state.cc:813
msgid "Session file %1 is not a session"
msgstr "Файл ÑеÑÑии %1 не ÑвлÑетÑÑ ÑеÑÑией"
-#: session_state.cc:1125
+#: session_state.cc:1119
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
-#: session_state.cc:1179
+#: session_state.cc:1173
msgid "Session: XML state has no options section"
msgstr ""
-#: session_state.cc:1184
+#: session_state.cc:1178
msgid "Session: XML state has no metadata section"
msgstr ""
-#: session_state.cc:1195
+#: session_state.cc:1189
msgid "Session: XML state has no sources section"
msgstr ""
-#: session_state.cc:1202
+#: session_state.cc:1196
msgid "Session: XML state has no Tempo Map section"
msgstr ""
-#: session_state.cc:1209
+#: session_state.cc:1203
msgid "Session: XML state has no locations section"
msgstr ""
-#: session_state.cc:1235
+#: session_state.cc:1229
msgid "Session: XML state has no Regions section"
msgstr ""
-#: session_state.cc:1242
+#: session_state.cc:1236
msgid "Session: XML state has no playlists section"
msgstr ""
-#: session_state.cc:1262
+#: session_state.cc:1256
msgid "Session: XML state has no bundles section"
msgstr ""
-#: session_state.cc:1274
+#: session_state.cc:1268
msgid "Session: XML state has no diskstreams section"
msgstr ""
-#: session_state.cc:1282
+#: session_state.cc:1276
msgid "Session: XML state has no routes section"
msgstr ""
-#: session_state.cc:1294
+#: session_state.cc:1288
msgid "Session: XML state has no route groups section"
msgstr ""
-#: session_state.cc:1303
+#: session_state.cc:1297
msgid "Session: XML state has no edit groups section"
msgstr ""
-#: session_state.cc:1310
+#: session_state.cc:1304
msgid "Session: XML state has no mix groups section"
msgstr ""
-#: session_state.cc:1318
+#: session_state.cc:1312
msgid "Session: XML state has no click section"
msgstr ""
-#: session_state.cc:1360
+#: session_state.cc:1354
msgid "Session: cannot create Route from XML description."
msgstr ""
-#: session_state.cc:1364
+#: session_state.cc:1358
msgid "Loaded track/bus %1"
msgstr "Загружена дорожка/шина %1"
-#: session_state.cc:1462
+#: session_state.cc:1456
msgid "Could not find diskstream for route"
msgstr ""
-#: session_state.cc:1516
+#: session_state.cc:1510
msgid "Session: cannot create Region from XML description."
msgstr ""
-#: session_state.cc:1520
+#: session_state.cc:1514
msgid "Can not load state for region '%1'"
msgstr ""
-#: session_state.cc:1556
+#: session_state.cc:1550
msgid "Regions in compound description not found (ID's %1 and %2): ignored"
msgstr ""
-#: session_state.cc:1584
+#: session_state.cc:1578
msgid "Nested source has no ID info in session file! (ignored)"
msgstr ""
-#: session_state.cc:1596
+#: session_state.cc:1590
msgid "Cannot reconstruct nested source for region %1"
msgstr ""
-#: session_state.cc:1658
+#: session_state.cc:1652
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707
+#: session_state.cc:1660 session_state.cc:1681 session_state.cc:1701
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713
+#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
msgstr ""
-#: session_state.cc:1736
+#: session_state.cc:1730
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
msgstr ""
-#: session_state.cc:1770
+#: session_state.cc:1764
msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1778
+#: session_state.cc:1772
msgid ""
"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1784
+#: session_state.cc:1778
msgid ""
"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
msgstr ""
-#: session_state.cc:1852
+#: session_state.cc:1846
msgid ""
"cannot create new file from region name \"%1\" with ident = \"%2\": too many "
"existing files with similar names"
msgstr ""
-#: session_state.cc:1875
+#: session_state.cc:1869
msgid "Session: cannot create Source from XML description."
msgstr ""
-#: session_state.cc:1909
+#: session_state.cc:1903
msgid "A sound file is missing. It will be replaced by silence."
msgstr ""
-#: session_state.cc:1932
+#: session_state.cc:1926
msgid "Found a sound file that cannot be used by %1. Talk to the progammers."
msgstr ""
-#: session_state.cc:1949
+#: session_state.cc:1943
msgid "Could not create templates directory \"%1\" (%2)"
msgstr "Could not create templates directory \"%1\" (%2)"
-#: session_state.cc:1962
+#: session_state.cc:1956
msgid "Template \"%1\" already exists - new version not created"
msgstr ""
-#: session_state.cc:1968
+#: session_state.cc:1962
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr "Could not create directory for Session template\"%1\" (%2)"
-#: session_state.cc:1978
+#: session_state.cc:1972
msgid "template not saved"
msgstr ""
-#: session_state.cc:1988
+#: session_state.cc:1982
msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
msgstr ""
-#: session_state.cc:2183
+#: session_state.cc:2225
msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr ""
-#: session_state.cc:2725 session_state.cc:2731
-msgid "Cannot expand path %1 (%2)"
-msgstr "Cannot expand path %1 (%2)"
-
-#: session_state.cc:2784
+#: session_state.cc:2820
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr "Session: cannot create dead file folder \"%1\" (%2)"
-#: session_state.cc:2823
+#: session_state.cc:2859
msgid "cannot rename unused file source from %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:2841
+#: session_state.cc:2877
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr ""
-#: session_state.cc:3143
+#: session_state.cc:3179
msgid "could not backup old history file, current history not saved"
msgstr ""
-#: session_state.cc:3156
+#: session_state.cc:3192
msgid "history could not be saved to %1"
msgstr ""
-#: session_state.cc:3159
+#: session_state.cc:3195
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:3163
+#: session_state.cc:3199
msgid "could not restore history file from backup %1 (%2)"
msgstr ""
-#: session_state.cc:3188
+#: session_state.cc:3224
msgid "%1: no history file \"%2\" for this session."
msgstr ""
-#: session_state.cc:3194
+#: session_state.cc:3230
msgid "Could not understand session history file \"%1\""
msgstr ""
-#: session_state.cc:3236
+#: session_state.cc:3272
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr ""
-#: session_state.cc:3247
+#: session_state.cc:3283
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr ""
-#: session_state.cc:3258
+#: session_state.cc:3294
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr ""
-#: session_state.cc:3266
+#: session_state.cc:3302
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr ""
-#: session_state.cc:3502
+#: session_state.cc:3538
msgid "Session: unknown diskstream type in XML"
msgstr ""
-#: session_state.cc:3507
+#: session_state.cc:3543
msgid "Session: could not load diskstream via XML state"
msgstr ""
@@ -2098,181 +2106,185 @@ msgid ""
"control"
msgstr ""
-#: smf_source.cc:252
+#: smf_source.cc:262
msgid "Unable to read event prefix, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:265
+#: smf_source.cc:275
msgid "Event has time and size but no body, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:271
+#: smf_source.cc:281
msgid "Event time is before MIDI source position"
msgstr ""
-#: smf_source.cc:306 smf_source.cc:345
+#: smf_source.cc:316 smf_source.cc:355
msgid "Skipping event with unordered time %1"
msgstr ""
-#: smf_source.cc:410
+#: smf_source.cc:420
msgid "cannot open MIDI file %1 for write"
msgstr "не удалоÑÑŒ открыть MIDI-файл %2 Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи"
-#: sndfile_helpers.cc:32
+#: sndfile_helpers.cc:34
msgid "WAV"
msgstr "WAV"
-#: sndfile_helpers.cc:33
+#: sndfile_helpers.cc:35
msgid "AIFF"
msgstr "AIFF"
-#: sndfile_helpers.cc:34
+#: sndfile_helpers.cc:36
msgid "CAF"
msgstr "CAF"
-#: sndfile_helpers.cc:35
+#: sndfile_helpers.cc:37
msgid "W64 (64 bit WAV)"
msgstr "W64 (64-разрÑдный WAV)"
-#: sndfile_helpers.cc:36
+#: sndfile_helpers.cc:38
msgid "FLAC"
msgstr "FLAC"
-#: sndfile_helpers.cc:37
+#: sndfile_helpers.cc:39
msgid "Ogg/Vorbis"
msgstr "Ogg/Vorbis"
-#: sndfile_helpers.cc:38
+#: sndfile_helpers.cc:40
msgid "raw (no header)"
msgstr "raw (без заголовка)"
-#: sndfile_helpers.cc:43
+#: sndfile_helpers.cc:45
msgid ".wav"
msgstr ".wav"
-#: sndfile_helpers.cc:44
+#: sndfile_helpers.cc:46
msgid ".aiff"
msgstr ".aiff"
-#: sndfile_helpers.cc:45
+#: sndfile_helpers.cc:47
msgid ".caf"
msgstr ".caf"
-#: sndfile_helpers.cc:46
+#: sndfile_helpers.cc:48
msgid ".w64"
msgstr ".w64"
-#: sndfile_helpers.cc:47
+#: sndfile_helpers.cc:49
msgid ".flac"
msgstr ".flac"
-#: sndfile_helpers.cc:48
+#: sndfile_helpers.cc:50
msgid ".ogg"
msgstr ".ogg"
-#: sndfile_helpers.cc:49
+#: sndfile_helpers.cc:51
msgid ".raw"
msgstr ".raw"
-#: sndfile_helpers.cc:64
+#: sndfile_helpers.cc:66
msgid "Signed 16 bit PCM"
msgstr "Signed 16 bit PCM"
-#: sndfile_helpers.cc:65
+#: sndfile_helpers.cc:67
msgid "Signed 24 bit PCM"
msgstr "Signed 24 bit PCM"
-#: sndfile_helpers.cc:66
+#: sndfile_helpers.cc:68
msgid "Signed 32 bit PCM"
msgstr "Signed 32 bit PCM"
-#: sndfile_helpers.cc:67
+#: sndfile_helpers.cc:69
msgid "Signed 8 bit PCM"
msgstr "Signed 8 bit PCM"
-#: sndfile_helpers.cc:68
+#: sndfile_helpers.cc:70
msgid "32 bit float"
msgstr "32 bit float"
-#: sndfile_helpers.cc:81
+#: sndfile_helpers.cc:83
msgid "Little-endian (Intel)"
msgstr ""
-#: sndfile_helpers.cc:82
+#: sndfile_helpers.cc:84
msgid "Big-endian (PowerPC)"
msgstr ""
-#: sndfilesource.cc:201
+#: sndfilesource.cc:210
msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
msgstr ""
-#: sndfilesource.cc:209
+#: sndfilesource.cc:218
msgid ""
"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
"number"
msgstr ""
-#: sndfilesource.cc:255 sndfilesource.cc:571 sndfilesource.cc:595
+#: sndfilesource.cc:264 sndfilesource.cc:604 sndfilesource.cc:628
msgid ""
"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
"for this file"
msgstr ""
-#: sndfilesource.cc:302
+#: sndfilesource.cc:311
msgid "could not allocate file %1 for reading."
msgstr ""
-#: sndfilesource.cc:337
+#: sndfilesource.cc:346
msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
msgstr ""
-#: sndfilesource.cc:347
+#: sndfilesource.cc:356
msgid ""
"SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
msgstr ""
-#: sndfilesource.cc:391 sndfilesource.cc:420
+#: sndfilesource.cc:400 sndfilesource.cc:429
msgid "attempt to write a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:396 utils.cc:545 utils.cc:569 utils.cc:583 utils.cc:602
+#: sndfilesource.cc:405 utils.cc:547 utils.cc:571 utils.cc:585 utils.cc:604
msgid "programming error: %1 %2"
msgstr "programming error: %1 %2"
-#: sndfilesource.cc:523
+#: sndfilesource.cc:532 sndfilesource.cc:562
msgid "attempt to flush a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:528
+#: sndfilesource.cc:537 sndfilesource.cc:557
msgid "attempt to flush an un-opened audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:534
+#: sndfilesource.cc:543
msgid "could not allocate file %1 to write header"
msgstr ""
-#: sndfilesource.cc:548
+#: sndfilesource.cc:568
+msgid "could not allocate file %1 to flush contents"
+msgstr ""
+
+#: sndfilesource.cc:581
msgid ""
"attempt to store broadcast info in a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:553
+#: sndfilesource.cc:586
msgid "attempt to set BWF info for an un-opened audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:614
+#: sndfilesource.cc:647
msgid "%1: cannot seek to %2 (libsndfile error: %3)"
msgstr ""
-#: sndfilesource.cc:727
+#: sndfilesource.cc:760
msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
msgstr ""
-#: sndfilesource.cc:740 sndfilesource.cc:790 sndfilesource.cc:797
+#: sndfilesource.cc:773 sndfilesource.cc:823 sndfilesource.cc:830
msgid "SndFileSource: \"%1\" bad write (%2)"
msgstr ""
-#: sndfilesource.cc:820
+#: sndfilesource.cc:853
msgid ""
"Filesource: start time is already set for existing file (%1): Cannot change "
"start time."
@@ -2441,54 +2453,60 @@ msgstr ""
msgid "Node for Port has no \"name\" property"
msgstr "Node for Port has no \"name\" property"
-#: utils.cc:393 utils.cc:417
+#: utils.cc:395 utils.cc:419
msgid "Splice"
msgstr ""
-#: utils.cc:395 utils.cc:410
+#: utils.cc:397 utils.cc:412
msgid "Slide"
msgstr ""
-#: utils.cc:397 utils.cc:413
+#: utils.cc:399 utils.cc:415
msgid "Lock"
msgstr ""
-#: utils.cc:400
+#: utils.cc:402
msgid "programming error: unknown edit mode string \"%1\""
msgstr "programming error: unknown edit mode string \"%1\""
-#: utils.cc:424 utils.cc:456
+#: utils.cc:426 utils.cc:458
msgid "MIDI Timecode"
msgstr ""
-#: utils.cc:424 utils.cc:454
+#: utils.cc:426 utils.cc:456
msgid "MTC"
msgstr "MTC"
-#: utils.cc:428 utils.cc:463
+#: utils.cc:430 utils.cc:465
msgid "MIDI Clock"
msgstr ""
-#: utils.cc:432 utils.cc:450 utils.cc:470
+#: utils.cc:434 utils.cc:452 utils.cc:472
msgid "JACK"
msgstr "JACK"
-#: utils.cc:436
+#: utils.cc:438
msgid "programming error: unknown sync source string \"%1\""
msgstr "programming error: unknown sync source string \"%1\""
-#: utils.cc:461
+#: utils.cc:463
msgid "M-Clock"
msgstr ""
-#: utils.cc:467
+#: utils.cc:469
msgid "LTC"
msgstr "LTC"
-#: utils.cc:637
+#: utils.cc:639
msgid "programming error: unknown native header format: %1"
msgstr "programming error: unknown native header format: %1"
-#: utils.cc:652
+#: utils.cc:654
msgid "cannot open directory %1 (%2)"
msgstr "cannot open directory %1 (%2)"
+
+#~ msgid "Could not use path %1 (%2)"
+#~ msgstr "Ðе удалоÑÑŒ иÑпользовать раÑположение %1 (%2)"
+
+#~ msgid "Cannot expand path %1 (%2)"
+#~ msgstr "Cannot expand path %1 (%2)"
diff --git a/libs/ardour/po/sv.po b/libs/ardour/po/sv.po
index 5558fde391..df2d04ae0b 100644
--- a/libs/ardour/po/sv.po
+++ b/libs/ardour/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ardour\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-11-05 11:11-0500\n"
+"POT-Creation-Date: 2014-02-10 17:53+0100\n"
"PO-Revision-Date: 2006-10-03 01:09+GMT+1\n"
"Last-Translator: Petter Sundlöf <petter.sundlof@findus.dhs.org>\n"
"Language-Team: Swedish <sv@li.org>\n"
@@ -20,64 +20,64 @@ msgstr ""
msgid "Fader"
msgstr "Volymreglage"
-#: audio_diskstream.cc:244
+#: audio_diskstream.cc:242
msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
msgstr ""
-#: audio_diskstream.cc:296
+#: audio_diskstream.cc:294
msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
-#: audio_diskstream.cc:848 audio_diskstream.cc:858
+#: audio_diskstream.cc:846 audio_diskstream.cc:856
msgid ""
"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
msgstr ""
-#: audio_diskstream.cc:1014
+#: audio_diskstream.cc:1012
msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-#: audio_diskstream.cc:1383 audio_diskstream.cc:1400
+#: audio_diskstream.cc:1381 audio_diskstream.cc:1398
msgid "AudioDiskstream %1: cannot write to disk"
msgstr ""
-#: audio_diskstream.cc:1443
+#: audio_diskstream.cc:1441
msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: audio_diskstream.cc:1537
+#: audio_diskstream.cc:1535
msgid "%1: could not create region for complete audio file"
msgstr ""
-#: audio_diskstream.cc:1571
+#: audio_diskstream.cc:1569
msgid "AudioDiskstream: could not create region for captured audio!"
msgstr ""
-#: audio_diskstream.cc:1679
+#: audio_diskstream.cc:1677
msgid "programmer error: %1"
msgstr ""
-#: audio_diskstream.cc:1905
+#: audio_diskstream.cc:1903
msgid "AudioDiskstream: channel %1 out of range"
msgstr ""
-#: audio_diskstream.cc:1919 midi_diskstream.cc:1210
+#: audio_diskstream.cc:1917 midi_diskstream.cc:1209
msgid "%1:%2 new capture file not initialized correctly"
msgstr ""
-#: audio_diskstream.cc:2200
+#: audio_diskstream.cc:2198
msgid "%1: cannot restore pending capture source file %2"
msgstr ""
-#: audio_diskstream.cc:2222
+#: audio_diskstream.cc:2220
msgid "%1: incorrect number of pending sources listed - ignoring them all"
msgstr ""
-#: audio_diskstream.cc:2246
+#: audio_diskstream.cc:2244
msgid "%1: cannot create whole-file region from pending capture sources"
msgstr ""
-#: audio_library.cc:71
+#: audio_library.cc:81
msgid "Could not open %1. Audio Library not saved"
msgstr ""
@@ -117,11 +117,11 @@ msgstr ""
msgid "Audio Playlists (unused)"
msgstr ""
-#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529
+#: audio_playlist_source.cc:171 audiosource.cc:891 file_source.cc:520
#: midi_playlist_source.cc:144 midi_playlist_source.cc:152
-#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643
-#: rb_effect.cc:333 session.cc:2619 session.cc:2652 session.cc:3797
-#: session_handle.cc:87 sndfilesource.cc:121
+#: midi_playlist_source.cc:159 midi_source.cc:370 plugin_insert.cc:634
+#: rb_effect.cc:333 session.cc:2636 session.cc:2669 session.cc:3814
+#: session_handle.cc:87 sndfilesource.cc:122
msgid "programming error: %1"
msgstr ""
@@ -145,23 +145,23 @@ msgid ""
"Channels: "
msgstr ""
-#: audio_track.cc:167
+#: audio_track.cc:161
msgid "Unknown bundle \"%1\" listed for input of %2"
msgstr ""
-#: audio_track.cc:169
+#: audio_track.cc:163
msgid "in 1"
msgstr ""
-#: audio_track.cc:170
+#: audio_track.cc:164
msgid "No input bundles available as a replacement"
msgstr ""
-#: audio_track.cc:174
+#: audio_track.cc:168
msgid "Bundle %1 was not available - \"in 1\" used instead"
msgstr ""
-#: audio_track.cc:183
+#: audio_track.cc:177
msgid "improper input channel list in XML node (%1)"
msgstr ""
@@ -185,23 +185,23 @@ msgstr ""
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr ""
-#: audioengine.cc:488
+#: audioengine.cc:495
msgid "looking for backends in %1\n"
msgstr ""
-#: audioengine.cc:511
+#: audioengine.cc:518
msgid "AudioEngine: cannot load module \"%1\" (%2)"
msgstr ""
-#: audioengine.cc:517
+#: audioengine.cc:524
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr ""
-#: audioengine.cc:589
+#: audioengine.cc:596
msgid "Could not create backend for %1: %2"
msgstr ""
-#: audioregion.cc:1643
+#: audioregion.cc:1651
msgid ""
"You have requested an operation that requires audio analysis.\n"
"\n"
@@ -216,11 +216,11 @@ msgid ""
"this and future transient-detection operations.\n"
msgstr ""
-#: audiosource.cc:199
+#: audiosource.cc:210
msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
msgstr ""
-#: audiosource.cc:226
+#: audiosource.cc:239
msgid "AudioSource: cannot stat peakfile \"%1\""
msgstr ""
@@ -228,47 +228,68 @@ msgstr ""
msgid "cannot read sample data for unscaled peak computation"
msgstr ""
-#: audiosource.cc:387
+#: audiosource.cc:386
msgid "AudioSource: cannot open peakpath (a) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:463
+#: audiosource.cc:395 audiosource.cc:473
+msgid ""
+"AudioSource: could not seek to correct location in peak file \"%1\" (%2)"
+msgstr ""
+
+#: audiosource.cc:453
msgid "AudioSource: cannot open peakpath (b) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:587
+#: audiosource.cc:567
msgid ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
msgstr ""
-#: audiosource.cc:667
+#: audiosource.cc:634
msgid "%1: could not write read raw data for peak computation (%2)"
msgstr ""
-#: audiosource.cc:706
+#: audiosource.cc:672
msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:773 audiosource.cc:886
+#: audiosource.cc:739 audiosource.cc:861
+msgid "%1: could not seek in peak file data (%2)"
+msgstr ""
+
+#: audiosource.cc:744 audiosource.cc:870
msgid "%1: could not write peak file data (%2)"
msgstr ""
-#: audiosource.cc:924
+#: audiosource.cc:903
msgid "could not truncate peakfile %1 to %2 (error: %3)"
msgstr ""
-#: auditioner.cc:87
-msgid "no outputs available for auditioner - manual connection required"
+#: auditioner.cc:95
+msgid "Falling back to Reasonable Synth for Midi Audition"
+msgstr ""
+
+#: auditioner.cc:97
+msgid "No synth for midi-audition found."
msgstr ""
-#: auditioner.cc:135
-msgid "Auditioning of non-audio regions not yet supported"
+#: auditioner.cc:152
+msgid "no outputs available for auditioner - manual connection required"
msgstr ""
-#: auditioner.cc:160
+#: auditioner.cc:392 auditioner.cc:438
msgid "Cannot setup auditioner processing flow for %1 channels"
msgstr ""
+#: auditioner.cc:426
+msgid "Failed to load synth for MIDI-Audition."
+msgstr ""
+
+#: auditioner.cc:445
+msgid "Auditioning of regions other than Audio or Midi is not supported."
+msgstr ""
+
#: automatable.cc:81
msgid "Automation node has no path property"
msgstr ""
@@ -300,23 +321,23 @@ msgid ""
"AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
msgstr ""
-#: butler.cc:91
+#: butler.cc:80
msgid "Cannot create transport request signal pipe (%1)"
msgstr ""
-#: butler.cc:97 butler.cc:103
+#: butler.cc:86 butler.cc:92
msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)"
msgstr ""
-#: butler.cc:109
+#: butler.cc:124
msgid "Session: could not create butler thread"
msgstr ""
-#: butler.cc:156
+#: butler.cc:165
msgid "poll on butler request pipe failed (%1)"
msgstr ""
-#: butler.cc:163
+#: butler.cc:172
msgid "Error on butler thread request pipe: fd=%1 err=%2"
msgstr ""
@@ -324,55 +345,55 @@ msgstr ""
msgid "Error reading from butler request pipe"
msgstr ""
-#: butler.cc:248
+#: butler.cc:301
msgid "Butler read ahead failure on dstream %1"
msgstr ""
-#: butler.cc:285
+#: butler.cc:338
msgid "Butler write-behind failure on dstream %1"
msgstr ""
-#: control_protocol_manager.cc:134
+#: control_protocol_manager.cc:164
msgid "control protocol name \"%1\" has no descriptor"
msgstr ""
-#: control_protocol_manager.cc:141
+#: control_protocol_manager.cc:171
msgid "control protocol name \"%1\" could not be initialized"
msgstr ""
-#: control_protocol_manager.cc:201
+#: control_protocol_manager.cc:237
msgid "Instantiating mandatory control protocol %1"
msgstr ""
-#: control_protocol_manager.cc:222
+#: control_protocol_manager.cc:258
msgid "looking for control protocols in %1\n"
msgstr ""
-#: control_protocol_manager.cc:247
+#: control_protocol_manager.cc:283
msgid "Control protocol %1 not usable"
msgstr ""
-#: control_protocol_manager.cc:264
+#: control_protocol_manager.cc:300
msgid "Control surface protocol discovered: \"%1\"\n"
msgstr ""
-#: control_protocol_manager.cc:282
+#: control_protocol_manager.cc:318
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
msgstr ""
-#: control_protocol_manager.cc:290
+#: control_protocol_manager.cc:324
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr ""
-#: cycle_timer.cc:38
+#: cycle_timer.cc:40
msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
msgstr ""
-#: cycle_timer.cc:50
+#: cycle_timer.cc:52
msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo"
msgstr ""
-#: cycle_timer.cc:73
+#: cycle_timer.cc:75
msgid "cannot locate cpu MHz in /proc/cpuinfo"
msgstr ""
@@ -380,7 +401,7 @@ msgstr ""
msgid "audio"
msgstr ""
-#: data_type.cc:28 session.cc:1791 session.cc:1794
+#: data_type.cc:28 session.cc:1808 session.cc:1811
msgid "MIDI"
msgstr ""
@@ -388,15 +409,15 @@ msgstr ""
msgid "unknown"
msgstr ""
-#: delivery.cc:114
+#: delivery.cc:118
msgid "main outs"
msgstr ""
-#: delivery.cc:117 send.cc:61
+#: delivery.cc:121 send.cc:62
msgid "listen"
msgstr ""
-#: diskstream.cc:303
+#: diskstream.cc:302
msgid "Location \"%1\" not valid for track loop (start >= end)"
msgstr ""
@@ -408,23 +429,23 @@ msgstr ""
msgid "Export failed: %1"
msgstr ""
-#: export_filename.cc:118
+#: export_filename.cc:119
msgid "Existing export folder for this session (%1) does not exist - ignored"
msgstr ""
-#: export_filename.cc:229
+#: export_filename.cc:230
msgid "No Time"
msgstr "Ingen tid"
-#: export_filename.cc:238
+#: export_filename.cc:239
msgid "Invalid time format"
msgstr ""
-#: export_filename.cc:247
+#: export_filename.cc:248
msgid "No Date"
msgstr "Inget datum"
-#: export_filename.cc:262
+#: export_filename.cc:263
msgid "Invalid date format"
msgstr ""
@@ -492,7 +513,7 @@ msgstr ""
msgid "Rectangular"
msgstr ""
-#: export_formats.cc:52 session.cc:5014 session.cc:5030
+#: export_formats.cc:52 session.cc:5006 session.cc:5022
msgid "None"
msgstr ""
@@ -532,15 +553,15 @@ msgstr ""
msgid "No sample format"
msgstr ""
-#: export_handler.cc:335
+#: export_handler.cc:343
msgid "Editor: cannot open \"%1\" as export file for CD marker file"
msgstr ""
-#: export_handler.cc:417 export_handler.cc:420
+#: export_handler.cc:425 export_handler.cc:428
msgid "an error occured while writing a TOC/CUE file: %1"
msgstr ""
-#: export_handler.cc:642 export_handler.cc:700
+#: export_handler.cc:650 export_handler.cc:708
msgid "Cannot convert %1 to Latin-1 text"
msgstr ""
@@ -602,7 +623,7 @@ msgid ""
"configuration"
msgstr ""
-#: file_source.cc:198 session_state.cc:2807
+#: file_source.cc:198 session_state.cc:2843
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr ""
@@ -611,35 +632,35 @@ msgstr ""
msgid "cannot rename file source from %1 to %2 (%3)"
msgstr ""
-#: file_source.cc:250 file_source.cc:378
+#: file_source.cc:248 file_source.cc:372
msgid "FileSource: search path not set"
msgstr ""
-#: file_source.cc:313 file_source.cc:448
-msgid "Filesource: cannot find required file (%1): while searching %2"
+#: file_source.cc:309 file_source.cc:439
+msgid "Filesource: cannot find required file (%1)"
msgstr ""
-#: file_source.cc:440
+#: file_source.cc:432
msgid ""
-"FileSource: \"%1\" is ambigous when searching %2\n"
+"FileSource: \"%1\" is ambigous when searching\n"
"\t"
msgstr ""
-#: file_source.cc:494
+#: file_source.cc:484
msgid "Filesource: cannot find required file (%1): %2"
msgstr ""
-#: file_source.cc:501
+#: file_source.cc:492
msgid "Filesource: cannot check for existing file (%1): %2"
msgstr ""
-#: file_source.cc:535
+#: file_source.cc:526
msgid ""
"Programming error! %1 tried to rename a file over another file! It's safe to "
"continue working, but please report this to the developers."
msgstr ""
-#: file_source.cc:540
+#: file_source.cc:531
msgid "cannot rename file %1 to %2 (%3)"
msgstr ""
@@ -653,15 +674,15 @@ msgid ""
"cannot run"
msgstr ""
-#: filesystem_paths.cc:91
+#: filesystem_paths.cc:96
msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
msgstr ""
-#: filesystem_paths.cc:107
+#: filesystem_paths.cc:125
msgid "ARDOUR_CONFIG_PATH not set in environment - exiting\n"
msgstr ""
-#: filesystem_paths.cc:127
+#: filesystem_paths.cc:148
msgid "ARDOUR_DATA_PATH not set in environment - exiting\n"
msgstr ""
@@ -673,87 +694,83 @@ msgstr ""
msgid "filter: error creating new file %1 (%2)"
msgstr ""
-#: find_session.cc:51
-msgid "Could not resolve path: %1 (%2)"
-msgstr ""
-
-#: find_session.cc:63
+#: find_session.cc:59
msgid "cannot check session path %1 (%2)"
msgstr ""
-#: find_session.cc:89
+#: find_session.cc:85
msgid "cannot check statefile %1 (%2)"
msgstr ""
-#: find_session.cc:125
+#: find_session.cc:121
msgid "%1 is not a snapshot file"
msgstr ""
-#: find_session.cc:142
+#: find_session.cc:138
msgid "cannot determine current working directory (%1)"
msgstr ""
-#: find_session.cc:159
+#: find_session.cc:155
msgid "unknown file type for session %1"
msgstr ""
-#: globals.cc:207
+#: globals.cc:216
msgid "Could not set system open files limit to \"unlimited\""
msgstr ""
-#: globals.cc:209
+#: globals.cc:218
msgid "Could not set system open files limit to %1"
msgstr ""
-#: globals.cc:213
+#: globals.cc:222
msgid "Your system is configured to limit %1 to only %2 open files"
msgstr ""
-#: globals.cc:217
+#: globals.cc:226
msgid "Could not get system open files limit (%1)"
msgstr ""
-#: globals.cc:268
+#: globals.cc:280
msgid "Loading configuration"
msgstr ""
-#: import.cc:207
+#: import.cc:208
msgid "Could not find a source for %1 even though we are updating this file!"
msgstr ""
-#: import.cc:236
+#: import.cc:237
msgid "Unable to create file %1 during import"
msgstr ""
-#: import.cc:262
+#: import.cc:263
msgid "Resampling %1 from %2kHz to %3kHz"
msgstr ""
-#: import.cc:268
+#: import.cc:269
msgid "Copying %1"
msgstr ""
-#: import.cc:446
+#: import.cc:455
msgid "Track %1 of %2 contained no usable MIDI data"
msgstr ""
-#: import.cc:453
+#: import.cc:462
msgid "MIDI file %1 was not readable (no reason available)"
msgstr ""
-#: import.cc:499
+#: import.cc:508
msgid "Import: cannot open input sound file \"%1\""
msgstr ""
-#: import.cc:510
+#: import.cc:519
msgid "Import: error opening MIDI file"
msgstr ""
-#: import.cc:549
+#: import.cc:558
msgid "Loading MIDI file %1"
msgstr ""
-#: import.cc:614
+#: import.cc:623
msgid "Failed to remove some files after failed/cancelled import operation"
msgstr ""
@@ -765,153 +782,153 @@ msgstr ""
msgid "preset %1 (bank %2)"
msgstr ""
-#: internal_send.cc:278 internal_send.cc:279
+#: internal_send.cc:300 internal_send.cc:301
msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
msgstr ""
-#: io.cc:208
+#: io.cc:209
msgid "IO: cannot disconnect port %1 from %2"
msgstr ""
-#: io.cc:343 io.cc:428
+#: io.cc:344 io.cc:431
msgid "IO: cannot register input port %1"
msgstr ""
-#: io.cc:348 io.cc:433
+#: io.cc:349 io.cc:436
msgid "IO: cannot register output port %1"
msgstr ""
-#: io.cc:591 io.cc:647
+#: io.cc:598 io.cc:654
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr ""
-#: io.cc:706
+#: io.cc:713
msgid "in"
msgstr ""
-#: io.cc:706
+#: io.cc:713
msgid "out"
msgstr ""
-#: io.cc:707
+#: io.cc:714
msgid "input"
msgstr "ingång"
-#: io.cc:707
+#: io.cc:714
msgid "output"
msgstr "utgång"
-#: io.cc:717
+#: io.cc:724
msgid "Unknown bundle \"%1\" listed for %2 of %3"
msgstr ""
-#: io.cc:783
+#: io.cc:790
msgid "Bundle %1 was not available - \"%2\" used instead"
msgstr ""
-#: io.cc:786
+#: io.cc:793
msgid "No %1 bundles available as a replacement"
msgstr ""
-#: io.cc:889
+#: io.cc:896
msgid "%1: cannot create I/O ports"
msgstr ""
-#: io.cc:1017 io.cc:1121
+#: io.cc:1024 io.cc:1128
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr ""
-#: io.cc:1022 io.cc:1126
+#: io.cc:1029 io.cc:1133
msgid "bad input string in XML node \"%1\""
msgstr ""
-#: io.cc:1060
+#: io.cc:1067
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr ""
-#: io.cc:1065
+#: io.cc:1072
msgid "IO: bad output string in XML node \"%1\""
msgstr ""
-#: io.cc:1411
+#: io.cc:1417
#, c-format
msgid "%s %u"
msgstr ""
-#: io.cc:1458
+#: io.cc:1464
#, c-format
msgid "%s in"
msgstr ""
-#: io.cc:1460
+#: io.cc:1466
#, c-format
msgid "%s out"
msgstr ""
-#: io.cc:1535 session.cc:686 session.cc:715
+#: io.cc:1541 session.cc:689 session.cc:718
msgid "mono"
msgstr ""
-#: io.cc:1537 session.cc:699 session.cc:729
+#: io.cc:1543 session.cc:702 session.cc:732
msgid "L"
msgstr ""
-#: io.cc:1537 session.cc:701 session.cc:731
+#: io.cc:1543 session.cc:704 session.cc:734
msgid "R"
msgstr ""
-#: io.cc:1539 io.cc:1545
+#: io.cc:1545 io.cc:1551
#, c-format
msgid "%d"
msgstr ""
-#: ladspa_plugin.cc:86
+#: ladspa_plugin.cc:93
+msgid "LADSPA: Unable to open module: "
+msgstr ""
+
+#: ladspa_plugin.cc:99
msgid "LADSPA: module has no descriptor function."
msgstr ""
-#: ladspa_plugin.cc:91
+#: ladspa_plugin.cc:106
msgid "LADSPA: plugin has gone away since discovery!"
msgstr ""
-#: ladspa_plugin.cc:98
+#: ladspa_plugin.cc:113
msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
msgstr ""
-#: ladspa_plugin.cc:297
+#: ladspa_plugin.cc:311
msgid ""
"illegal parameter number used with plugin \"%1\". This may indicate a change "
"in the plugin design, and presets may be invalid"
msgstr ""
-#: ladspa_plugin.cc:376 ladspa_plugin.cc:426
+#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr ""
-#: ladspa_plugin.cc:391 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
msgid "LADSPA: no ladspa port number"
msgstr ""
-#: ladspa_plugin.cc:397 ladspa_plugin.cc:446
+#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
msgid "LADSPA: no ladspa port data"
msgstr ""
-#: ladspa_plugin.cc:717
-msgid "LADSPA: cannot load module from \"%1\""
-msgstr ""
-
-#: ladspa_plugin.cc:827
+#: ladspa_plugin.cc:840
msgid "Could not locate HOME. Preset not removed."
msgstr ""
-#: ladspa_plugin.cc:864 ladspa_plugin.cc:870
+#: ladspa_plugin.cc:879 ladspa_plugin.cc:885
msgid "Could not create %1. Preset not saved. (%2)"
msgstr ""
-#: ladspa_plugin.cc:877
+#: ladspa_plugin.cc:892
msgid "Error saving presets file %1."
msgstr ""
-#: ladspa_plugin.cc:915
+#: ladspa_plugin.cc:934
msgid "Could not locate HOME. Preset not saved."
msgstr ""
@@ -951,7 +968,7 @@ msgstr ""
msgid "incorrect XML mode passed to Locations::set_state"
msgstr ""
-#: location.cc:842 session.cc:4516 session_state.cc:1031
+#: location.cc:842 session.cc:4533 session_state.cc:1025
msgid "session"
msgstr ""
@@ -1006,40 +1023,39 @@ msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
msgstr ""
#: ltc_slave.cc:591
-#, c-format
msgid "flywheel"
msgstr ""
-#: midi_diskstream.cc:167
+#: midi_diskstream.cc:166
msgid ""
"%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
msgstr ""
-#: midi_diskstream.cc:219
+#: midi_diskstream.cc:218
msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
msgstr ""
-#: midi_diskstream.cc:270
+#: midi_diskstream.cc:269
msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
-#: midi_diskstream.cc:699
+#: midi_diskstream.cc:698
msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-#: midi_diskstream.cc:834
+#: midi_diskstream.cc:833
msgid "MidiDiskstream %1: cannot write to disk"
msgstr ""
-#: midi_diskstream.cc:868
+#: midi_diskstream.cc:867
msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: midi_diskstream.cc:955
+#: midi_diskstream.cc:954
msgid "%1: could not create region for complete midi file"
msgstr ""
-#: midi_diskstream.cc:992
+#: midi_diskstream.cc:991
msgid "MidiDiskstream: could not create region for captured midi!"
msgstr ""
@@ -1051,27 +1067,27 @@ msgstr ""
msgid "No SysExID found for sys-ex property change - ignored"
msgstr ""
-#: midi_model.cc:2010
+#: midi_model.cc:2012
msgid "transpose"
msgstr ""
-#: midi_patch_manager.cc:126
+#: midi_patch_manager.cc:127
msgid "Duplicate MIDI device `%1' in `%2' ignored"
msgstr ""
-#: midi_source.cc:125
+#: midi_source.cc:124
msgid "Missing parameter property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:132
+#: midi_source.cc:131
msgid "Missing style property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:144
+#: midi_source.cc:143
msgid "Missing parameter property on AutomationState"
msgstr ""
-#: midi_source.cc:151
+#: midi_source.cc:150
msgid "Missing state property on AutomationState"
msgstr ""
@@ -1115,21 +1131,21 @@ msgstr ""
msgid "solo control"
msgstr ""
-#: mtc_slave.cc:238
+#: mtc_slave.cc:240
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr ""
-#: mtc_slave.cc:361
+#: mtc_slave.cc:362
msgid ""
"Unknown rate/drop value %1 in incoming MTC stream, session values used "
"instead"
msgstr ""
-#: mtc_slave.cc:381
+#: mtc_slave.cc:382
msgid "Session framerate adjusted from %1 TO: MTC's %2."
msgstr ""
-#: mtc_slave.cc:395
+#: mtc_slave.cc:396
msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
msgstr ""
@@ -1189,31 +1205,35 @@ msgstr ""
msgid "Pannable given XML data for %1 - ignored"
msgstr ""
-#: panner_manager.cc:76
-msgid "looking for panners in %1"
+#: panner_manager.cc:80
+msgid "looking for panners in %1\n"
msgstr ""
-#: panner_manager.cc:100
-msgid "Panner discovered: \"%1\" in %2"
+#: panner_manager.cc:108
+msgid "Panner discovered: \"%1\" in %2\n"
msgstr ""
-#: panner_manager.cc:117
+#: panner_manager.cc:125
msgid "PannerManager: cannot load module \"%1\" (%2)"
msgstr ""
-#: panner_manager.cc:124
+#: panner_manager.cc:132
msgid "PannerManager: module \"%1\" has no descriptor function."
msgstr ""
-#: panner_manager.cc:187
+#: panner_manager.cc:219
msgid "no panner discovered for in/out = %1/%2"
msgstr ""
-#: panner_shell.cc:179
+#: panner_shell.cc:126
+msgid "select panner: %1\n"
+msgstr ""
+
+#: panner_shell.cc:245
msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
msgstr ""
-#: panner_shell.cc:185
+#: panner_shell.cc:251
msgid "panner plugin node has no type information!"
msgstr ""
@@ -1233,19 +1253,19 @@ msgstr ""
msgid "Could not construct playlist for PlaylistSource from session data!"
msgstr ""
-#: plugin.cc:324
+#: plugin.cc:328
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin.cc:398
+#: plugin.cc:402
msgid ""
"Saving plugin settings is not supported in this build of %1. Consider paying "
"for the full version"
msgstr ""
-#: plugin_insert.cc:598
+#: plugin_insert.cc:589
msgid "programming error: "
msgstr ""
@@ -1279,43 +1299,43 @@ msgstr ""
msgid "PluginInsert: automatable control %1 not found - ignored"
msgstr ""
-#: plugin_manager.cc:161
+#: plugin_manager.cc:165
msgid "Discovering Plugins"
msgstr ""
-#: plugin_manager.cc:335
+#: plugin_manager.cc:286
msgid "Could not parse rdf file: %1"
msgstr ""
-#: plugin_manager.cc:374
+#: plugin_manager.cc:330
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr ""
-#: plugin_manager.cc:381
+#: plugin_manager.cc:337
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr ""
-#: plugin_manager.cc:602
+#: plugin_manager.cc:567
msgid ""
"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
"at this time"
msgstr ""
-#: plugin_manager.cc:709
+#: plugin_manager.cc:680
msgid ""
"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
"in %2 at this time"
msgstr ""
-#: plugin_manager.cc:870
+#: plugin_manager.cc:841
msgid "unknown plugin status type \"%1\" - all entries ignored"
msgstr ""
-#: plugin_manager.cc:887
+#: plugin_manager.cc:858
msgid "unknown plugin type \"%1\" - ignored"
msgstr ""
-#: port.cc:410
+#: port.cc:412
msgid "could not reregister %1"
msgstr ""
@@ -1323,11 +1343,11 @@ msgstr ""
msgid "insert %1"
msgstr ""
-#: port_insert.cc:198
+#: port_insert.cc:197
msgid "XML node describing port insert is missing the `type' field"
msgstr ""
-#: port_insert.cc:203
+#: port_insert.cc:202
msgid "non-port insert XML used for port plugin insert"
msgstr ""
@@ -1359,11 +1379,11 @@ msgstr "AudioEngine: kan inte ansluta %1 (%2) till %3 (%4)"
msgid "Re-establising port %1 failed"
msgstr ""
-#: processor.cc:207
+#: processor.cc:208
msgid "No %1 property flag in element %2"
msgstr ""
-#: processor.cc:216
+#: processor.cc:217
msgid "No child node with active property"
msgstr ""
@@ -1427,11 +1447,11 @@ msgstr ""
msgid "cannot create new name for region \"%1\""
msgstr ""
-#: resampled_source.cc:98
+#: resampled_source.cc:102
msgid "Import: %1"
msgstr ""
-#: resampled_source.cc:128
+#: resampled_source.cc:132 srcfilesource.cc:76
msgid "Import: src_new() failed : %1"
msgstr ""
@@ -1439,27 +1459,27 @@ msgstr ""
msgid "return %1"
msgstr ""
-#: route.cc:1075 route.cc:2528
+#: route.cc:1081 route.cc:2541
msgid "unknown Processor type \"%1\"; ignored"
msgstr ""
-#: route.cc:1087
+#: route.cc:1093
msgid "processor could not be created. Ignored."
msgstr ""
-#: route.cc:1962 route.cc:2187
+#: route.cc:1975 route.cc:2200
msgid "Bad node sent to Route::set_state() [%1]"
msgstr ""
-#: route.cc:2022
+#: route.cc:2035
msgid "Pannable state found for route (%1) without a panner!"
msgstr ""
-#: route.cc:2096 route.cc:2100 route.cc:2301 route.cc:2305
+#: route.cc:2109 route.cc:2113 route.cc:2314 route.cc:2318
msgid "badly formed order key string in state file! [%1] ... ignored."
msgstr ""
-#: route.cc:2311
+#: route.cc:2324
msgid "Converting deprecated order key for %1 using Editor order %2"
msgstr ""
@@ -1475,15 +1495,15 @@ msgstr ""
msgid "error writing tempo-adjusted data to %1"
msgstr ""
-#: send.cc:59
+#: send.cc:60
msgid "aux %1"
msgstr ""
-#: send.cc:63
+#: send.cc:64
msgid "send %1"
msgstr ""
-#: send.cc:65
+#: send.cc:66
msgid "programming error: send created using role %1"
msgstr ""
@@ -1507,147 +1527,147 @@ msgstr ""
msgid "Set up standard connections"
msgstr ""
-#: session.cc:635
+#: session.cc:638
msgid "could not setup Click I/O"
msgstr ""
-#: session.cc:683
+#: session.cc:686
#, c-format
msgid "out %<PRIu32>"
msgstr ""
-#: session.cc:697
+#: session.cc:700
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr ""
-#: session.cc:712
+#: session.cc:715
#, c-format
msgid "in %<PRIu32>"
msgstr ""
-#: session.cc:726
+#: session.cc:729
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr ""
-#: session.cc:790
+#: session.cc:793
msgid "cannot connect master output %1 to %2"
msgstr ""
-#: session.cc:849
+#: session.cc:862
msgid "monitor"
msgstr ""
-#: session.cc:894
+#: session.cc:907
msgid "cannot connect control input %1 to %2"
msgstr ""
-#: session.cc:914
+#: session.cc:927
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr ""
-#: session.cc:945
+#: session.cc:958
msgid "cannot connect control output %1 to %2"
msgstr ""
-#: session.cc:1009
+#: session.cc:1026
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr ""
-#: session.cc:1193
+#: session.cc:1210
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
-#: session.cc:1233
+#: session.cc:1250
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
msgstr ""
-#: session.cc:1547
+#: session.cc:1564
msgid "feedback loop setup between %1 and %2"
msgstr ""
-#: session.cc:1843
+#: session.cc:1860
msgid "Session: could not create new midi track."
msgstr ""
-#: session.cc:1849
+#: session.cc:1866
msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks."
msgstr ""
-#: session.cc:2026 session.cc:2029
+#: session.cc:2043 session.cc:2046
msgid "Audio"
msgstr ""
-#: session.cc:2053 session.cc:2061 session.cc:2138 session.cc:2146
+#: session.cc:2070 session.cc:2078 session.cc:2155 session.cc:2163
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr ""
-#: session.cc:2084
+#: session.cc:2101
msgid "Session: could not create new audio track."
msgstr ""
-#: session.cc:2116 session.cc:2119
+#: session.cc:2133 session.cc:2136
msgid "Bus"
msgstr ""
-#: session.cc:2169
+#: session.cc:2186
msgid "Session: could not create new audio route."
msgstr ""
-#: session.cc:2228 session.cc:2238
+#: session.cc:2245 session.cc:2255
msgid "Session: UINT_MAX routes? impossible!"
msgstr ""
-#: session.cc:2260
+#: session.cc:2277
msgid "Session: cannot create track/bus from template description"
msgstr ""
-#: session.cc:2286
+#: session.cc:2303
msgid "Session: could not create new route from template"
msgstr ""
-#: session.cc:2315
+#: session.cc:2332
msgid "Adding new tracks/busses failed"
msgstr ""
-#: session.cc:3419
+#: session.cc:3436
msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename"
msgstr ""
-#: session.cc:3539 session.cc:3597
+#: session.cc:3556 session.cc:3614
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr ""
-#: session.cc:3987
+#: session.cc:4004
msgid "send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:3999
+#: session.cc:4016
msgid "aux send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4011
+#: session.cc:4028
msgid "return ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4023
+#: session.cc:4040
msgid "insert ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4150
+#: session.cc:4167
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr ""
-#: session.cc:4179
+#: session.cc:4196
msgid "too many bounced versions of playlist \"%1\""
msgstr ""
-#: session.cc:4189
+#: session.cc:4206
msgid "cannot create new audio file \"%1\" for %2"
msgstr ""
@@ -1682,7 +1702,7 @@ msgstr ""
msgid "Session subdirectory does not exist at path %1"
msgstr ""
-#: session_events.cc:184
+#: session_events.cc:185
msgid "Session: cannot have two events of type %1 at the same frame (%2)."
msgstr ""
@@ -1694,13 +1714,13 @@ msgstr ""
msgid "Export ended unexpectedly: %1"
msgstr ""
-#: session_ltc.cc:222
+#: session_ltc.cc:221
msgid ""
"LTC encoder: invalid framerate - LTC encoding is disabled for the remainder "
"of this session."
msgstr ""
-#: session_midi.cc:520
+#: session_midi.cc:519
msgid "Session: cannot send quarter-frame MTC message (%1)"
msgstr ""
@@ -1712,350 +1732,342 @@ msgstr ""
msgid "Session: error in no roll for %1"
msgstr ""
-#: session_process.cc:1157
+#: session_process.cc:1159
msgid "Programming error: illegal event type in process_event (%1)"
msgstr ""
-#: session_state.cc:140
-msgid "Could not use path %1 (%2)"
-msgstr ""
-
-#: session_state.cc:184
+#: session_state.cc:178
msgid "solo cut control (dB)"
msgstr ""
-#: session_state.cc:208
+#: session_state.cc:202
msgid "Set block size and sample rate"
msgstr ""
-#: session_state.cc:213
+#: session_state.cc:207
msgid "Using configuration"
msgstr ""
-#: session_state.cc:325
+#: session_state.cc:319
msgid "Reset Remote Controls"
msgstr ""
-#: session_state.cc:417
+#: session_state.cc:411
msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:424
+#: session_state.cc:418
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr ""
-#: session_state.cc:431
+#: session_state.cc:425
msgid "Session: cannot create session midi dir \"%1\" (%2)"
msgstr ""
-#: session_state.cc:438
+#: session_state.cc:432
msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:445
+#: session_state.cc:439
msgid "Session: cannot create session export folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:452
+#: session_state.cc:446
msgid "Session: cannot create session analysis folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:459
+#: session_state.cc:453
msgid "Session: cannot create session plugins folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:466
+#: session_state.cc:460
msgid "Session: cannot create session externals folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:480
+#: session_state.cc:474
msgid "Session: cannot create session folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:514
+#: session_state.cc:508
msgid "Could not open %1 for writing session template"
msgstr ""
-#: session_state.cc:520
+#: session_state.cc:514
msgid "Could not open session template %1 for reading"
msgstr ""
-#: session_state.cc:539
+#: session_state.cc:533
msgid "master"
msgstr ""
-#: session_state.cc:600
+#: session_state.cc:594
msgid "Could not remove pending capture state at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:624
+#: session_state.cc:618
msgid "could not rename snapshot %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:652
+#: session_state.cc:646
msgid "Could not remove session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:669
+#: session_state.cc:663
msgid ""
"the %1 audio engine is not connected and state saving would lose all I/O "
"connections. Session not saved"
msgstr ""
-#: session_state.cc:720
+#: session_state.cc:714
msgid "state could not be saved to %1"
msgstr ""
-#: session_state.cc:722 session_state.cc:733
+#: session_state.cc:716 session_state.cc:727
msgid "Could not remove temporary session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:730
-msgid "could not rename temporary session file %1 to %2"
+#: session_state.cc:724
+msgid "could not rename temporary session file %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:798
+#: session_state.cc:792
msgid "%1: session file \"%2\" doesn't exist!"
msgstr ""
-#: session_state.cc:810
+#: session_state.cc:804
msgid "Could not understand session file %1"
msgstr ""
-#: session_state.cc:819
+#: session_state.cc:813
msgid "Session file %1 is not a session"
msgstr ""
-#: session_state.cc:1125
+#: session_state.cc:1119
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
-#: session_state.cc:1179
+#: session_state.cc:1173
msgid "Session: XML state has no options section"
msgstr ""
-#: session_state.cc:1184
+#: session_state.cc:1178
msgid "Session: XML state has no metadata section"
msgstr ""
-#: session_state.cc:1195
+#: session_state.cc:1189
msgid "Session: XML state has no sources section"
msgstr ""
-#: session_state.cc:1202
+#: session_state.cc:1196
msgid "Session: XML state has no Tempo Map section"
msgstr ""
-#: session_state.cc:1209
+#: session_state.cc:1203
msgid "Session: XML state has no locations section"
msgstr ""
-#: session_state.cc:1235
+#: session_state.cc:1229
msgid "Session: XML state has no Regions section"
msgstr ""
-#: session_state.cc:1242
+#: session_state.cc:1236
msgid "Session: XML state has no playlists section"
msgstr ""
-#: session_state.cc:1262
+#: session_state.cc:1256
msgid "Session: XML state has no bundles section"
msgstr ""
-#: session_state.cc:1274
+#: session_state.cc:1268
msgid "Session: XML state has no diskstreams section"
msgstr ""
-#: session_state.cc:1282
+#: session_state.cc:1276
msgid "Session: XML state has no routes section"
msgstr ""
-#: session_state.cc:1294
+#: session_state.cc:1288
msgid "Session: XML state has no route groups section"
msgstr ""
-#: session_state.cc:1303
+#: session_state.cc:1297
msgid "Session: XML state has no edit groups section"
msgstr ""
-#: session_state.cc:1310
+#: session_state.cc:1304
msgid "Session: XML state has no mix groups section"
msgstr ""
-#: session_state.cc:1318
+#: session_state.cc:1312
msgid "Session: XML state has no click section"
msgstr ""
-#: session_state.cc:1360
+#: session_state.cc:1354
msgid "Session: cannot create Route from XML description."
msgstr ""
-#: session_state.cc:1364
+#: session_state.cc:1358
msgid "Loaded track/bus %1"
msgstr ""
-#: session_state.cc:1462
+#: session_state.cc:1456
msgid "Could not find diskstream for route"
msgstr ""
-#: session_state.cc:1516
+#: session_state.cc:1510
msgid "Session: cannot create Region from XML description."
msgstr ""
-#: session_state.cc:1520
+#: session_state.cc:1514
msgid "Can not load state for region '%1'"
msgstr ""
-#: session_state.cc:1556
+#: session_state.cc:1550
msgid "Regions in compound description not found (ID's %1 and %2): ignored"
msgstr ""
-#: session_state.cc:1584
+#: session_state.cc:1578
msgid "Nested source has no ID info in session file! (ignored)"
msgstr ""
-#: session_state.cc:1596
+#: session_state.cc:1590
msgid "Cannot reconstruct nested source for region %1"
msgstr ""
-#: session_state.cc:1658
+#: session_state.cc:1652
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707
+#: session_state.cc:1660 session_state.cc:1681 session_state.cc:1701
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713
+#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
msgstr ""
-#: session_state.cc:1736
+#: session_state.cc:1730
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
msgstr ""
-#: session_state.cc:1770
+#: session_state.cc:1764
msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1778
+#: session_state.cc:1772
msgid ""
"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1784
+#: session_state.cc:1778
msgid ""
"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
msgstr ""
-#: session_state.cc:1852
+#: session_state.cc:1846
msgid ""
"cannot create new file from region name \"%1\" with ident = \"%2\": too many "
"existing files with similar names"
msgstr ""
-#: session_state.cc:1875
+#: session_state.cc:1869
msgid "Session: cannot create Source from XML description."
msgstr ""
-#: session_state.cc:1909
+#: session_state.cc:1903
msgid "A sound file is missing. It will be replaced by silence."
msgstr ""
-#: session_state.cc:1932
+#: session_state.cc:1926
msgid "Found a sound file that cannot be used by %1. Talk to the progammers."
msgstr ""
-#: session_state.cc:1949
+#: session_state.cc:1943
msgid "Could not create templates directory \"%1\" (%2)"
msgstr ""
-#: session_state.cc:1962
+#: session_state.cc:1956
msgid "Template \"%1\" already exists - new version not created"
msgstr ""
-#: session_state.cc:1968
+#: session_state.cc:1962
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr ""
-#: session_state.cc:1978
+#: session_state.cc:1972
msgid "template not saved"
msgstr ""
-#: session_state.cc:1988
+#: session_state.cc:1982
msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
msgstr ""
-#: session_state.cc:2183
+#: session_state.cc:2225
msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr ""
-#: session_state.cc:2725 session_state.cc:2731
-msgid "Cannot expand path %1 (%2)"
-msgstr ""
-
-#: session_state.cc:2784
+#: session_state.cc:2820
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:2823
+#: session_state.cc:2859
msgid "cannot rename unused file source from %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:2841
+#: session_state.cc:2877
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr ""
-#: session_state.cc:3143
+#: session_state.cc:3179
msgid "could not backup old history file, current history not saved"
msgstr ""
-#: session_state.cc:3156
+#: session_state.cc:3192
msgid "history could not be saved to %1"
msgstr ""
-#: session_state.cc:3159
+#: session_state.cc:3195
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:3163
+#: session_state.cc:3199
msgid "could not restore history file from backup %1 (%2)"
msgstr ""
-#: session_state.cc:3188
+#: session_state.cc:3224
msgid "%1: no history file \"%2\" for this session."
msgstr ""
-#: session_state.cc:3194
+#: session_state.cc:3230
msgid "Could not understand session history file \"%1\""
msgstr ""
-#: session_state.cc:3236
+#: session_state.cc:3272
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr ""
-#: session_state.cc:3247
+#: session_state.cc:3283
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr ""
-#: session_state.cc:3258
+#: session_state.cc:3294
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr ""
-#: session_state.cc:3266
+#: session_state.cc:3302
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr ""
-#: session_state.cc:3502
+#: session_state.cc:3538
msgid "Session: unknown diskstream type in XML"
msgstr ""
-#: session_state.cc:3507
+#: session_state.cc:3543
msgid "Session: could not load diskstream via XML state"
msgstr ""
@@ -2079,198 +2091,206 @@ msgid ""
"control"
msgstr ""
-#: smf_source.cc:252
+#: smf_source.cc:262
msgid "Unable to read event prefix, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:265
+#: smf_source.cc:275
msgid "Event has time and size but no body, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:271
+#: smf_source.cc:281
msgid "Event time is before MIDI source position"
msgstr ""
-#: smf_source.cc:306 smf_source.cc:345
+#: smf_source.cc:316 smf_source.cc:355
msgid "Skipping event with unordered time %1"
msgstr ""
-#: smf_source.cc:410
+#: smf_source.cc:420
msgid "cannot open MIDI file %1 for write"
msgstr ""
-#: sndfile_helpers.cc:32
+#: sndfile_helpers.cc:34
msgid "WAV"
msgstr ""
-#: sndfile_helpers.cc:33
+#: sndfile_helpers.cc:35
msgid "AIFF"
msgstr ""
-#: sndfile_helpers.cc:34
+#: sndfile_helpers.cc:36
msgid "CAF"
msgstr ""
-#: sndfile_helpers.cc:35
+#: sndfile_helpers.cc:37
msgid "W64 (64 bit WAV)"
msgstr ""
-#: sndfile_helpers.cc:36
+#: sndfile_helpers.cc:38
msgid "FLAC"
msgstr ""
-#: sndfile_helpers.cc:37
+#: sndfile_helpers.cc:39
msgid "Ogg/Vorbis"
msgstr ""
-#: sndfile_helpers.cc:38
+#: sndfile_helpers.cc:40
msgid "raw (no header)"
msgstr ""
-#: sndfile_helpers.cc:43
+#: sndfile_helpers.cc:45
msgid ".wav"
msgstr ""
-#: sndfile_helpers.cc:44
+#: sndfile_helpers.cc:46
msgid ".aiff"
msgstr ""
-#: sndfile_helpers.cc:45
+#: sndfile_helpers.cc:47
msgid ".caf"
msgstr ""
-#: sndfile_helpers.cc:46
+#: sndfile_helpers.cc:48
msgid ".w64"
msgstr ""
-#: sndfile_helpers.cc:47
+#: sndfile_helpers.cc:49
msgid ".flac"
msgstr ""
-#: sndfile_helpers.cc:48
+#: sndfile_helpers.cc:50
msgid ".ogg"
msgstr ""
-#: sndfile_helpers.cc:49
+#: sndfile_helpers.cc:51
msgid ".raw"
msgstr ""
-#: sndfile_helpers.cc:64
+#: sndfile_helpers.cc:66
msgid "Signed 16 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:65
+#: sndfile_helpers.cc:67
msgid "Signed 24 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:66
+#: sndfile_helpers.cc:68
msgid "Signed 32 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:67
+#: sndfile_helpers.cc:69
msgid "Signed 8 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:68
+#: sndfile_helpers.cc:70
msgid "32 bit float"
msgstr ""
-#: sndfile_helpers.cc:81
+#: sndfile_helpers.cc:83
msgid "Little-endian (Intel)"
msgstr ""
-#: sndfile_helpers.cc:82
+#: sndfile_helpers.cc:84
msgid "Big-endian (PowerPC)"
msgstr ""
-#: sndfilesource.cc:201
+#: sndfilesource.cc:210
msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
msgstr ""
-#: sndfilesource.cc:209
+#: sndfilesource.cc:218
msgid ""
"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
"number"
msgstr ""
-#: sndfilesource.cc:255 sndfilesource.cc:571 sndfilesource.cc:595
+#: sndfilesource.cc:264 sndfilesource.cc:604 sndfilesource.cc:628
msgid ""
"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
"for this file"
msgstr ""
-#: sndfilesource.cc:302
+#: sndfilesource.cc:311
msgid "could not allocate file %1 for reading."
msgstr ""
-#: sndfilesource.cc:337
+#: sndfilesource.cc:346
msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
msgstr ""
-#: sndfilesource.cc:347
+#: sndfilesource.cc:356
msgid ""
"SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
msgstr ""
-#: sndfilesource.cc:391 sndfilesource.cc:420
+#: sndfilesource.cc:400 sndfilesource.cc:429
msgid "attempt to write a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:396 utils.cc:510 utils.cc:534 utils.cc:548 utils.cc:567
+#: sndfilesource.cc:405 utils.cc:547 utils.cc:571 utils.cc:585 utils.cc:604
msgid "programming error: %1 %2"
msgstr ""
-#: sndfilesource.cc:523
+#: sndfilesource.cc:532 sndfilesource.cc:562
msgid "attempt to flush a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:528
+#: sndfilesource.cc:537 sndfilesource.cc:557
msgid "attempt to flush an un-opened audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:534
+#: sndfilesource.cc:543
msgid "could not allocate file %1 to write header"
msgstr ""
-#: sndfilesource.cc:548
+#: sndfilesource.cc:568
+msgid "could not allocate file %1 to flush contents"
+msgstr ""
+
+#: sndfilesource.cc:581
msgid ""
"attempt to store broadcast info in a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:553
+#: sndfilesource.cc:586
msgid "attempt to set BWF info for an un-opened audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:614
+#: sndfilesource.cc:647
msgid "%1: cannot seek to %2 (libsndfile error: %3)"
msgstr ""
-#: sndfilesource.cc:727
+#: sndfilesource.cc:760
msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
msgstr ""
-#: sndfilesource.cc:740 sndfilesource.cc:790 sndfilesource.cc:797
+#: sndfilesource.cc:773 sndfilesource.cc:823 sndfilesource.cc:830
msgid "SndFileSource: \"%1\" bad write (%2)"
msgstr ""
-#: sndfilesource.cc:820
+#: sndfilesource.cc:853
msgid ""
"Filesource: start time is already set for existing file (%1): Cannot change "
"start time."
msgstr ""
-#: speakers.cc:239
+#: speakers.cc:280
msgid "Speaker information is missing azimuth - speaker ignored"
msgstr ""
-#: speakers.cc:245
+#: speakers.cc:286
msgid "Speaker information is missing elevation - speaker ignored"
msgstr ""
-#: speakers.cc:251
+#: speakers.cc:292
msgid "Speaker information is missing distance - speaker ignored"
msgstr ""
+#: srcfilesource.cc:135
+msgid "SrcFileSource: %1"
+msgstr ""
+
#: tape_file_matcher.cc:46
msgid "Cannot compile tape track regexp for use (%1)"
msgstr ""
@@ -2418,54 +2438,54 @@ msgstr ""
msgid "Node for Port has no \"name\" property"
msgstr ""
-#: utils.cc:358 utils.cc:382
+#: utils.cc:395 utils.cc:419
msgid "Splice"
msgstr "Skarv"
-#: utils.cc:360 utils.cc:375
+#: utils.cc:397 utils.cc:412
msgid "Slide"
msgstr "Glid"
-#: utils.cc:362 utils.cc:378
+#: utils.cc:399 utils.cc:415
msgid "Lock"
msgstr "LÃ¥s"
-#: utils.cc:365
+#: utils.cc:402
msgid "programming error: unknown edit mode string \"%1\""
msgstr ""
-#: utils.cc:389 utils.cc:421
+#: utils.cc:426 utils.cc:458
msgid "MIDI Timecode"
msgstr ""
-#: utils.cc:389 utils.cc:419
+#: utils.cc:426 utils.cc:456
msgid "MTC"
msgstr ""
-#: utils.cc:393 utils.cc:428
+#: utils.cc:430 utils.cc:465
msgid "MIDI Clock"
msgstr ""
-#: utils.cc:397 utils.cc:415 utils.cc:435
+#: utils.cc:434 utils.cc:452 utils.cc:472
msgid "JACK"
msgstr ""
-#: utils.cc:401
+#: utils.cc:438
msgid "programming error: unknown sync source string \"%1\""
msgstr ""
-#: utils.cc:426
+#: utils.cc:463
msgid "M-Clock"
msgstr ""
-#: utils.cc:432
+#: utils.cc:469
msgid "LTC"
msgstr ""
-#: utils.cc:602
+#: utils.cc:639
msgid "programming error: unknown native header format: %1"
msgstr ""
-#: utils.cc:617
+#: utils.cc:654
msgid "cannot open directory %1 (%2)"
msgstr ""
diff --git a/libs/ardour/po/zh.po b/libs/ardour/po/zh.po
index d39877d9f5..bf937f2a0a 100644
--- a/libs/ardour/po/zh.po
+++ b/libs/ardour/po/zh.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Ardour 3\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-11-05 11:11-0500\n"
+"POT-Creation-Date: 2014-02-10 17:53+0100\n"
"PO-Revision-Date: 2012-08-26 13:43+0800\n"
"Last-Translator: Rui-huai Zhang <zrhzrh>\n"
"Language-Team: zrhzrh <zrhzrh@mail.ustc.edu.cn>\n"
@@ -21,64 +21,64 @@ msgstr ""
msgid "Fader"
msgstr ""
-#: audio_diskstream.cc:244
+#: audio_diskstream.cc:242
msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
msgstr ""
-#: audio_diskstream.cc:296
+#: audio_diskstream.cc:294
msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
-#: audio_diskstream.cc:848 audio_diskstream.cc:858
+#: audio_diskstream.cc:846 audio_diskstream.cc:856
msgid ""
"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
msgstr ""
-#: audio_diskstream.cc:1014
+#: audio_diskstream.cc:1012
msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-#: audio_diskstream.cc:1383 audio_diskstream.cc:1400
+#: audio_diskstream.cc:1381 audio_diskstream.cc:1398
msgid "AudioDiskstream %1: cannot write to disk"
msgstr "音频ç£ç›˜æµ %1: 无法å¸å…¥åˆ°ç¡¬ç›˜"
-#: audio_diskstream.cc:1443
+#: audio_diskstream.cc:1441
msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: audio_diskstream.cc:1537
+#: audio_diskstream.cc:1535
msgid "%1: could not create region for complete audio file"
msgstr ""
-#: audio_diskstream.cc:1571
+#: audio_diskstream.cc:1569
msgid "AudioDiskstream: could not create region for captured audio!"
msgstr ""
-#: audio_diskstream.cc:1679
+#: audio_diskstream.cc:1677
msgid "programmer error: %1"
msgstr "程åºé”™è¯¯: %1"
-#: audio_diskstream.cc:1905
+#: audio_diskstream.cc:1903
msgid "AudioDiskstream: channel %1 out of range"
msgstr "音频ç£ç›˜æµ: å£°é“ %1 超出范围"
-#: audio_diskstream.cc:1919 midi_diskstream.cc:1210
+#: audio_diskstream.cc:1917 midi_diskstream.cc:1209
msgid "%1:%2 new capture file not initialized correctly"
msgstr ""
-#: audio_diskstream.cc:2200
+#: audio_diskstream.cc:2198
msgid "%1: cannot restore pending capture source file %2"
msgstr ""
-#: audio_diskstream.cc:2222
+#: audio_diskstream.cc:2220
msgid "%1: incorrect number of pending sources listed - ignoring them all"
msgstr ""
-#: audio_diskstream.cc:2246
+#: audio_diskstream.cc:2244
msgid "%1: cannot create whole-file region from pending capture sources"
msgstr ""
-#: audio_library.cc:71
+#: audio_library.cc:81
msgid "Could not open %1. Audio Library not saved"
msgstr "无法打开 %1. 音频库未ä¿å­˜"
@@ -118,11 +118,11 @@ msgstr ""
msgid "Audio Playlists (unused)"
msgstr "音频播放列表(未使用)"
-#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529
+#: audio_playlist_source.cc:171 audiosource.cc:891 file_source.cc:520
#: midi_playlist_source.cc:144 midi_playlist_source.cc:152
-#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643
-#: rb_effect.cc:333 session.cc:2619 session.cc:2652 session.cc:3797
-#: session_handle.cc:87 sndfilesource.cc:121
+#: midi_playlist_source.cc:159 midi_source.cc:370 plugin_insert.cc:634
+#: rb_effect.cc:333 session.cc:2636 session.cc:2669 session.cc:3814
+#: session_handle.cc:87 sndfilesource.cc:122
msgid "programming error: %1"
msgstr "程åºé”™è¯¯: %1"
@@ -150,23 +150,23 @@ msgstr ""
"\n"
"声é“:"
-#: audio_track.cc:167
+#: audio_track.cc:161
msgid "Unknown bundle \"%1\" listed for input of %2"
msgstr ""
-#: audio_track.cc:169
+#: audio_track.cc:163
msgid "in 1"
msgstr ""
-#: audio_track.cc:170
+#: audio_track.cc:164
msgid "No input bundles available as a replacement"
msgstr ""
-#: audio_track.cc:174
+#: audio_track.cc:168
msgid "Bundle %1 was not available - \"in 1\" used instead"
msgstr ""
-#: audio_track.cc:183
+#: audio_track.cc:177
msgid "improper input channel list in XML node (%1)"
msgstr ""
@@ -190,23 +190,23 @@ msgstr "无法载入VAMPæ’件 \"%1\""
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr "无法载入VAMPæ’件 \"%1\""
-#: audioengine.cc:488
+#: audioengine.cc:495
msgid "looking for backends in %1\n"
msgstr ""
-#: audioengine.cc:511
+#: audioengine.cc:518
msgid "AudioEngine: cannot load module \"%1\" (%2)"
msgstr ""
-#: audioengine.cc:517
+#: audioengine.cc:524
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr ""
-#: audioengine.cc:589
+#: audioengine.cc:596
msgid "Could not create backend for %1: %2"
msgstr ""
-#: audioregion.cc:1643
+#: audioregion.cc:1651
msgid ""
"You have requested an operation that requires audio analysis.\n"
"\n"
@@ -221,11 +221,11 @@ msgid ""
"this and future transient-detection operations.\n"
msgstr ""
-#: audiosource.cc:199
+#: audiosource.cc:210
msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
msgstr "无法为 %1 é‡å‘½å峰文件(peakfile), 从 %2 到 %3 (%4)"
-#: audiosource.cc:226
+#: audiosource.cc:239
msgid "AudioSource: cannot stat peakfile \"%1\""
msgstr ""
@@ -233,47 +233,68 @@ msgstr ""
msgid "cannot read sample data for unscaled peak computation"
msgstr "无法为无标度的峰计算读å–采样数æ®"
-#: audiosource.cc:387
+#: audiosource.cc:386
msgid "AudioSource: cannot open peakpath (a) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:463
+#: audiosource.cc:395 audiosource.cc:473
+msgid ""
+"AudioSource: could not seek to correct location in peak file \"%1\" (%2)"
+msgstr ""
+
+#: audiosource.cc:453
msgid "AudioSource: cannot open peakpath (b) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:587
+#: audiosource.cc:567
msgid ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
msgstr ""
-#: audiosource.cc:667
+#: audiosource.cc:634
msgid "%1: could not write read raw data for peak computation (%2)"
msgstr ""
-#: audiosource.cc:706
+#: audiosource.cc:672
msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
msgstr ""
-#: audiosource.cc:773 audiosource.cc:886
+#: audiosource.cc:739 audiosource.cc:861
+msgid "%1: could not seek in peak file data (%2)"
+msgstr ""
+
+#: audiosource.cc:744 audiosource.cc:870
msgid "%1: could not write peak file data (%2)"
msgstr ""
-#: audiosource.cc:924
+#: audiosource.cc:903
msgid "could not truncate peakfile %1 to %2 (error: %3)"
msgstr ""
-#: auditioner.cc:87
-msgid "no outputs available for auditioner - manual connection required"
+#: auditioner.cc:95
+msgid "Falling back to Reasonable Synth for Midi Audition"
+msgstr ""
+
+#: auditioner.cc:97
+msgid "No synth for midi-audition found."
msgstr ""
-#: auditioner.cc:135
-msgid "Auditioning of non-audio regions not yet supported"
+#: auditioner.cc:152
+msgid "no outputs available for auditioner - manual connection required"
msgstr ""
-#: auditioner.cc:160
+#: auditioner.cc:392 auditioner.cc:438
msgid "Cannot setup auditioner processing flow for %1 channels"
msgstr ""
+#: auditioner.cc:426
+msgid "Failed to load synth for MIDI-Audition."
+msgstr ""
+
+#: auditioner.cc:445
+msgid "Auditioning of regions other than Audio or Midi is not supported."
+msgstr ""
+
#: automatable.cc:81
msgid "Automation node has no path property"
msgstr ""
@@ -305,23 +326,23 @@ msgid ""
"AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
msgstr ""
-#: butler.cc:91
+#: butler.cc:80
msgid "Cannot create transport request signal pipe (%1)"
msgstr ""
-#: butler.cc:97 butler.cc:103
+#: butler.cc:86 butler.cc:92
msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)"
msgstr ""
-#: butler.cc:109
+#: butler.cc:124
msgid "Session: could not create butler thread"
msgstr "会è¯ï¼šæ— æ³•åˆ›å»ºç®¡å®¶çº¿ç¨‹"
-#: butler.cc:156
+#: butler.cc:165
msgid "poll on butler request pipe failed (%1)"
msgstr ""
-#: butler.cc:163
+#: butler.cc:172
msgid "Error on butler thread request pipe: fd=%1 err=%2"
msgstr ""
@@ -329,55 +350,55 @@ msgstr ""
msgid "Error reading from butler request pipe"
msgstr ""
-#: butler.cc:248
+#: butler.cc:301
msgid "Butler read ahead failure on dstream %1"
msgstr ""
-#: butler.cc:285
+#: butler.cc:338
msgid "Butler write-behind failure on dstream %1"
msgstr ""
-#: control_protocol_manager.cc:134
+#: control_protocol_manager.cc:164
msgid "control protocol name \"%1\" has no descriptor"
msgstr "控制åè®®å称 \"%1\" 没有æ述符"
-#: control_protocol_manager.cc:141
+#: control_protocol_manager.cc:171
msgid "control protocol name \"%1\" could not be initialized"
msgstr "控制åè®®å称 \"%1\" 无法åˆå§‹åŒ–"
-#: control_protocol_manager.cc:201
+#: control_protocol_manager.cc:237
msgid "Instantiating mandatory control protocol %1"
msgstr "实例强制性控制åè®® %1"
-#: control_protocol_manager.cc:222
+#: control_protocol_manager.cc:258
msgid "looking for control protocols in %1\n"
msgstr ""
-#: control_protocol_manager.cc:247
+#: control_protocol_manager.cc:283
msgid "Control protocol %1 not usable"
msgstr ""
-#: control_protocol_manager.cc:264
+#: control_protocol_manager.cc:300
msgid "Control surface protocol discovered: \"%1\"\n"
msgstr ""
-#: control_protocol_manager.cc:282
+#: control_protocol_manager.cc:318
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
msgstr ""
-#: control_protocol_manager.cc:290
+#: control_protocol_manager.cc:324
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr "控制å议管ç†å™¨: æ¨¡å— \"%1\" 没有æ述符函数"
-#: cycle_timer.cc:38
+#: cycle_timer.cc:40
msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
msgstr ""
-#: cycle_timer.cc:50
+#: cycle_timer.cc:52
msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo"
msgstr ""
-#: cycle_timer.cc:73
+#: cycle_timer.cc:75
msgid "cannot locate cpu MHz in /proc/cpuinfo"
msgstr ""
@@ -385,7 +406,7 @@ msgstr ""
msgid "audio"
msgstr "音频"
-#: data_type.cc:28 session.cc:1791 session.cc:1794
+#: data_type.cc:28 session.cc:1808 session.cc:1811
msgid "MIDI"
msgstr "MIDI"
@@ -393,15 +414,15 @@ msgstr "MIDI"
msgid "unknown"
msgstr "未知"
-#: delivery.cc:114
+#: delivery.cc:118
msgid "main outs"
msgstr ""
-#: delivery.cc:117 send.cc:61
+#: delivery.cc:121 send.cc:62
msgid "listen"
msgstr ""
-#: diskstream.cc:303
+#: diskstream.cc:302
msgid "Location \"%1\" not valid for track loop (start >= end)"
msgstr ""
@@ -413,23 +434,23 @@ msgstr "æ— æ³•å¾—åˆ°è¾“å‡ºå£°é“ \"%1\" 的端å£, 丢弃此声é“"
msgid "Export failed: %1"
msgstr "导出失败: %1"
-#: export_filename.cc:118
+#: export_filename.cc:119
msgid "Existing export folder for this session (%1) does not exist - ignored"
msgstr ""
-#: export_filename.cc:229
+#: export_filename.cc:230
msgid "No Time"
msgstr "没时间"
-#: export_filename.cc:238
+#: export_filename.cc:239
msgid "Invalid time format"
msgstr "éžæ³•æ—¶é—´æ ¼å¼"
-#: export_filename.cc:247
+#: export_filename.cc:248
msgid "No Date"
msgstr "无日期"
-#: export_filename.cc:262
+#: export_filename.cc:263
msgid "Invalid date format"
msgstr "éžæ³•æ—¥æœŸæ ¼å¼"
@@ -497,7 +518,7 @@ msgstr "三角形"
msgid "Rectangular"
msgstr "长方形"
-#: export_formats.cc:52 session.cc:5014 session.cc:5030
+#: export_formats.cc:52 session.cc:5006 session.cc:5022
msgid "None"
msgstr ""
@@ -537,15 +558,15 @@ msgstr "Vorbis采样格å¼"
msgid "No sample format"
msgstr "无采样格å¼"
-#: export_handler.cc:335
+#: export_handler.cc:343
msgid "Editor: cannot open \"%1\" as export file for CD marker file"
msgstr ""
-#: export_handler.cc:417 export_handler.cc:420
+#: export_handler.cc:425 export_handler.cc:428
msgid "an error occured while writing a TOC/CUE file: %1"
msgstr ""
-#: export_handler.cc:642 export_handler.cc:700
+#: export_handler.cc:650 export_handler.cc:708
msgid "Cannot convert %1 to Latin-1 text"
msgstr ""
@@ -607,7 +628,7 @@ msgid ""
"configuration"
msgstr ""
-#: file_source.cc:198 session_state.cc:2807
+#: file_source.cc:198 session_state.cc:2843
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr ""
@@ -616,35 +637,35 @@ msgstr ""
msgid "cannot rename file source from %1 to %2 (%3)"
msgstr ""
-#: file_source.cc:250 file_source.cc:378
+#: file_source.cc:248 file_source.cc:372
msgid "FileSource: search path not set"
msgstr "文件æº: 没设置æœç´¢è·¯å¾„"
-#: file_source.cc:313 file_source.cc:448
-msgid "Filesource: cannot find required file (%1): while searching %2"
+#: file_source.cc:309 file_source.cc:439
+msgid "Filesource: cannot find required file (%1)"
msgstr ""
-#: file_source.cc:440
+#: file_source.cc:432
msgid ""
-"FileSource: \"%1\" is ambigous when searching %2\n"
+"FileSource: \"%1\" is ambigous when searching\n"
"\t"
msgstr ""
-#: file_source.cc:494
+#: file_source.cc:484
msgid "Filesource: cannot find required file (%1): %2"
msgstr "文件æº: 无法找到è¦æ±‚的文件 (%1): %2"
-#: file_source.cc:501
+#: file_source.cc:492
msgid "Filesource: cannot check for existing file (%1): %2"
msgstr ""
-#: file_source.cc:535
+#: file_source.cc:526
msgid ""
"Programming error! %1 tried to rename a file over another file! It's safe to "
"continue working, but please report this to the developers."
msgstr ""
-#: file_source.cc:540
+#: file_source.cc:531
msgid "cannot rename file %1 to %2 (%3)"
msgstr "无法é‡å‘½å文件 %1 到 %2 (%3)"
@@ -658,15 +679,15 @@ msgid ""
"cannot run"
msgstr ""
-#: filesystem_paths.cc:91
+#: filesystem_paths.cc:96
msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
msgstr ""
-#: filesystem_paths.cc:107
+#: filesystem_paths.cc:125
msgid "ARDOUR_CONFIG_PATH not set in environment - exiting\n"
msgstr ""
-#: filesystem_paths.cc:127
+#: filesystem_paths.cc:148
msgid "ARDOUR_DATA_PATH not set in environment - exiting\n"
msgstr ""
@@ -678,87 +699,83 @@ msgstr ""
msgid "filter: error creating new file %1 (%2)"
msgstr ""
-#: find_session.cc:51
-msgid "Could not resolve path: %1 (%2)"
-msgstr "无法解决路径: %1 (%2)"
-
-#: find_session.cc:63
+#: find_session.cc:59
msgid "cannot check session path %1 (%2)"
msgstr "无法检查会è¯è·¯å¾„ %1 (%2)"
-#: find_session.cc:89
+#: find_session.cc:85
msgid "cannot check statefile %1 (%2)"
msgstr ""
-#: find_session.cc:125
+#: find_session.cc:121
msgid "%1 is not a snapshot file"
msgstr "%1 ä¸æ˜¯ä¸€ä¸ªå¿«ç…§æ–‡ä»¶"
-#: find_session.cc:142
+#: find_session.cc:138
msgid "cannot determine current working directory (%1)"
msgstr ""
-#: find_session.cc:159
+#: find_session.cc:155
msgid "unknown file type for session %1"
msgstr ""
-#: globals.cc:207
+#: globals.cc:216
msgid "Could not set system open files limit to \"unlimited\""
msgstr ""
-#: globals.cc:209
+#: globals.cc:218
msgid "Could not set system open files limit to %1"
msgstr ""
-#: globals.cc:213
+#: globals.cc:222
msgid "Your system is configured to limit %1 to only %2 open files"
msgstr ""
-#: globals.cc:217
+#: globals.cc:226
msgid "Could not get system open files limit (%1)"
msgstr ""
-#: globals.cc:268
+#: globals.cc:280
msgid "Loading configuration"
msgstr "载入é…ç½®"
-#: import.cc:207
+#: import.cc:208
msgid "Could not find a source for %1 even though we are updating this file!"
msgstr ""
-#: import.cc:236
+#: import.cc:237
msgid "Unable to create file %1 during import"
msgstr "在导入期间无法创建文件 %1"
-#: import.cc:262
+#: import.cc:263
msgid "Resampling %1 from %2kHz to %3kHz"
msgstr ""
-#: import.cc:268
+#: import.cc:269
msgid "Copying %1"
msgstr "å¤åˆ¶ %1 中"
-#: import.cc:446
+#: import.cc:455
msgid "Track %1 of %2 contained no usable MIDI data"
msgstr ""
-#: import.cc:453
+#: import.cc:462
msgid "MIDI file %1 was not readable (no reason available)"
msgstr ""
-#: import.cc:499
+#: import.cc:508
msgid "Import: cannot open input sound file \"%1\""
msgstr ""
-#: import.cc:510
+#: import.cc:519
msgid "Import: error opening MIDI file"
msgstr "导入: 错误打开MIDI文件"
-#: import.cc:549
+#: import.cc:558
msgid "Loading MIDI file %1"
msgstr "载入MIDI文件 %1"
-#: import.cc:614
+#: import.cc:623
msgid "Failed to remove some files after failed/cancelled import operation"
msgstr ""
@@ -770,153 +787,153 @@ msgstr ""
msgid "preset %1 (bank %2)"
msgstr ""
-#: internal_send.cc:278 internal_send.cc:279
+#: internal_send.cc:300 internal_send.cc:301
msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
msgstr ""
-#: io.cc:208
+#: io.cc:209
msgid "IO: cannot disconnect port %1 from %2"
msgstr "IO: 无法失去从 %2 çš„è¿žæŽ¥ç«¯å£ %1"
-#: io.cc:343 io.cc:428
+#: io.cc:344 io.cc:431
msgid "IO: cannot register input port %1"
msgstr "IO: æ— æ³•æ³¨å†Œè¾“å…¥ç«¯å£ %1"
-#: io.cc:348 io.cc:433
+#: io.cc:349 io.cc:436
msgid "IO: cannot register output port %1"
msgstr "æ— æ³•æ³¨å†Œè¾“å‡ºç«¯å£ %1"
-#: io.cc:591 io.cc:647
+#: io.cc:598 io.cc:654
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr "ä¸æ­£ç¡®çš„XMLç¬¦å· \"%1\" 通过IO对象"
-#: io.cc:706
+#: io.cc:713
msgid "in"
msgstr ""
-#: io.cc:706
+#: io.cc:713
msgid "out"
msgstr ""
-#: io.cc:707
+#: io.cc:714
msgid "input"
msgstr "输入"
-#: io.cc:707
+#: io.cc:714
msgid "output"
msgstr "输出"
-#: io.cc:717
+#: io.cc:724
msgid "Unknown bundle \"%1\" listed for %2 of %3"
msgstr ""
-#: io.cc:783
+#: io.cc:790
msgid "Bundle %1 was not available - \"%2\" used instead"
msgstr ""
-#: io.cc:786
+#: io.cc:793
msgid "No %1 bundles available as a replacement"
msgstr ""
-#: io.cc:889
+#: io.cc:896
msgid "%1: cannot create I/O ports"
msgstr "%1: 无法创建I/O端å£"
-#: io.cc:1017 io.cc:1121
+#: io.cc:1024 io.cc:1128
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr ""
-#: io.cc:1022 io.cc:1126
+#: io.cc:1029 io.cc:1133
msgid "bad input string in XML node \"%1\""
msgstr ""
-#: io.cc:1060
+#: io.cc:1067
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr ""
-#: io.cc:1065
+#: io.cc:1072
msgid "IO: bad output string in XML node \"%1\""
msgstr ""
-#: io.cc:1411
+#: io.cc:1417
#, c-format
msgid "%s %u"
msgstr ""
-#: io.cc:1458
+#: io.cc:1464
#, c-format
msgid "%s in"
msgstr ""
-#: io.cc:1460
+#: io.cc:1466
#, c-format
msgid "%s out"
msgstr ""
-#: io.cc:1535 session.cc:686 session.cc:715
+#: io.cc:1541 session.cc:689 session.cc:718
msgid "mono"
msgstr "å•å£°é“"
-#: io.cc:1537 session.cc:699 session.cc:729
+#: io.cc:1543 session.cc:702 session.cc:732
msgid "L"
msgstr ""
-#: io.cc:1537 session.cc:701 session.cc:731
+#: io.cc:1543 session.cc:704 session.cc:734
msgid "R"
msgstr ""
-#: io.cc:1539 io.cc:1545
+#: io.cc:1545 io.cc:1551
#, c-format
msgid "%d"
msgstr ""
-#: ladspa_plugin.cc:86
+#: ladspa_plugin.cc:93
+msgid "LADSPA: Unable to open module: "
+msgstr ""
+
+#: ladspa_plugin.cc:99
msgid "LADSPA: module has no descriptor function."
msgstr "LADSPA: 模å—没有æ述符函数."
-#: ladspa_plugin.cc:91
+#: ladspa_plugin.cc:106
msgid "LADSPA: plugin has gone away since discovery!"
msgstr "LADSPA: 当å‘现æ’件时, æ’件已ç»ä¸è§äº†."
-#: ladspa_plugin.cc:98
+#: ladspa_plugin.cc:113
msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
msgstr ""
-#: ladspa_plugin.cc:297
+#: ladspa_plugin.cc:311
msgid ""
"illegal parameter number used with plugin \"%1\". This may indicate a change "
"in the plugin design, and presets may be invalid"
msgstr ""
-#: ladspa_plugin.cc:376 ladspa_plugin.cc:426
+#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr "å的符å·å‘é€è‡³ LadspaPlugin::set_state"
-#: ladspa_plugin.cc:391 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
msgid "LADSPA: no ladspa port number"
msgstr "LADSPA: 没有 ladspa 端å£æ•°é‡"
-#: ladspa_plugin.cc:397 ladspa_plugin.cc:446
+#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
msgid "LADSPA: no ladspa port data"
msgstr "LADSPA: 没有LADSPA端å£æ•°æ®"
-#: ladspa_plugin.cc:717
-msgid "LADSPA: cannot load module from \"%1\""
-msgstr "LADSPA: 无法从 \"%1\" 载入模å—"
-
-#: ladspa_plugin.cc:827
+#: ladspa_plugin.cc:840
msgid "Could not locate HOME. Preset not removed."
msgstr "无法定ä½HOME. 预设没被移除."
-#: ladspa_plugin.cc:864 ladspa_plugin.cc:870
+#: ladspa_plugin.cc:879 ladspa_plugin.cc:885
msgid "Could not create %1. Preset not saved. (%2)"
msgstr "ä¸èƒ½åˆ›å»º %1. 预设没ä¿å­˜. (%2)"
-#: ladspa_plugin.cc:877
+#: ladspa_plugin.cc:892
msgid "Error saving presets file %1."
msgstr ""
-#: ladspa_plugin.cc:915
+#: ladspa_plugin.cc:934
msgid "Could not locate HOME. Preset not saved."
msgstr "无法定ä½HOME. 预设没ä¿å­˜."
@@ -956,7 +973,7 @@ msgstr ""
msgid "incorrect XML mode passed to Locations::set_state"
msgstr ""
-#: location.cc:842 session.cc:4516 session_state.cc:1031
+#: location.cc:842 session.cc:4533 session_state.cc:1025
msgid "session"
msgstr "会è¯"
@@ -1011,40 +1028,39 @@ msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
msgstr ""
#: ltc_slave.cc:591
-#, c-format
msgid "flywheel"
msgstr ""
-#: midi_diskstream.cc:167
+#: midi_diskstream.cc:166
msgid ""
"%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
msgstr ""
-#: midi_diskstream.cc:219
+#: midi_diskstream.cc:218
msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
msgstr ""
-#: midi_diskstream.cc:270
+#: midi_diskstream.cc:269
msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
msgstr ""
-#: midi_diskstream.cc:699
+#: midi_diskstream.cc:698
msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
msgstr ""
-#: midi_diskstream.cc:834
+#: midi_diskstream.cc:833
msgid "MidiDiskstream %1: cannot write to disk"
msgstr "MIDIç£ç›˜æµ %1: 无法写入硬盘"
-#: midi_diskstream.cc:868
+#: midi_diskstream.cc:867
msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
msgstr ""
-#: midi_diskstream.cc:955
+#: midi_diskstream.cc:954
msgid "%1: could not create region for complete midi file"
msgstr ""
-#: midi_diskstream.cc:992
+#: midi_diskstream.cc:991
msgid "MidiDiskstream: could not create region for captured midi!"
msgstr ""
@@ -1056,27 +1072,27 @@ msgstr ""
msgid "No SysExID found for sys-ex property change - ignored"
msgstr ""
-#: midi_model.cc:2010
+#: midi_model.cc:2012
msgid "transpose"
msgstr ""
-#: midi_patch_manager.cc:126
+#: midi_patch_manager.cc:127
msgid "Duplicate MIDI device `%1' in `%2' ignored"
msgstr ""
-#: midi_source.cc:125
+#: midi_source.cc:124
msgid "Missing parameter property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:132
+#: midi_source.cc:131
msgid "Missing style property on InterpolationStyle"
msgstr ""
-#: midi_source.cc:144
+#: midi_source.cc:143
msgid "Missing parameter property on AutomationState"
msgstr ""
-#: midi_source.cc:151
+#: midi_source.cc:150
msgid "Missing state property on AutomationState"
msgstr ""
@@ -1120,21 +1136,21 @@ msgstr ""
msgid "solo control"
msgstr ""
-#: mtc_slave.cc:238
+#: mtc_slave.cc:240
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr ""
-#: mtc_slave.cc:361
+#: mtc_slave.cc:362
msgid ""
"Unknown rate/drop value %1 in incoming MTC stream, session values used "
"instead"
msgstr ""
-#: mtc_slave.cc:381
+#: mtc_slave.cc:382
msgid "Session framerate adjusted from %1 TO: MTC's %2."
msgstr ""
-#: mtc_slave.cc:395
+#: mtc_slave.cc:396
msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
msgstr ""
@@ -1194,31 +1210,35 @@ msgstr ""
msgid "Pannable given XML data for %1 - ignored"
msgstr ""
-#: panner_manager.cc:76
-msgid "looking for panners in %1"
+#: panner_manager.cc:80
+msgid "looking for panners in %1\n"
msgstr ""
-#: panner_manager.cc:100
-msgid "Panner discovered: \"%1\" in %2"
+#: panner_manager.cc:108
+msgid "Panner discovered: \"%1\" in %2\n"
msgstr ""
-#: panner_manager.cc:117
+#: panner_manager.cc:125
msgid "PannerManager: cannot load module \"%1\" (%2)"
msgstr ""
-#: panner_manager.cc:124
+#: panner_manager.cc:132
msgid "PannerManager: module \"%1\" has no descriptor function."
msgstr ""
-#: panner_manager.cc:187
+#: panner_manager.cc:219
msgid "no panner discovered for in/out = %1/%2"
msgstr ""
-#: panner_shell.cc:179
+#: panner_shell.cc:126
+msgid "select panner: %1\n"
+msgstr ""
+
+#: panner_shell.cc:245
msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
msgstr ""
-#: panner_shell.cc:185
+#: panner_shell.cc:251
msgid "panner plugin node has no type information!"
msgstr ""
@@ -1238,19 +1258,19 @@ msgstr ""
msgid "Could not construct playlist for PlaylistSource from session data!"
msgstr ""
-#: plugin.cc:324
+#: plugin.cc:328
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
msgstr ""
-#: plugin.cc:398
+#: plugin.cc:402
msgid ""
"Saving plugin settings is not supported in this build of %1. Consider paying "
"for the full version"
msgstr ""
-#: plugin_insert.cc:598
+#: plugin_insert.cc:589
msgid "programming error: "
msgstr "程åºé”™è¯¯:"
@@ -1284,43 +1304,43 @@ msgstr ""
msgid "PluginInsert: automatable control %1 not found - ignored"
msgstr ""
-#: plugin_manager.cc:161
+#: plugin_manager.cc:165
msgid "Discovering Plugins"
msgstr "å‘现æ’件"
-#: plugin_manager.cc:335
+#: plugin_manager.cc:286
msgid "Could not parse rdf file: %1"
msgstr "无法传递 rdf文件: %1"
-#: plugin_manager.cc:374
+#: plugin_manager.cc:330
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr "LADSPA: æ— æ³•è½½å…¥æ¨¡å— \"%1\" (%2)"
-#: plugin_manager.cc:381
+#: plugin_manager.cc:337
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr ""
-#: plugin_manager.cc:602
+#: plugin_manager.cc:567
msgid ""
"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
"at this time"
msgstr ""
-#: plugin_manager.cc:709
+#: plugin_manager.cc:680
msgid ""
"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
"in %2 at this time"
msgstr ""
-#: plugin_manager.cc:870
+#: plugin_manager.cc:841
msgid "unknown plugin status type \"%1\" - all entries ignored"
msgstr ""
-#: plugin_manager.cc:887
+#: plugin_manager.cc:858
msgid "unknown plugin type \"%1\" - ignored"
msgstr "ä½ç½®æ’件类型 \"%1\" - 忽略之"
-#: port.cc:410
+#: port.cc:412
msgid "could not reregister %1"
msgstr "无法注册 %1."
@@ -1328,11 +1348,11 @@ msgstr "无法注册 %1."
msgid "insert %1"
msgstr "æ’å…¥ %1"
-#: port_insert.cc:198
+#: port_insert.cc:197
msgid "XML node describing port insert is missing the `type' field"
msgstr ""
-#: port_insert.cc:203
+#: port_insert.cc:202
msgid "non-port insert XML used for port plugin insert"
msgstr ""
@@ -1364,11 +1384,11 @@ msgstr "音频引擎: 无法连接 %1 (%2) 到 %3 (%4)"
msgid "Re-establising port %1 failed"
msgstr ""
-#: processor.cc:207
+#: processor.cc:208
msgid "No %1 property flag in element %2"
msgstr ""
-#: processor.cc:216
+#: processor.cc:217
msgid "No child node with active property"
msgstr ""
@@ -1432,11 +1452,11 @@ msgstr ""
msgid "cannot create new name for region \"%1\""
msgstr ""
-#: resampled_source.cc:98
+#: resampled_source.cc:102
msgid "Import: %1"
msgstr "导入: %1"
-#: resampled_source.cc:128
+#: resampled_source.cc:132 srcfilesource.cc:76
msgid "Import: src_new() failed : %1"
msgstr "导入: src_new() 失败 : %1"
@@ -1444,27 +1464,27 @@ msgstr "导入: src_new() 失败 : %1"
msgid "return %1"
msgstr "返回 %1"
-#: route.cc:1075 route.cc:2528
+#: route.cc:1081 route.cc:2541
msgid "unknown Processor type \"%1\"; ignored"
msgstr ""
-#: route.cc:1087
+#: route.cc:1093
msgid "processor could not be created. Ignored."
msgstr ""
-#: route.cc:1962 route.cc:2187
+#: route.cc:1975 route.cc:2200
msgid "Bad node sent to Route::set_state() [%1]"
msgstr "æŸå的符å·å‘é€è‡³ Route::set_state() [%1]"
-#: route.cc:2022
+#: route.cc:2035
msgid "Pannable state found for route (%1) without a panner!"
msgstr ""
-#: route.cc:2096 route.cc:2100 route.cc:2301 route.cc:2305
+#: route.cc:2109 route.cc:2113 route.cc:2314 route.cc:2318
msgid "badly formed order key string in state file! [%1] ... ignored."
msgstr ""
-#: route.cc:2311
+#: route.cc:2324
msgid "Converting deprecated order key for %1 using Editor order %2"
msgstr ""
@@ -1480,15 +1500,15 @@ msgstr ""
msgid "error writing tempo-adjusted data to %1"
msgstr ""
-#: send.cc:59
+#: send.cc:60
msgid "aux %1"
msgstr ""
-#: send.cc:63
+#: send.cc:64
msgid "send %1"
msgstr "å‘é€ %1"
-#: send.cc:65
+#: send.cc:66
msgid "programming error: send created using role %1"
msgstr ""
@@ -1512,147 +1532,147 @@ msgstr ""
msgid "Set up standard connections"
msgstr "设置标准连接"
-#: session.cc:635
+#: session.cc:638
msgid "could not setup Click I/O"
msgstr ""
-#: session.cc:683
+#: session.cc:686
#, c-format
msgid "out %<PRIu32>"
msgstr ""
-#: session.cc:697
+#: session.cc:700
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr ""
-#: session.cc:712
+#: session.cc:715
#, c-format
msgid "in %<PRIu32>"
msgstr ""
-#: session.cc:726
+#: session.cc:729
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr ""
-#: session.cc:790
+#: session.cc:793
msgid "cannot connect master output %1 to %2"
msgstr ""
-#: session.cc:849
+#: session.cc:862
msgid "monitor"
msgstr ""
-#: session.cc:894
+#: session.cc:907
msgid "cannot connect control input %1 to %2"
msgstr ""
-#: session.cc:914
+#: session.cc:927
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr ""
-#: session.cc:945
+#: session.cc:958
msgid "cannot connect control output %1 to %2"
msgstr ""
-#: session.cc:1009
+#: session.cc:1026
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr ""
-#: session.cc:1193
+#: session.cc:1210
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
-#: session.cc:1233
+#: session.cc:1250
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
msgstr ""
-#: session.cc:1547
+#: session.cc:1564
msgid "feedback loop setup between %1 and %2"
msgstr ""
-#: session.cc:1843
+#: session.cc:1860
msgid "Session: could not create new midi track."
msgstr ""
-#: session.cc:1849
+#: session.cc:1866
msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks."
msgstr ""
-#: session.cc:2026 session.cc:2029
+#: session.cc:2043 session.cc:2046
msgid "Audio"
msgstr "音频"
-#: session.cc:2053 session.cc:2061 session.cc:2138 session.cc:2146
+#: session.cc:2070 session.cc:2078 session.cc:2155 session.cc:2163
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr ""
-#: session.cc:2084
+#: session.cc:2101
msgid "Session: could not create new audio track."
msgstr ""
-#: session.cc:2116 session.cc:2119
+#: session.cc:2133 session.cc:2136
msgid "Bus"
msgstr "总线"
-#: session.cc:2169
+#: session.cc:2186
msgid "Session: could not create new audio route."
msgstr ""
-#: session.cc:2228 session.cc:2238
+#: session.cc:2245 session.cc:2255
msgid "Session: UINT_MAX routes? impossible!"
msgstr ""
-#: session.cc:2260
+#: session.cc:2277
msgid "Session: cannot create track/bus from template description"
msgstr ""
-#: session.cc:2286
+#: session.cc:2303
msgid "Session: could not create new route from template"
msgstr ""
-#: session.cc:2315
+#: session.cc:2332
msgid "Adding new tracks/busses failed"
msgstr ""
-#: session.cc:3419
+#: session.cc:3436
msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename"
msgstr ""
-#: session.cc:3539 session.cc:3597
+#: session.cc:3556 session.cc:3614
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr ""
-#: session.cc:3987
+#: session.cc:4004
msgid "send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:3999
+#: session.cc:4016
msgid "aux send ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4011
+#: session.cc:4028
msgid "return ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4023
+#: session.cc:4040
msgid "insert ID %1 appears to be in use already"
msgstr ""
-#: session.cc:4150
+#: session.cc:4167
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr ""
-#: session.cc:4179
+#: session.cc:4196
msgid "too many bounced versions of playlist \"%1\""
msgstr ""
-#: session.cc:4189
+#: session.cc:4206
msgid "cannot create new audio file \"%1\" for %2"
msgstr ""
@@ -1687,7 +1707,7 @@ msgstr "无法创建会è¯ç›®å½•åœ¨è·¯å¾„ %1 错误: %2"
msgid "Session subdirectory does not exist at path %1"
msgstr "会è¯å­ç›®å½•ä¸å­˜åœ¨äºŽè·¯å¾„ %1"
-#: session_events.cc:184
+#: session_events.cc:185
msgid "Session: cannot have two events of type %1 at the same frame (%2)."
msgstr ""
@@ -1699,13 +1719,13 @@ msgstr ""
msgid "Export ended unexpectedly: %1"
msgstr ""
-#: session_ltc.cc:222
+#: session_ltc.cc:221
msgid ""
"LTC encoder: invalid framerate - LTC encoding is disabled for the remainder "
"of this session."
msgstr ""
-#: session_midi.cc:520
+#: session_midi.cc:519
msgid "Session: cannot send quarter-frame MTC message (%1)"
msgstr ""
@@ -1717,350 +1737,342 @@ msgstr "会è¯: 无法从XMLæ述符创建播放列表."
msgid "Session: error in no roll for %1"
msgstr ""
-#: session_process.cc:1157
+#: session_process.cc:1159
msgid "Programming error: illegal event type in process_event (%1)"
msgstr ""
-#: session_state.cc:140
-msgid "Could not use path %1 (%2)"
-msgstr ""
-
-#: session_state.cc:184
+#: session_state.cc:178
msgid "solo cut control (dB)"
msgstr ""
-#: session_state.cc:208
+#: session_state.cc:202
msgid "Set block size and sample rate"
msgstr ""
-#: session_state.cc:213
+#: session_state.cc:207
msgid "Using configuration"
msgstr "使用é…ç½®"
-#: session_state.cc:325
+#: session_state.cc:319
msgid "Reset Remote Controls"
msgstr ""
-#: session_state.cc:417
+#: session_state.cc:411
msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
msgstr "会è¯: 无法创建会è¯å³°æ–‡ä»¶çš„文件夹 \"%1\" (%2)"
-#: session_state.cc:424
+#: session_state.cc:418
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr ""
-#: session_state.cc:431
+#: session_state.cc:425
msgid "Session: cannot create session midi dir \"%1\" (%2)"
msgstr ""
-#: session_state.cc:438
+#: session_state.cc:432
msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:445
+#: session_state.cc:439
msgid "Session: cannot create session export folder \"%1\" (%2)"
msgstr "会è¯: 无法创建会è¯å¯¼å‡ºæ–‡ä»¶å¤¹ \"%1\" (%2)"
-#: session_state.cc:452
+#: session_state.cc:446
msgid "Session: cannot create session analysis folder \"%1\" (%2)"
msgstr "会è¯: 无法创建会è¯åˆ†æžæ–‡ä»¶å¤¹ \"%1\" (%2)"
-#: session_state.cc:459
+#: session_state.cc:453
msgid "Session: cannot create session plugins folder \"%1\" (%2)"
msgstr "会è¯: 无法创建会è¯æ’件文件夹 \"%1\" (%2)"
-#: session_state.cc:466
+#: session_state.cc:460
msgid "Session: cannot create session externals folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:480
+#: session_state.cc:474
msgid "Session: cannot create session folder \"%1\" (%2)"
msgstr "会è¯: 无法创建会è¯æ–‡ä»¶å¤¹ \"%1\" (%2)"
-#: session_state.cc:514
+#: session_state.cc:508
msgid "Could not open %1 for writing session template"
msgstr ""
-#: session_state.cc:520
+#: session_state.cc:514
msgid "Could not open session template %1 for reading"
msgstr ""
-#: session_state.cc:539
+#: session_state.cc:533
msgid "master"
msgstr "主控"
-#: session_state.cc:600
+#: session_state.cc:594
msgid "Could not remove pending capture state at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:624
+#: session_state.cc:618
msgid "could not rename snapshot %1 to %2 (%3)"
msgstr "无法é‡å‘½åå¿«ç…§ %1 到 %2 (%3)"
-#: session_state.cc:652
+#: session_state.cc:646
msgid "Could not remove session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:669
+#: session_state.cc:663
msgid ""
"the %1 audio engine is not connected and state saving would lose all I/O "
"connections. Session not saved"
msgstr ""
-#: session_state.cc:720
+#: session_state.cc:714
msgid "state could not be saved to %1"
msgstr ""
-#: session_state.cc:722 session_state.cc:733
+#: session_state.cc:716 session_state.cc:727
msgid "Could not remove temporary session file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:730
-msgid "could not rename temporary session file %1 to %2"
+#: session_state.cc:724
+msgid "could not rename temporary session file %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:798
+#: session_state.cc:792
msgid "%1: session file \"%2\" doesn't exist!"
msgstr ""
-#: session_state.cc:810
+#: session_state.cc:804
msgid "Could not understand session file %1"
msgstr ""
-#: session_state.cc:819
+#: session_state.cc:813
msgid "Session file %1 is not a session"
msgstr "会è¯æ–‡ä»¶ %1 ä¸æ˜¯ä¸€ä¸ªä¼šè¯"
-#: session_state.cc:1125
+#: session_state.cc:1119
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
-#: session_state.cc:1179
+#: session_state.cc:1173
msgid "Session: XML state has no options section"
msgstr ""
-#: session_state.cc:1184
+#: session_state.cc:1178
msgid "Session: XML state has no metadata section"
msgstr ""
-#: session_state.cc:1195
+#: session_state.cc:1189
msgid "Session: XML state has no sources section"
msgstr ""
-#: session_state.cc:1202
+#: session_state.cc:1196
msgid "Session: XML state has no Tempo Map section"
msgstr ""
-#: session_state.cc:1209
+#: session_state.cc:1203
msgid "Session: XML state has no locations section"
msgstr ""
-#: session_state.cc:1235
+#: session_state.cc:1229
msgid "Session: XML state has no Regions section"
msgstr ""
-#: session_state.cc:1242
+#: session_state.cc:1236
msgid "Session: XML state has no playlists section"
msgstr ""
-#: session_state.cc:1262
+#: session_state.cc:1256
msgid "Session: XML state has no bundles section"
msgstr ""
-#: session_state.cc:1274
+#: session_state.cc:1268
msgid "Session: XML state has no diskstreams section"
msgstr ""
-#: session_state.cc:1282
+#: session_state.cc:1276
msgid "Session: XML state has no routes section"
msgstr ""
-#: session_state.cc:1294
+#: session_state.cc:1288
msgid "Session: XML state has no route groups section"
msgstr ""
-#: session_state.cc:1303
+#: session_state.cc:1297
msgid "Session: XML state has no edit groups section"
msgstr ""
-#: session_state.cc:1310
+#: session_state.cc:1304
msgid "Session: XML state has no mix groups section"
msgstr ""
-#: session_state.cc:1318
+#: session_state.cc:1312
msgid "Session: XML state has no click section"
msgstr ""
-#: session_state.cc:1360
+#: session_state.cc:1354
msgid "Session: cannot create Route from XML description."
msgstr ""
-#: session_state.cc:1364
+#: session_state.cc:1358
msgid "Loaded track/bus %1"
msgstr "载入音轨/总线 %1"
-#: session_state.cc:1462
+#: session_state.cc:1456
msgid "Could not find diskstream for route"
msgstr ""
-#: session_state.cc:1516
+#: session_state.cc:1510
msgid "Session: cannot create Region from XML description."
msgstr ""
-#: session_state.cc:1520
+#: session_state.cc:1514
msgid "Can not load state for region '%1'"
msgstr ""
-#: session_state.cc:1556
+#: session_state.cc:1550
msgid "Regions in compound description not found (ID's %1 and %2): ignored"
msgstr ""
-#: session_state.cc:1584
+#: session_state.cc:1578
msgid "Nested source has no ID info in session file! (ignored)"
msgstr ""
-#: session_state.cc:1596
+#: session_state.cc:1590
msgid "Cannot reconstruct nested source for region %1"
msgstr ""
-#: session_state.cc:1658
+#: session_state.cc:1652
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707
+#: session_state.cc:1660 session_state.cc:1681 session_state.cc:1701
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713
+#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
msgstr ""
-#: session_state.cc:1736
+#: session_state.cc:1730
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
msgstr ""
-#: session_state.cc:1770
+#: session_state.cc:1764
msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
msgstr ""
-#: session_state.cc:1778
+#: session_state.cc:1772
msgid ""
"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
msgstr ""
-#: session_state.cc:1784
+#: session_state.cc:1778
msgid ""
"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
msgstr ""
-#: session_state.cc:1852
+#: session_state.cc:1846
msgid ""
"cannot create new file from region name \"%1\" with ident = \"%2\": too many "
"existing files with similar names"
msgstr ""
-#: session_state.cc:1875
+#: session_state.cc:1869
msgid "Session: cannot create Source from XML description."
msgstr ""
-#: session_state.cc:1909
+#: session_state.cc:1903
msgid "A sound file is missing. It will be replaced by silence."
msgstr ""
-#: session_state.cc:1932
+#: session_state.cc:1926
msgid "Found a sound file that cannot be used by %1. Talk to the progammers."
msgstr ""
-#: session_state.cc:1949
+#: session_state.cc:1943
msgid "Could not create templates directory \"%1\" (%2)"
msgstr ""
-#: session_state.cc:1962
+#: session_state.cc:1956
msgid "Template \"%1\" already exists - new version not created"
msgstr ""
-#: session_state.cc:1968
+#: session_state.cc:1962
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr ""
-#: session_state.cc:1978
+#: session_state.cc:1972
msgid "template not saved"
msgstr "模æ¿æ²¡ä¿å­˜"
-#: session_state.cc:1988
+#: session_state.cc:1982
msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
msgstr ""
-#: session_state.cc:2183
+#: session_state.cc:2225
msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr ""
-#: session_state.cc:2725 session_state.cc:2731
-msgid "Cannot expand path %1 (%2)"
-msgstr "无法扩展路径 %1 (%2)"
-
-#: session_state.cc:2784
+#: session_state.cc:2820
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr ""
-#: session_state.cc:2823
+#: session_state.cc:2859
msgid "cannot rename unused file source from %1 to %2 (%3)"
msgstr ""
-#: session_state.cc:2841
+#: session_state.cc:2877
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr ""
-#: session_state.cc:3143
+#: session_state.cc:3179
msgid "could not backup old history file, current history not saved"
msgstr ""
-#: session_state.cc:3156
+#: session_state.cc:3192
msgid "history could not be saved to %1"
msgstr "历å²æ— æ³•è¢«ä¿å­˜åˆ° %1"
-#: session_state.cc:3159
+#: session_state.cc:3195
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr ""
-#: session_state.cc:3163
+#: session_state.cc:3199
msgid "could not restore history file from backup %1 (%2)"
msgstr ""
-#: session_state.cc:3188
+#: session_state.cc:3224
msgid "%1: no history file \"%2\" for this session."
msgstr ""
-#: session_state.cc:3194
+#: session_state.cc:3230
msgid "Could not understand session history file \"%1\""
msgstr "无法ç†è§£ä¼šè¯åŽ†å²æ–‡ä»¶ \"%1\""
-#: session_state.cc:3236
+#: session_state.cc:3272
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr ""
-#: session_state.cc:3247
+#: session_state.cc:3283
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr ""
-#: session_state.cc:3258
+#: session_state.cc:3294
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr ""
-#: session_state.cc:3266
+#: session_state.cc:3302
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr ""
-#: session_state.cc:3502
+#: session_state.cc:3538
msgid "Session: unknown diskstream type in XML"
msgstr ""
-#: session_state.cc:3507
+#: session_state.cc:3543
msgid "Session: could not load diskstream via XML state"
msgstr ""
@@ -2084,198 +2096,206 @@ msgid ""
"control"
msgstr ""
-#: smf_source.cc:252
+#: smf_source.cc:262
msgid "Unable to read event prefix, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:265
+#: smf_source.cc:275
msgid "Event has time and size but no body, corrupt MIDI ring"
msgstr ""
-#: smf_source.cc:271
+#: smf_source.cc:281
msgid "Event time is before MIDI source position"
msgstr ""
-#: smf_source.cc:306 smf_source.cc:345
+#: smf_source.cc:316 smf_source.cc:355
msgid "Skipping event with unordered time %1"
msgstr ""
-#: smf_source.cc:410
+#: smf_source.cc:420
msgid "cannot open MIDI file %1 for write"
msgstr "无法打开MIDI文件 %1 用于写入"
-#: sndfile_helpers.cc:32
+#: sndfile_helpers.cc:34
msgid "WAV"
msgstr ""
-#: sndfile_helpers.cc:33
+#: sndfile_helpers.cc:35
msgid "AIFF"
msgstr ""
-#: sndfile_helpers.cc:34
+#: sndfile_helpers.cc:36
msgid "CAF"
msgstr ""
-#: sndfile_helpers.cc:35
+#: sndfile_helpers.cc:37
msgid "W64 (64 bit WAV)"
msgstr ""
-#: sndfile_helpers.cc:36
+#: sndfile_helpers.cc:38
msgid "FLAC"
msgstr ""
-#: sndfile_helpers.cc:37
+#: sndfile_helpers.cc:39
msgid "Ogg/Vorbis"
msgstr ""
-#: sndfile_helpers.cc:38
+#: sndfile_helpers.cc:40
msgid "raw (no header)"
msgstr ""
-#: sndfile_helpers.cc:43
+#: sndfile_helpers.cc:45
msgid ".wav"
msgstr ""
-#: sndfile_helpers.cc:44
+#: sndfile_helpers.cc:46
msgid ".aiff"
msgstr ""
-#: sndfile_helpers.cc:45
+#: sndfile_helpers.cc:47
msgid ".caf"
msgstr ""
-#: sndfile_helpers.cc:46
+#: sndfile_helpers.cc:48
msgid ".w64"
msgstr ""
-#: sndfile_helpers.cc:47
+#: sndfile_helpers.cc:49
msgid ".flac"
msgstr ""
-#: sndfile_helpers.cc:48
+#: sndfile_helpers.cc:50
msgid ".ogg"
msgstr ""
-#: sndfile_helpers.cc:49
+#: sndfile_helpers.cc:51
msgid ".raw"
msgstr ""
-#: sndfile_helpers.cc:64
+#: sndfile_helpers.cc:66
msgid "Signed 16 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:65
+#: sndfile_helpers.cc:67
msgid "Signed 24 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:66
+#: sndfile_helpers.cc:68
msgid "Signed 32 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:67
+#: sndfile_helpers.cc:69
msgid "Signed 8 bit PCM"
msgstr ""
-#: sndfile_helpers.cc:68
+#: sndfile_helpers.cc:70
msgid "32 bit float"
msgstr ""
-#: sndfile_helpers.cc:81
+#: sndfile_helpers.cc:83
msgid "Little-endian (Intel)"
msgstr ""
-#: sndfile_helpers.cc:82
+#: sndfile_helpers.cc:84
msgid "Big-endian (PowerPC)"
msgstr ""
-#: sndfilesource.cc:201
+#: sndfilesource.cc:210
msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
msgstr ""
-#: sndfilesource.cc:209
+#: sndfilesource.cc:218
msgid ""
"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
"number"
msgstr ""
-#: sndfilesource.cc:255 sndfilesource.cc:571 sndfilesource.cc:595
+#: sndfilesource.cc:264 sndfilesource.cc:604 sndfilesource.cc:628
msgid ""
"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
"for this file"
msgstr ""
-#: sndfilesource.cc:302
+#: sndfilesource.cc:311
msgid "could not allocate file %1 for reading."
msgstr "无法分é…文件 %1 用于读入"
-#: sndfilesource.cc:337
+#: sndfilesource.cc:346
msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
msgstr ""
-#: sndfilesource.cc:347
+#: sndfilesource.cc:356
msgid ""
"SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
msgstr ""
-#: sndfilesource.cc:391 sndfilesource.cc:420
+#: sndfilesource.cc:400 sndfilesource.cc:429
msgid "attempt to write a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:396 utils.cc:510 utils.cc:534 utils.cc:548 utils.cc:567
+#: sndfilesource.cc:405 utils.cc:547 utils.cc:571 utils.cc:585 utils.cc:604
msgid "programming error: %1 %2"
msgstr "程åºé”™è¯¯: %1 %2"
-#: sndfilesource.cc:523
+#: sndfilesource.cc:532 sndfilesource.cc:562
msgid "attempt to flush a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:528
+#: sndfilesource.cc:537 sndfilesource.cc:557
msgid "attempt to flush an un-opened audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:534
+#: sndfilesource.cc:543
msgid "could not allocate file %1 to write header"
msgstr ""
-#: sndfilesource.cc:548
+#: sndfilesource.cc:568
+msgid "could not allocate file %1 to flush contents"
+msgstr ""
+
+#: sndfilesource.cc:581
msgid ""
"attempt to store broadcast info in a non-writable audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:553
+#: sndfilesource.cc:586
msgid "attempt to set BWF info for an un-opened audio file source (%1)"
msgstr ""
-#: sndfilesource.cc:614
+#: sndfilesource.cc:647
msgid "%1: cannot seek to %2 (libsndfile error: %3)"
msgstr ""
-#: sndfilesource.cc:727
+#: sndfilesource.cc:760
msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
msgstr ""
-#: sndfilesource.cc:740 sndfilesource.cc:790 sndfilesource.cc:797
+#: sndfilesource.cc:773 sndfilesource.cc:823 sndfilesource.cc:830
msgid "SndFileSource: \"%1\" bad write (%2)"
msgstr ""
-#: sndfilesource.cc:820
+#: sndfilesource.cc:853
msgid ""
"Filesource: start time is already set for existing file (%1): Cannot change "
"start time."
msgstr ""
-#: speakers.cc:239
+#: speakers.cc:280
msgid "Speaker information is missing azimuth - speaker ignored"
msgstr ""
-#: speakers.cc:245
+#: speakers.cc:286
msgid "Speaker information is missing elevation - speaker ignored"
msgstr ""
-#: speakers.cc:251
+#: speakers.cc:292
msgid "Speaker information is missing distance - speaker ignored"
msgstr ""
+#: srcfilesource.cc:135
+msgid "SrcFileSource: %1"
+msgstr ""
+
#: tape_file_matcher.cc:46
msgid "Cannot compile tape track regexp for use (%1)"
msgstr ""
@@ -2425,54 +2445,63 @@ msgstr "声é“的符å·æ²¡æœ‰ç±»åž‹å±žæ€§"
msgid "Node for Port has no \"name\" property"
msgstr "端å£çš„符å·æ²¡æœ‰å称属性"
-#: utils.cc:358 utils.cc:382
+#: utils.cc:395 utils.cc:419
msgid "Splice"
msgstr ""
-#: utils.cc:360 utils.cc:375
+#: utils.cc:397 utils.cc:412
msgid "Slide"
msgstr ""
-#: utils.cc:362 utils.cc:378
+#: utils.cc:399 utils.cc:415
msgid "Lock"
msgstr ""
-#: utils.cc:365
+#: utils.cc:402
msgid "programming error: unknown edit mode string \"%1\""
msgstr "程åºé”™è¯¯: 无法识别编辑模å¼å­—符串 \"%1\""
-#: utils.cc:389 utils.cc:421
+#: utils.cc:426 utils.cc:458
msgid "MIDI Timecode"
msgstr "MIDI时间ç "
-#: utils.cc:389 utils.cc:419
+#: utils.cc:426 utils.cc:456
msgid "MTC"
msgstr "MTC"
-#: utils.cc:393 utils.cc:428
+#: utils.cc:430 utils.cc:465
msgid "MIDI Clock"
msgstr "MIDI时钟"
-#: utils.cc:397 utils.cc:415 utils.cc:435
+#: utils.cc:434 utils.cc:452 utils.cc:472
msgid "JACK"
msgstr ""
-#: utils.cc:401
+#: utils.cc:438
msgid "programming error: unknown sync source string \"%1\""
msgstr "程åºé”™è¯¯: 无法识别åŒæ­¥æºå­—符串 \"%1\""
-#: utils.cc:426
+#: utils.cc:463
msgid "M-Clock"
msgstr ""
-#: utils.cc:432
+#: utils.cc:469
msgid "LTC"
msgstr ""
-#: utils.cc:602
+#: utils.cc:639
msgid "programming error: unknown native header format: %1"
msgstr ""
-#: utils.cc:617
+#: utils.cc:654
msgid "cannot open directory %1 (%2)"
msgstr "无法打开目录 %1 (%2)"
+
+#~ msgid "Could not resolve path: %1 (%2)"
+#~ msgstr "无法解决路径: %1 (%2)"
+
+#~ msgid "LADSPA: cannot load module from \"%1\""
+#~ msgstr "LADSPA: 无法从 \"%1\" 载入模å—"
+
+#~ msgid "Cannot expand path %1 (%2)"
+#~ msgstr "无法扩展路径 %1 (%2)"
diff --git a/libs/ardour/port.cc b/libs/ardour/port.cc
index cf961d6828..19bebd103f 100644
--- a/libs/ardour/port.cc
+++ b/libs/ardour/port.cc
@@ -21,8 +21,6 @@
#include "libardour-config.h"
#endif
-#include <jack/weakjack.h> // so that we can test for new functions at runtime
-
#include "pbd/compose.h"
#include "pbd/error.h"
#include "pbd/failed_constructor.h"
@@ -380,7 +378,7 @@ Port::get_connected_latency_range (LatencyRange& range, bool playback) const
boost::shared_ptr<Port> remote_port = AudioEngine::instance()->get_port_by_name (*c);
if (remote_port) {
- lr = remote_port->private_latency_range ((playback ? JackPlaybackLatency : JackCaptureLatency));
+ lr = remote_port->private_latency_range ((playback ? true : false));
DEBUG_TRACE (DEBUG::Latency, string_compose (
"\t%1 <-LOCAL-> %2 : latter has latency range %3 .. %4\n",
name(), *c, lr.min, lr.max));
diff --git a/libs/ardour/port_insert.cc b/libs/ardour/port_insert.cc
index c352e22e55..fa09ea05ac 100644
--- a/libs/ardour/port_insert.cc
+++ b/libs/ardour/port_insert.cc
@@ -249,7 +249,9 @@ PortInsert::signal_latency() const
bool
PortInsert::configure_io (ChanCount in, ChanCount out)
{
+#ifndef PLATFORM_WINDOWS
assert (!AudioEngine::instance()->process_lock().trylock());
+#endif
/* for an insert, processor input corresponds to IO output, and vice versa */
diff --git a/libs/ardour/port_set.cc b/libs/ardour/port_set.cc
index 6096e356f5..3489ae4e44 100644
--- a/libs/ardour/port_set.cc
+++ b/libs/ardour/port_set.cc
@@ -56,7 +56,7 @@ static bool sort_ports_by_name (boost::shared_ptr<Port> a, boost::shared_ptr<Por
// if some of the names don't have a number as posfix, compare as strings
- if (last_digit_position_a == aname.size() or last_digit_position_b == bname.size()) {
+ if (last_digit_position_a == aname.size() || last_digit_position_b == bname.size()) {
return aname < bname;
}
@@ -145,9 +145,11 @@ PortSet::port(DataType type, size_t n) const
return port(n);
} else {
const PortVec& v = _ports[type];
- assert(n < v.size());
- return v[n];
+ if (n < v.size()) {
+ return v[n];
+ }
}
+ return boost::shared_ptr<Port>();
}
boost::shared_ptr<AudioPort>
diff --git a/libs/ardour/rc_configuration.cc b/libs/ardour/rc_configuration.cc
index f4612699d4..b0be237563 100644
--- a/libs/ardour/rc_configuration.cc
+++ b/libs/ardour/rc_configuration.cc
@@ -72,11 +72,11 @@ int
RCConfiguration::load_state ()
{
std::string rcfile;
- struct stat statbuf;
+ GStatBuf statbuf;
/* load system configuration first */
- if (find_file_in_search_path (ardour_config_search_path(), "ardour_system.rc", rcfile)) {
+ if (find_file (ardour_config_search_path(), "ardour_system.rc", rcfile)) {
/* stupid XML Parser hates empty files */
@@ -104,7 +104,7 @@ RCConfiguration::load_state ()
/* now load configuration file for user */
- if (find_file_in_search_path (ardour_config_search_path(), "ardour.rc", rcfile)) {
+ if (find_file (ardour_config_search_path(), "ardour.rc", rcfile)) {
/* stupid XML parser hates empty files */
diff --git a/libs/ardour/region.cc b/libs/ardour/region.cc
index 3b9dc308ec..1784cdbf3c 100644
--- a/libs/ardour/region.cc
+++ b/libs/ardour/region.cc
@@ -698,33 +698,32 @@ Region::set_start (framepos_t pos)
}
void
-Region::trim_start (framepos_t new_position)
+Region::move_start (frameoffset_t distance)
{
if (locked() || position_locked() || video_locked()) {
return;
}
framepos_t new_start;
- frameoffset_t const start_shift = new_position - _position;
- if (start_shift > 0) {
+ if (distance > 0) {
- if (_start > max_framepos - start_shift) {
- new_start = max_framepos;
+ if (_start > max_framepos - distance) {
+ new_start = max_framepos; // makes no sense
} else {
- new_start = _start + start_shift;
+ new_start = _start + distance;
}
if (!verify_start (new_start)) {
return;
}
- } else if (start_shift < 0) {
+ } else if (distance < 0) {
- if (_start < -start_shift) {
+ if (_start < -distance) {
new_start = 0;
} else {
- new_start = _start + start_shift;
+ new_start = _start + distance;
}
} else {
@@ -736,6 +735,7 @@ Region::trim_start (framepos_t new_position)
}
set_start_internal (new_start);
+
_whole_file = false;
first_edit ();
diff --git a/libs/ardour/region_factory.cc b/libs/ardour/region_factory.cc
index 3e81524750..44f8c34ddd 100644
--- a/libs/ardour/region_factory.cc
+++ b/libs/ardour/region_factory.cc
@@ -564,7 +564,7 @@ RegionFactory::new_region_name (string old)
uint32_t number;
string::size_type len = old.length() + 64;
string remainder;
- char buf[len];
+ std::vector<char> buf(len);
if ((last_period = old.find_last_of ('.')) == string::npos) {
@@ -603,8 +603,8 @@ RegionFactory::new_region_name (string old)
number++;
- snprintf (buf, len, "%s%" PRIu32 "%s", old.substr (0, last_period + 1).c_str(), number, remainder.c_str());
- sbuf = buf;
+ snprintf (&buf[0], len, "%s%" PRIu32 "%s", old.substr (0, last_period + 1).c_str(), number, remainder.c_str());
+ sbuf = &buf[0];
if (region_name_map.find (sbuf) == region_name_map.end ()) {
break;
@@ -612,7 +612,7 @@ RegionFactory::new_region_name (string old)
}
if (number != (UINT_MAX-1)) {
- return buf;
+ return &buf[0];
}
error << string_compose (_("cannot create new name for region \"%1\""), old) << endmsg;
diff --git a/libs/ardour/resampled_source.cc b/libs/ardour/resampled_source.cc
index 6184e1a3d6..0a81319108 100644
--- a/libs/ardour/resampled_source.cc
+++ b/libs/ardour/resampled_source.cc
@@ -26,7 +26,11 @@
using namespace ARDOUR;
using namespace PBD;
+#ifdef PLATFORM_WINDOWS
+const uint32_t ResampledImportableSource::blocksize = 524288U;
+#else
const uint32_t ResampledImportableSource::blocksize = 16384U;
+#endif
ResampledImportableSource::ResampledImportableSource (boost::shared_ptr<ImportableSource> src, framecnt_t rate, SrcQuality srcq)
: source (src)
diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc
index 71af69fdee..5df58ea846 100644
--- a/libs/ardour/route.cc
+++ b/libs/ardour/route.cc
@@ -47,6 +47,7 @@
#include "ardour/internal_return.h"
#include "ardour/internal_send.h"
#include "ardour/meter.h"
+#include "ardour/delayline.h"
#include "ardour/midi_buffer.h"
#include "ardour/midi_port.h"
#include "ardour/monitor_processor.h"
@@ -79,6 +80,7 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type)
, GraphNode (sess._process_graph)
, _active (true)
, _signal_latency (0)
+ , _signal_latency_at_amp_position (0)
, _initial_delay (0)
, _roll_delay (0)
, _flags (flg)
@@ -100,6 +102,7 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type)
, _order_key (0)
, _has_order_key (false)
, _remote_control_id (0)
+ , _track_number (0)
, _in_configure_processors (false)
, _initial_io_setup (false)
, _custom_meter_position_noted (false)
@@ -142,6 +145,11 @@ Route::init ()
_output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
_output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
+ if (!is_master() && !is_monitor() && !is_auditioner()) {
+ _delayline.reset (new DelayLine (_session, _name));
+ add_processor (_delayline, PreFader);
+ }
+
/* add amp processor */
_amp.reset (new Amp (_session));
@@ -428,7 +436,10 @@ Route::process_output_buffers (BufferSet& bufs,
/* figure out if we're going to use gain automation */
if (gain_automation_ok) {
_amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
- _amp->setup_gain_automation (start_frame, end_frame, nframes);
+ _amp->setup_gain_automation (
+ start_frame + _signal_latency_at_amp_position,
+ end_frame + _signal_latency_at_amp_position,
+ nframes);
} else {
_amp->apply_gain_automation (false);
}
@@ -506,6 +517,8 @@ Route::process_output_buffers (BufferSet& bufs,
/* set this to be true if the meter will already have been ::run() earlier */
bool const meter_already_run = metering_state() == MeteringInput;
+ framecnt_t latency = 0;
+
for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
@@ -531,9 +544,118 @@ Route::process_output_buffers (BufferSet& bufs,
do we catch route != active somewhere higher?
*/
- (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
+ if (boost::dynamic_pointer_cast<Send>(*i) != 0) {
+ boost::dynamic_pointer_cast<Send>(*i)->set_delay_in(_signal_latency - latency);
+ }
+
+ (*i)->run (bufs, start_frame - latency, end_frame - latency, nframes, *i != _processors.back());
bufs.set_count ((*i)->output_streams());
+
+ if ((*i)->active ()) {
+ latency += (*i)->signal_latency ();
+ }
+ }
+}
+
+void
+Route::bounce_process (BufferSet& buffers, framepos_t start, framecnt_t nframes,
+ boost::shared_ptr<Processor> endpoint,
+ bool include_endpoint, bool for_export, bool for_freeze)
+{
+ /* If no processing is required, there's no need to go any further. */
+ if (!endpoint && !include_endpoint) {
+ return;
+ }
+
+ framecnt_t latency = bounce_get_latency(_amp, false, for_export, for_freeze);
+ _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
+ _amp->setup_gain_automation (start - latency, start - latency + nframes, nframes);
+
+ latency = 0;
+ for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
+
+ if (!include_endpoint && (*i) == endpoint) {
+ break;
+ }
+
+ /* if we're not exporting, stop processing if we come across a routing processor. */
+ if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
+ break;
+ }
+ if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
+ break;
+ }
+
+ /* don't run any processors that does routing.
+ * oh, and don't bother with the peak meter either.
+ */
+ if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
+ (*i)->run (buffers, start - latency, start - latency + nframes, nframes, true);
+ buffers.set_count ((*i)->output_streams());
+ latency += (*i)->signal_latency ();
+ }
+
+ if ((*i) == endpoint) {
+ break;
+ }
+ }
+}
+
+framecnt_t
+Route::bounce_get_latency (boost::shared_ptr<Processor> endpoint,
+ bool include_endpoint, bool for_export, bool for_freeze) const
+{
+ framecnt_t latency = 0;
+ if (!endpoint && !include_endpoint) {
+ return latency;
+ }
+
+ for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
+ if (!include_endpoint && (*i) == endpoint) {
+ break;
+ }
+ if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
+ break;
+ }
+ if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
+ break;
+ }
+ if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
+ latency += (*i)->signal_latency ();
+ }
+ if ((*i) == endpoint) {
+ break;
+ }
+ }
+ return latency;
+}
+
+ChanCount
+Route::bounce_get_output_streams (ChanCount &cc, boost::shared_ptr<Processor> endpoint,
+ bool include_endpoint, bool for_export, bool for_freeze) const
+{
+ if (!endpoint && !include_endpoint) {
+ return cc;
+ }
+
+ for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
+ if (!include_endpoint && (*i) == endpoint) {
+ break;
+ }
+ if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
+ break;
+ }
+ if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
+ break;
+ }
+ if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
+ cc = (*i)->output_streams();
+ }
+ if ((*i) == endpoint) {
+ break;
+ }
}
+ return cc;
}
ChanCount
@@ -1073,7 +1195,8 @@ Route::add_processor_from_xml_2X (const XMLNode& node, int version)
} else if (node.name() == "Send") {
- processor.reset (new Send (_session, _pannable, _mute_master));
+ boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
+ processor.reset (new Send (_session, sendpan, _mute_master));
} else {
@@ -1332,7 +1455,7 @@ Route::clear_processors (Placement p)
seen_amp = true;
}
- if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
+ if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs || (*i) == _delayline) {
/* you can't remove these */
@@ -1399,7 +1522,7 @@ Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStream
/* these can never be removed */
- if (processor == _amp || processor == _meter || processor == _main_outs) {
+ if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline) {
return 0;
}
@@ -1516,7 +1639,7 @@ Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams*
/* these can never be removed */
- if (processor == _amp || processor == _meter || processor == _main_outs) {
+ if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline) {
++i;
continue;
}
@@ -1598,7 +1721,10 @@ Route::reset_instrument_info ()
int
Route::configure_processors (ProcessorStreams* err)
{
+#ifndef PLATFORM_WINDOWS
assert (!AudioEngine::instance()->process_lock().trylock());
+#endif
+
if (!_in_configure_processors) {
Glib::Threads::RWLock::WriterLock lm (_processor_lock);
return configure_processors_unlocked (err);
@@ -1668,7 +1794,9 @@ Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
int
Route::configure_processors_unlocked (ProcessorStreams* err)
{
+#ifndef PLATFORM_WINDOWS
assert (!AudioEngine::instance()->process_lock().trylock());
+#endif
if (_in_configure_processors) {
return 0;
@@ -2476,6 +2604,9 @@ Route::set_processor_state (const XMLNode& node)
} else if (prop->value() == "meter") {
_meter->set_state (**niter, Stateful::current_state_version);
new_order.push_back (_meter);
+ } else if (prop->value() == "delay") {
+ _delayline->set_state (**niter, Stateful::current_state_version);
+ new_order.push_back (_delayline);
} else if (prop->value() == "main-outs") {
_main_outs->set_state (**niter, Stateful::current_state_version);
} else if (prop->value() == "intreturn") {
@@ -2513,7 +2644,7 @@ Route::set_processor_state (const XMLNode& node)
if (prop->value() == "intsend") {
- processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::shared_ptr<Route>(), Delivery::Aux, true));
+ processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), boost::shared_ptr<Route>(), Delivery::Aux, true));
} else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
prop->value() == "lv2" ||
@@ -2682,7 +2813,7 @@ Route::enable_monitor_send ()
/* make sure we have one */
if (!_monitor_send) {
- _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, _session.monitor_out(), Delivery::Listen));
+ _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), _session.monitor_out(), Delivery::Listen));
_monitor_send->set_display_to_user (false);
}
@@ -2719,7 +2850,8 @@ Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor
{
Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
- listener.reset (new InternalSend (_session, _pannable, _mute_master, route, Delivery::Aux));
+ boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
+ listener.reset (new InternalSend (_session, sendpan, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), route, Delivery::Aux));
}
add_processor (listener, before);
@@ -2806,7 +2938,7 @@ Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
{
const FedBy& fed_by (other->fed_by());
- for (FedBy::iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
+ for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
boost::shared_ptr<Route> sr = f->r.lock();
if (sr && (sr.get() == this)) {
@@ -3185,15 +3317,24 @@ framecnt_t
Route::update_signal_latency ()
{
framecnt_t l = _output->user_latency();
+ framecnt_t lamp = 0;
+ bool before_amp = true;
for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
if ((*i)->active ()) {
l += (*i)->signal_latency ();
}
+ if ((*i) == _amp) {
+ before_amp = false;
+ }
+ if (before_amp) {
+ lamp = l;
+ }
}
DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
+ _signal_latency_at_amp_position = lamp;
if (_signal_latency != l) {
_signal_latency = l;
signal_latency_changed (); /* EMIT SIGNAL */
@@ -3422,14 +3563,14 @@ Route::save_as_template (const string& path, const string& name)
bool
Route::set_name (const string& str)
{
- bool ret;
- string ioproc_name;
- string name;
+ if (str == name()) {
+ return true;
+ }
- name = Route::ensure_track_or_route_name (str, _session);
+ string name = Route::ensure_track_or_route_name (str, _session);
SessionObject::set_name (name);
- ret = (_input->set_name(name) && _output->set_name(name));
+ bool ret = (_input->set_name(name) && _output->set_name(name));
if (ret) {
/* rename the main outs. Leave other IO processors
@@ -3554,6 +3695,10 @@ Route::denormal_protection () const
void
Route::set_active (bool yn, void* src)
{
+ if (_session.transport_rolling()) {
+ return;
+ }
+
if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
_route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
return;
@@ -3904,7 +4049,7 @@ Route::setup_invisible_processors ()
++amp;
}
- assert (amp != _processors.end ());
+ assert (amp != new_processors.end ());
/* and the processor after the amp */
@@ -3996,6 +4141,10 @@ Route::setup_invisible_processors ()
}
}
+ if (!is_master() && !is_monitor() && !is_auditioner()) {
+ new_processors.push_front (_delayline);
+ }
+
/* MONITOR CONTROL */
if (_monitor_control && is_monitor ()) {
@@ -4152,6 +4301,10 @@ Route::non_realtime_locate (framepos_t pos)
_pannable->transport_located (pos);
}
+ if (_delayline.get()) {
+ _delayline.get()->flush();
+ }
+
{
//Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
diff --git a/libs/ardour/route_group_member.cc b/libs/ardour/route_group_member.cc
index 85d2f981d7..3caa7cd1d0 100644
--- a/libs/ardour/route_group_member.cc
+++ b/libs/ardour/route_group_member.cc
@@ -16,6 +16,7 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#include "ardour/libardour_visibility.h"
#include "ardour/route_group_member.h"
using namespace ARDOUR;
diff --git a/libs/ardour/lv2_bundled_search_path.cc b/libs/ardour/scene_change.cc
index d8cd1c1075..eda260382b 100644
--- a/libs/ardour/lv2_bundled_search_path.cc
+++ b/libs/ardour/scene_change.cc
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2013 Paul Davis
+ Copyright (C) 2014 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
@@ -17,25 +17,23 @@
*/
-#include <iostream>
+#include "ardour/midi_scene_change.h"
-#include <glibmm/miscutils.h>
-
-#include "ardour/lv2_bundled_search_path.h"
-#include "ardour/directory_names.h"
-#include "ardour/filesystem_paths.h"
+#include "i18n.h"
using namespace PBD;
+using namespace ARDOUR;
-namespace ARDOUR {
+std::string SceneChange::xml_node_name = X_("SceneChange");
-SearchPath
-lv2_bundled_search_path ()
+boost::shared_ptr<SceneChange>
+SceneChange::factory (const XMLNode& node, int version)
{
- SearchPath spath( ardour_dll_directory () );
- spath.add_subdirectory_to_paths ("LV2");
+ const XMLProperty* prop = node.property (X_("type"));
- return spath;
-}
+ if (prop->value() == X_("MIDI")) {
+ return boost::shared_ptr<SceneChange> (new MIDISceneChange (node, version));
+ }
-} // namespace ARDOUR
+ return boost::shared_ptr<SceneChange>();
+}
diff --git a/libs/ardour/search_paths.cc b/libs/ardour/search_paths.cc
new file mode 100644
index 0000000000..0efcce6451
--- /dev/null
+++ b/libs/ardour/search_paths.cc
@@ -0,0 +1,276 @@
+/*
+ Copyright (C) 2011 Tim Mayberry
+ Copyright (C) 2013 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.
+
+*/
+
+#include <glib.h>
+#include <glibmm.h>
+#include <string.h>
+
+#include "pbd/pathexpand.h"
+
+#include "ardour/search_paths.h"
+#include "ardour/directory_names.h"
+#include "ardour/filesystem_paths.h"
+
+#ifdef PLATFORM_WINDOWS
+#include <windows.h>
+#include <shlobj.h> // CSIDL_*
+#include "pbd/windows_special_dirs.h"
+#endif
+
+namespace {
+ const char * const backend_env_variable_name = "ARDOUR_BACKEND_PATH";
+ const char * const surfaces_env_variable_name = "ARDOUR_SURFACES_PATH";
+ const char * const export_env_variable_name = "ARDOUR_EXPORT_FORMATS_PATH";
+ const char * const ladspa_env_variable_name = "LADSPA_PATH";
+ const char * const midi_patch_env_variable_name = "ARDOUR_MIDI_PATCH_PATH";
+ const char * const panner_env_variable_name = "ARDOUR_PANNER_PATH";
+} // anonymous
+
+using namespace PBD;
+
+namespace ARDOUR {
+
+Searchpath
+backend_search_path ()
+{
+ Searchpath spath(user_config_directory ());
+ spath += ardour_dll_directory ();
+ spath.add_subdirectory_to_paths(backend_dir_name);
+
+ spath += Searchpath(Glib::getenv(backend_env_variable_name));
+ return spath;
+}
+
+Searchpath
+control_protocol_search_path ()
+{
+ Searchpath spath(user_config_directory ());
+ spath += ardour_dll_directory ();
+ spath.add_subdirectory_to_paths (surfaces_dir_name);
+
+ spath += Searchpath(Glib::getenv(surfaces_env_variable_name));
+ return spath;
+}
+
+Searchpath
+export_formats_search_path ()
+{
+ Searchpath spath (ardour_data_search_path());
+ spath.add_subdirectory_to_paths (export_formats_dir_name);
+
+ bool export_formats_path_defined = false;
+ Searchpath spath_env (Glib::getenv(export_env_variable_name, export_formats_path_defined));
+
+ if (export_formats_path_defined) {
+ spath += spath_env;
+ }
+
+ return spath;
+}
+
+Searchpath
+ladspa_search_path ()
+{
+ Searchpath spath_env (Glib::getenv(ladspa_env_variable_name));
+
+ Searchpath spath (user_config_directory ());
+
+ spath += ardour_dll_directory ();
+ spath.add_subdirectory_to_paths (ladspa_dir_name);
+
+#ifndef PLATFORM_WINDOWS
+ spath.push_back ("/usr/local/lib64/ladspa");
+ spath.push_back ("/usr/local/lib/ladspa");
+ spath.push_back ("/usr/lib64/ladspa");
+ spath.push_back ("/usr/lib/ladspa");
+#endif
+
+#ifdef __APPLE__
+ spath.push_back (path_expand ("~/Library/Audio/Plug-Ins/LADSPA"));
+ spath.push_back ("/Library/Audio/Plug-Ins/LADSPA");
+#endif
+
+ return spath_env + spath;
+}
+
+Searchpath
+lv2_bundled_search_path ()
+{
+ Searchpath spath( ardour_dll_directory () );
+ spath.add_subdirectory_to_paths ("LV2");
+
+ return spath;
+}
+
+Searchpath
+midi_patch_search_path ()
+{
+ Searchpath spath (ardour_data_search_path());
+ spath.add_subdirectory_to_paths(midi_patch_dir_name);
+
+ bool midi_patch_path_defined = false;
+ Searchpath spath_env (Glib::getenv(midi_patch_env_variable_name, midi_patch_path_defined));
+
+ if (midi_patch_path_defined) {
+ spath += spath_env;
+ }
+
+ return spath;
+}
+
+Searchpath
+panner_search_path ()
+{
+ Searchpath spath(user_config_directory ());
+
+ spath += ardour_dll_directory ();
+ spath.add_subdirectory_to_paths(panner_dir_name);
+ spath += Searchpath(Glib::getenv(panner_env_variable_name));
+
+ return spath;
+}
+
+Searchpath
+template_search_path ()
+{
+ Searchpath spath (ardour_data_search_path());
+ spath.add_subdirectory_to_paths(templates_dir_name);
+ return spath;
+}
+
+Searchpath
+route_template_search_path ()
+{
+ Searchpath spath (ardour_data_search_path());
+ spath.add_subdirectory_to_paths(route_templates_dir_name);
+ return spath;
+}
+
+#ifdef PLATFORM_WINDOWS
+
+const char*
+vst_search_path ()
+{
+ DWORD dwType = REG_SZ;
+ HKEY hKey;
+ DWORD dwSize = PATH_MAX;
+ char* p = 0;
+ char* user_home = 0;
+ char tmp[PATH_MAX+1];
+
+ if (ERROR_SUCCESS == RegOpenKeyExA (HKEY_CURRENT_USER, "Software\\VST", 0, KEY_READ, &hKey)) {
+ // Look for the user's VST Registry entry
+ if (ERROR_SUCCESS == RegQueryValueExA (hKey, "VSTPluginsPath", 0, &dwType, (LPBYTE)tmp, &dwSize))
+ p = g_build_filename (Glib::locale_to_utf8(tmp).c_str(), 0);
+
+ RegCloseKey (hKey);
+ }
+
+ if (p == 0) {
+ if (ERROR_SUCCESS == RegOpenKeyExA (HKEY_LOCAL_MACHINE, "Software\\VST", 0, KEY_READ, &hKey))
+ {
+ // Look for a global VST Registry entry
+ if (ERROR_SUCCESS == RegQueryValueExA (hKey, "VSTPluginsPath", 0, &dwType, (LPBYTE)tmp, &dwSize))
+ p = g_build_filename (Glib::locale_to_utf8(tmp).c_str(), 0);
+
+ RegCloseKey (hKey);
+ }
+ }
+
+ if (p == 0) {
+ char *pVSTx86 = 0;
+ char *pProgFilesX86 = PBD::get_win_special_folder (CSIDL_PROGRAM_FILESX86);
+
+ if (pProgFilesX86) {
+ // Look for a VST folder under C:\Program Files (x86)
+ if (pVSTx86 = g_build_filename (pProgFilesX86, "Steinberg", "VSTPlugins", 0))
+ {
+ if (Glib::file_test (pVSTx86, Glib::FILE_TEST_EXISTS))
+ if (Glib::file_test (pVSTx86, Glib::FILE_TEST_IS_DIR))
+ p = g_build_filename (pVSTx86, 0);
+
+ g_free (pVSTx86);
+ }
+
+ g_free (pProgFilesX86);
+ }
+
+ if (p == 0) {
+ // Look for a VST folder under C:\Program Files
+ char *pVST = 0;
+ char *pProgFiles = PBD::get_win_special_folder (CSIDL_PROGRAM_FILES);
+
+ if (pProgFiles) {
+ if (pVST = g_build_filename (pProgFiles, "Steinberg", "VSTPlugins", 0)) {
+ if (Glib::file_test (pVST, Glib::FILE_TEST_EXISTS))
+ if (Glib::file_test (pVST, Glib::FILE_TEST_IS_DIR))
+ p = g_build_filename (pVST, 0);
+
+ g_free (pVST);
+ }
+
+ g_free (pProgFiles);
+ }
+ }
+ }
+
+ if (p == 0) {
+ // If all else failed, assume the plugins are under "My Documents"
+ user_home = (char*) g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS);
+ if (user_home) {
+ p = g_build_filename (user_home, "Plugins", "VST", 0);
+ } else {
+ user_home = g_build_filename(g_get_home_dir(), "My Documents", 0);
+ if (user_home)
+ p = g_build_filename (user_home, "Plugins", "VST", 0);
+ }
+ } else {
+ // Concatenate the registry path with the user's personal path
+ user_home = (char*) g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS);
+
+ if (user_home) {
+ p = g_build_path (";", p, g_build_filename(user_home, "Plugins", "VST", 0), 0);
+ } else {
+ user_home = g_build_filename(g_get_home_dir(), "My Documents", 0);
+
+ if (user_home) {
+ p = g_build_path (";", p, g_build_filename (user_home, "Plugins", "VST", 0), 0);
+ }
+ }
+ }
+
+ return p;
+}
+
+#else
+
+/* Unix-like. Probably require some OS X specific breakdown if we ever add VST
+ * support on that platform.
+ */
+
+const char *
+vst_search_path ()
+{
+ return "/usr/local/lib/vst:/usr/lib/vst";
+}
+
+#endif // PLATFORM_WINDOWS
+
+} // namespace ARDOUR
diff --git a/libs/ardour/send.cc b/libs/ardour/send.cc
index 71cab46879..87aadf4193 100644
--- a/libs/ardour/send.cc
+++ b/libs/ardour/send.cc
@@ -24,12 +24,13 @@
#include "pbd/boost_debug.h"
#include "ardour/amp.h"
-#include "ardour/send.h"
-#include "ardour/session.h"
#include "ardour/buffer_set.h"
-#include "ardour/meter.h"
+#include "ardour/debug.h"
#include "ardour/io.h"
+#include "ardour/meter.h"
#include "ardour/panner_shell.h"
+#include "ardour/send.h"
+#include "ardour/session.h"
#include "i18n.h"
@@ -73,6 +74,8 @@ Send::name_and_id_new_send (Session& s, Role r, uint32_t& bitslot, bool ignore_b
Send::Send (Session& s, boost::shared_ptr<Pannable> p, boost::shared_ptr<MuteMaster> mm, Role r, bool ignore_bitslot)
: Delivery (s, p, mm, name_and_id_new_send (s, r, _bitslot, ignore_bitslot), r)
, _metering (false)
+ , _delay_in (0)
+ , _delay_out (0)
{
if (_role == Listen) {
/* we don't need to do this but it keeps things looking clean
@@ -86,6 +89,8 @@ Send::Send (Session& s, boost::shared_ptr<Pannable> p, boost::shared_ptr<MuteMas
_amp.reset (new Amp (_session));
_meter.reset (new PeakMeter (_session, name()));
+ _delayline.reset (new DelayLine (_session, name()));
+
add_control (_amp->gain_control ());
if (panner_shell()) {
@@ -118,6 +123,35 @@ Send::deactivate ()
}
void
+Send::set_delay_in(framecnt_t delay)
+{
+ if (!_delayline) return;
+ if (_delay_in == delay) {
+ return;
+ }
+ _delay_in = delay;
+
+ DEBUG_TRACE (DEBUG::LatencyCompensation,
+ string_compose ("Send::set_delay_in(%1) + %2 = %3\n",
+ delay, _delay_out, _delay_out + _delay_in));
+ _delayline.get()->set_delay(_delay_out + _delay_in);
+}
+
+void
+Send::set_delay_out(framecnt_t delay)
+{
+ if (!_delayline) return;
+ if (_delay_out == delay) {
+ return;
+ }
+ _delay_out = delay;
+ DEBUG_TRACE (DEBUG::LatencyCompensation,
+ string_compose ("Send::set_delay_out(%1) + %2 = %3\n",
+ delay, _delay_in, _delay_out + _delay_in));
+ _delayline.get()->set_delay(_delay_out + _delay_in);
+}
+
+void
Send::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool)
{
if (_output->n_ports() == ChanCount::ZERO) {
@@ -146,6 +180,8 @@ Send::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframe
_amp->setup_gain_automation (start_frame, end_frame, nframes);
_amp->run (sendbufs, start_frame, end_frame, nframes, true);
+ _delayline->run (sendbufs, start_frame, end_frame, nframes, true);
+
/* deliver to outputs */
Delivery::run (sendbufs, start_frame, end_frame, nframes, true);
@@ -301,6 +337,11 @@ Send::configure_io (ChanCount in, ChanCount out)
return false;
}
+ if (_delayline && !_delayline->configure_io(in, out)) {
+ cerr << "send delayline config failed\n";
+ return false;
+ }
+
reset_panner ();
return true;
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index 0e4a10f76b..ae39d7c468 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -39,14 +39,13 @@
#include "pbd/convert.h"
#include "pbd/error.h"
#include "pbd/boost_debug.h"
-#include "pbd/pathscanner.h"
#include "pbd/stl_delete.h"
#include "pbd/basename.h"
#include "pbd/stacktrace.h"
#include "pbd/file_utils.h"
#include "pbd/convert.h"
-#include "pbd/strsplit.h"
#include "pbd/unwind.h"
+#include "pbd/search_path.h"
#include "ardour/amp.h"
#include "ardour/analyser.h"
@@ -69,6 +68,7 @@
#include "ardour/filename_extensions.h"
#include "ardour/graph.h"
#include "ardour/midiport_manager.h"
+#include "ardour/scene_changer.h"
#include "ardour/midi_track.h"
#include "ardour/midi_ui.h"
#include "ardour/operations.h"
@@ -82,6 +82,7 @@
#include "ardour/region_factory.h"
#include "ardour/route_graph.h"
#include "ardour/route_group.h"
+#include "ardour/route_sorters.h"
#include "ardour/send.h"
#include "ardour/session.h"
#include "ardour/session_directory.h"
@@ -125,6 +126,7 @@ PBD::Signal0<void> Session::FeedbackDetected;
PBD::Signal0<void> Session::SuccessfulGraphSort;
PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
+const framecnt_t Session::bounce_chunk_size = 65536;
static void clean_up_session_event (SessionEvent* ev) { delete ev; }
const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
@@ -137,6 +139,7 @@ Session::Session (AudioEngine &eng,
: playlists (new SessionPlaylists)
, _engine (eng)
, process_function (&Session::process_with_events)
+ , _bounce_processing_active (false)
, waiting_for_sync_offset (false)
, _base_frame_rate (0)
, _current_frame_rate (0)
@@ -192,6 +195,8 @@ Session::Session (AudioEngine &eng,
, state_tree (0)
, state_was_pending (false)
, _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading))
+ , _suspend_save (0)
+ , _save_queued (false)
, _last_roll_location (0)
, _last_roll_or_reversal_location (0)
, _last_record_location (0)
@@ -233,6 +238,7 @@ Session::Session (AudioEngine &eng,
, routes (new RouteList)
, _adding_routes_in_progress (false)
, destructive_index (0)
+ , _track_number_decimals(1)
, solo_update_disabled (false)
, default_fade_steepness (0)
, default_fade_msecs (0)
@@ -261,6 +267,7 @@ Session::Session (AudioEngine &eng,
, _speakers (new Speakers)
, _order_hint (0)
, ignore_route_processor_changes (false)
+ , _scene_changer (0)
, _midi_ports (0)
, _mmc (0)
{
@@ -294,6 +301,9 @@ Session::Session (AudioEngine &eng,
throw failed_constructor ();
}
+ /* load default session properties - if any */
+ config.load_state();
+
} else {
if (load_state (_current_snapshot_name)) {
@@ -491,6 +501,14 @@ Session::destroy ()
clear_clicks ();
+ /* need to remove auditioner before monitoring section
+ * otherwise it is re-connected */
+ auditioner.reset ();
+
+ /* drop references to routes held by the monitoring section
+ * specifically _monitor_out aux/listen references */
+ remove_monitor_section();
+
/* clear out any pending dead wood from RCU managed objects */
routes.flush ();
@@ -510,7 +528,6 @@ Session::destroy ()
/* reset these three references to special routes before we do the usual route delete thing */
- auditioner.reset ();
_master_out.reset ();
_monitor_out.reset ();
@@ -548,6 +565,8 @@ Session::destroy ()
/* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
playlists.reset ();
+ delete _scene_changer; _scene_changer = 0;
+
delete _mmc; _mmc = 0;
delete _midi_ports; _midi_ports = 0;
delete _locations; _locations = 0;
@@ -1874,6 +1893,7 @@ Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost:
failed:
if (!new_routes.empty()) {
+ StateProtector sp (this);
add_routes (new_routes, true, true, true);
if (instrument) {
@@ -2115,6 +2135,7 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod
failed:
if (!new_routes.empty()) {
+ StateProtector sp (this);
add_routes (new_routes, true, true, true);
}
@@ -2200,6 +2221,7 @@ Session::new_audio_route (int input_channels, int output_channels, RouteGroup* r
failure:
if (!ret.empty()) {
+ StateProtector sp (this);
add_routes (ret, false, true, true); // autoconnect outputs only
}
@@ -2316,6 +2338,7 @@ Session::new_route_from_template (uint32_t how_many, const std::string& template
out:
if (!ret.empty()) {
+ StateProtector sp (this);
add_routes (ret, true, true, true);
IO::enable_connecting ();
}
@@ -2345,6 +2368,8 @@ Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output
save_state (_current_snapshot_name);
}
+ reassign_track_numbers();
+
RouteAdded (new_routes); /* EMIT SIGNAL */
}
@@ -2586,6 +2611,13 @@ Session::remove_route (boost::shared_ptr<Route> route)
}
}
+ /* if the monitoring section had a pointer to this route, remove it */
+ if (_monitor_out && !route->is_master() && !route->is_monitor()) {
+ Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
+ PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
+ route->remove_aux_or_listen (_monitor_out);
+ }
+
boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
if (mt && mt->step_editing()) {
if (_step_editors > 0) {
@@ -2622,6 +2654,7 @@ Session::remove_route (boost::shared_ptr<Route> route)
if (save_state (_current_snapshot_name)) {
save_history (_current_snapshot_name);
}
+ reassign_track_numbers();
}
void
@@ -3038,6 +3071,42 @@ Session::route_by_remote_id (uint32_t id)
return boost::shared_ptr<Route> ((Route*) 0);
}
+
+void
+Session::reassign_track_numbers ()
+{
+ int64_t tn = 0;
+ int64_t bn = 0;
+ RouteList r (*(routes.reader ()));
+ SignalOrderRouteSorter sorter;
+ r.sort (sorter);
+
+ StateProtector sp (this);
+
+ for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
+ if (boost::dynamic_pointer_cast<Track> (*i)) {
+ (*i)->set_track_number(++tn);
+ }
+ else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
+ (*i)->set_track_number(--bn);
+ }
+ }
+ const uint32_t decimals = ceilf (log10f (tn + 1));
+ const bool decimals_changed = _track_number_decimals != decimals;
+ _track_number_decimals = decimals;
+
+ if (decimals_changed && config.get_track_name_number ()) {
+ for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
+ boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
+ if (t) {
+ t->resync_track_name();
+ }
+ }
+ // trigger GUI re-layout
+ config.ParameterChanged("track-name-number");
+ }
+}
+
void
Session::playlist_region_added (boost::weak_ptr<Region> w)
{
@@ -3681,6 +3750,9 @@ Session::audition_region (boost::shared_ptr<Region> r)
void
Session::cancel_audition ()
{
+ if (!auditioner) {
+ return;
+ }
if (auditioner->auditioning()) {
auditioner->cancel_audition ();
AuditionActive (false); /* EMIT SIGNAL */
@@ -3863,7 +3935,7 @@ Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
void
Session::ensure_buffers (ChanCount howmany)
{
- BufferManager::ensure_buffers (howmany);
+ BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
}
void
@@ -4104,7 +4176,7 @@ Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
InterThreadInfo& itt,
boost::shared_ptr<Processor> endpoint, bool include_endpoint,
- bool for_export)
+ bool for_export, bool for_freeze)
{
boost::shared_ptr<Region> result;
boost::shared_ptr<Playlist> playlist;
@@ -4113,10 +4185,13 @@ Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
framepos_t position;
framecnt_t this_chunk;
framepos_t to_do;
+ framepos_t latency_skip;
BufferSet buffers;
framepos_t len = end - start;
bool need_block_size_reset = false;
ChanCount const max_proc = track.max_processor_streams ();
+ string legal_playlist_name;
+ string possible_path;
if (end <= start) {
error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
@@ -4124,22 +4199,40 @@ Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
return result;
}
- const framecnt_t chunk_size = (256 * 1024)/4;
+ diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
+ include_endpoint, for_export, for_freeze);
+
+ if (diskstream_channels.n_audio() < 1) {
+ error << _("Cannot write a range with no audio.") << endmsg;
+ return result;
+ }
// block all process callback handling
block_processing ();
+ {
+ // synchronize with AudioEngine::process_callback()
+ // make sure processing is not currently running
+ // and processing_blocked() is honored before
+ // acquiring thread buffers
+ Glib::Threads::Mutex::Lock lm (_engine.process_lock());
+ }
+
+ _bounce_processing_active = true;
+
/* call tree *MUST* hold route_lock */
if ((playlist = track.playlist()) == 0) {
goto out;
}
+ legal_playlist_name = legalize_for_path (playlist->name());
+
for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
- string path = new_audio_source_path (base_name, diskstream_channels.n_audio(), chan_n, false, true);
+ string path = new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true);
if (path.empty()) {
goto out;
@@ -4164,13 +4257,17 @@ Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
*/
need_block_size_reset = true;
- track.set_block_size (chunk_size);
+ track.set_block_size (bounce_chunk_size);
+ _engine.main_thread()->get_buffers ();
position = start;
to_do = len;
+ latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
/* create a set of reasonably-sized buffers */
- buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
+ }
buffers.set_count (max_proc);
for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
@@ -4181,28 +4278,56 @@ Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
while (to_do && !itt.cancel) {
- this_chunk = min (to_do, chunk_size);
+ this_chunk = min (to_do, bounce_chunk_size);
- if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export)) {
+ if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
goto out;
}
+ start += this_chunk;
+ to_do -= this_chunk;
+ itt.progress = (float) (1.0 - ((double) to_do / len));
+
+ if (latency_skip >= bounce_chunk_size) {
+ latency_skip -= bounce_chunk_size;
+ continue;
+ }
+
+ const framecnt_t current_chunk = this_chunk - latency_skip;
+
uint32_t n = 0;
for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
if (afs) {
- if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
+ if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
goto out;
}
}
}
+ latency_skip = 0;
+ }
- start += this_chunk;
- to_do -= this_chunk;
+ /* post-roll, pick up delayed processor output */
+ latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
- itt.progress = (float) (1.0 - ((double) to_do / len));
+ while (latency_skip && !itt.cancel) {
+ this_chunk = min (latency_skip, bounce_chunk_size);
+ latency_skip -= this_chunk;
+
+ buffers.silence (this_chunk, 0);
+ track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
+ uint32_t n = 0;
+ for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
+ boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
+
+ if (afs) {
+ if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
+ goto out;
+ }
+ }
+ }
}
if (!itt.cancel) {
@@ -4254,8 +4379,10 @@ Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
}
}
+ _bounce_processing_active = false;
if (need_block_size_reset) {
+ _engine.main_thread()->drop_buffers ();
track.set_block_size (get_block_size());
}
@@ -4546,18 +4673,18 @@ Session::end_time_changed (framepos_t old)
}
}
-string
+std::vector<std::string>
Session::source_search_path (DataType type) const
{
- vector<string> s;
+ Searchpath sp;
if (session_dirs.size() == 1) {
switch (type) {
case DataType::AUDIO:
- s.push_back (_session_dir->sound_path());
+ sp.push_back (_session_dir->sound_path());
break;
case DataType::MIDI:
- s.push_back (_session_dir->midi_path());
+ sp.push_back (_session_dir->midi_path());
break;
}
} else {
@@ -4565,10 +4692,10 @@ Session::source_search_path (DataType type) const
SessionDirectory sdir (i->path);
switch (type) {
case DataType::AUDIO:
- s.push_back (sdir.sound_path());
+ sp.push_back (sdir.sound_path());
break;
case DataType::MIDI:
- s.push_back (sdir.midi_path());
+ sp.push_back (sdir.midi_path());
break;
}
}
@@ -4577,49 +4704,30 @@ Session::source_search_path (DataType type) const
if (type == DataType::AUDIO) {
const string sound_path_2X = _session_dir->sound_path_2X();
if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
- if (find (s.begin(), s.end(), sound_path_2X) == s.end()) {
- s.push_back (sound_path_2X);
+ if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
+ sp.push_back (sound_path_2X);
}
}
}
- /* now check the explicit (possibly user-specified) search path
- */
-
- vector<string> dirs;
+ // now check the explicit (possibly user-specified) search path
switch (type) {
case DataType::AUDIO:
- split (config.get_audio_search_path (), dirs, ':');
+ sp += Searchpath(config.get_audio_search_path ());
break;
case DataType::MIDI:
- split (config.get_midi_search_path (), dirs, ':');
+ sp += Searchpath(config.get_midi_search_path ());
break;
}
- for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
- if (find (s.begin(), s.end(), *i) == s.end()) {
- s.push_back (*i);
- }
- }
-
- string search_path;
-
- for (vector<string>::iterator si = s.begin(); si != s.end(); ++si) {
- if (!search_path.empty()) {
- search_path += ':';
- }
- search_path += *si;
- }
-
- return search_path;
+ return sp;
}
void
Session::ensure_search_path_includes (const string& path, DataType type)
{
- string search_path;
- vector<string> dirs;
+ Searchpath sp;
if (path == ".") {
return;
@@ -4627,16 +4735,14 @@ Session::ensure_search_path_includes (const string& path, DataType type)
switch (type) {
case DataType::AUDIO:
- search_path = config.get_audio_search_path ();
+ sp += Searchpath(config.get_audio_search_path ());
break;
case DataType::MIDI:
- search_path = config.get_midi_search_path ();
+ sp += Searchpath (config.get_midi_search_path ());
break;
}
- split (search_path, dirs, ':');
-
- for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
+ for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
/* No need to add this new directory if it has the same inode as
an existing one; checking inode rather than name prevents duplicated
directories when we are using symlinks.
@@ -4648,18 +4754,14 @@ Session::ensure_search_path_includes (const string& path, DataType type)
}
}
- if (!search_path.empty()) {
- search_path += ':';
- }
-
- search_path += path;
+ sp += path;
switch (type) {
case DataType::AUDIO:
- config.set_audio_search_path (search_path);
+ config.set_audio_search_path (sp.to_string());
break;
case DataType::MIDI:
- config.set_midi_search_path (search_path);
+ config.set_midi_search_path (sp.to_string());
break;
}
}
@@ -4944,6 +5046,8 @@ Session::sync_order_keys ()
DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
+ reassign_track_numbers();
+
Route::SyncOrderKeys (); /* EMIT SIGNAL */
DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
diff --git a/libs/ardour/session_butler.cc b/libs/ardour/session_butler.cc
index 1d235b051a..3e7c2226cc 100644
--- a/libs/ardour/session_butler.cc
+++ b/libs/ardour/session_butler.cc
@@ -17,16 +17,6 @@
*/
-#include <algorithm>
-#include <string>
-#include <cmath>
-#include <cerrno>
-#include <unistd.h>
-#include <fcntl.h>
-#include <poll.h>
-
-#include <glibmm/threads.h>
-
#include "pbd/error.h"
#include "pbd/pthread_utils.h"
#include "pbd/stacktrace.h"
diff --git a/libs/ardour/session_configuration.cc b/libs/ardour/session_configuration.cc
index 0cfdb52872..f9f43ba4b2 100644
--- a/libs/ardour/session_configuration.cc
+++ b/libs/ardour/session_configuration.cc
@@ -17,9 +17,15 @@
*/
+#include <glib.h>
+#include <glib/gstdio.h> /* for g_stat() */
+#include <glibmm/miscutils.h> /* for build_filename() */
+
+#include "pbd/file_utils.h"
#include "pbd/pathexpand.h"
#include "ardour/types.h"
+#include "ardour/filesystem_paths.h"
#include "ardour/session_configuration.h"
#include "i18n.h"
@@ -122,3 +128,67 @@ SessionConfiguration::map_parameters (boost::function<void (std::string)>& funct
#undef CONFIG_VARIABLE
#undef CONFIG_VARIABLE_SPECIAL
}
+
+
+bool
+SessionConfiguration::load_state ()
+{
+ std::string rcfile;
+ GStatBuf statbuf;
+ if (find_file (ardour_config_search_path(), "session.rc", rcfile)) {
+ if (g_stat (rcfile.c_str(), &statbuf)) {
+ return false;
+ }
+ if (statbuf.st_size == 0) {
+ return false;
+ }
+ XMLTree tree;
+ if (!tree.read (rcfile.c_str())) {
+ error << string_compose(_("%1: cannot part default session options \"%2\""), PROGRAM_NAME, rcfile) << endmsg;
+ return false;
+ }
+
+ XMLNode& root (*tree.root());
+ if (root.name() != X_("SessionDefaults")) {
+ warning << _("Invalid session default XML Root.") << endmsg;
+ return false;
+ }
+
+ XMLNode* node;
+ if (((node = find_named_node (root, X_("Config"))) != 0)) {
+ LocaleGuard lg (X_("POSIX"));
+ set_variables(*node);
+ info << _("Loaded custom session defaults.") << endmsg;
+ } else {
+ warning << _("Found no session defaults in XML file.") << endmsg;
+ return false;
+ }
+
+ /* CUSTOM OVERRIDES */
+ set_audio_search_path("");
+ set_midi_search_path("");
+ set_raid_path("");
+ }
+ return true;
+}
+
+bool
+SessionConfiguration::save_state ()
+{
+ const std::string rcfile = Glib::build_filename (user_config_directory(), "session.rc");
+ if (rcfile.empty()) {
+ return false;
+ }
+
+ XMLTree tree;
+ XMLNode* root = new XMLNode(X_("SessionDefaults"));
+ root->add_child_nocopy (get_variables ());
+ tree.set_root (root);
+
+ if (!tree.write (rcfile.c_str())) {
+ error << _("Could not save session options") << endmsg;
+ return false;
+ }
+
+ return true;
+}
diff --git a/libs/ardour/session_events.cc b/libs/ardour/session_events.cc
index 6c828ac6f0..28d1b556f5 100644
--- a/libs/ardour/session_events.cc
+++ b/libs/ardour/session_events.cc
@@ -23,6 +23,7 @@
#include "pbd/error.h"
#include "pbd/enumwriter.h"
#include "pbd/stacktrace.h"
+#include "pbd/pthread_utils.h"
#include "ardour/debug.h"
#include "ardour/session_event.h"
@@ -56,7 +57,7 @@ SessionEvent::operator new (size_t)
{
CrossThreadPool* p = pool->per_thread_pool ();
SessionEvent* ev = static_cast<SessionEvent*> (p->alloc ());
- DEBUG_TRACE (DEBUG::SessionEvents, string_compose ("%1 Allocating SessionEvent from %2 ev @ %3\n", pthread_self(), p->name(), ev));
+ DEBUG_TRACE (DEBUG::SessionEvents, string_compose ("%1 Allocating SessionEvent from %2 ev @ %3\n", pthread_name(), p->name(), ev));
#ifndef NDEBUG
if (DEBUG::SessionEvents & PBD::debug_bits) {
stacktrace (cerr, 40);
@@ -74,7 +75,7 @@ SessionEvent::operator delete (void *ptr, size_t /*size*/)
DEBUG_TRACE (DEBUG::SessionEvents, string_compose (
"%1 Deleting SessionEvent @ %2 ev thread pool = %3 ev pool = %4\n",
- pthread_self(), ev, p->name(), ev->own_pool->name()
+ pthread_name(), ev, p->name(), ev->own_pool->name()
));
#ifndef NDEBUG
@@ -243,7 +244,7 @@ SessionEventManager::_remove_event (SessionEvent* ev)
if (i == next_event) {
++next_event;
}
- events.erase (i);
+ i = events.erase (i);
break;
}
}
diff --git a/libs/ardour/session_ltc.cc b/libs/ardour/session_ltc.cc
index b2fbaf602c..2ce25b5a48 100644
--- a/libs/ardour/session_ltc.cc
+++ b/libs/ardour/session_ltc.cc
@@ -31,7 +31,6 @@
using namespace std;
using namespace ARDOUR;
-using namespace MIDI;
using namespace PBD;
using namespace Timecode;
diff --git a/libs/ardour/session_midi.cc b/libs/ardour/session_midi.cc
index 6d3083df77..639ea399d3 100644
--- a/libs/ardour/session_midi.cc
+++ b/libs/ardour/session_midi.cc
@@ -22,8 +22,6 @@
#include <cerrno>
#include <cassert>
#include <unistd.h>
-#include <fcntl.h>
-#include <poll.h>
#include <boost/shared_ptr.hpp>
@@ -34,6 +32,7 @@
#include "pbd/error.h"
#include "pbd/pthread_utils.h"
+#include "pbd/timersub.h"
#include "timecode/time.h"
@@ -349,7 +348,7 @@ Session::mmc_record_enable (MIDI::MachineControl &mmc, size_t trk, bool enabled)
* @param t time to send.
*/
int
-Session::send_full_time_code (framepos_t const t, pframes_t nframes)
+Session::send_full_time_code (framepos_t const t, MIDI::pframes_t nframes)
{
/* This function could easily send at a given frame offset, but would
* that be useful? Does ardour do sub-block accurate locating? [DR] */
@@ -418,7 +417,7 @@ Session::send_full_time_code (framepos_t const t, pframes_t nframes)
msg[4] = 0x1;
msg[9] = 0xf7;
- msg[5] = mtc_timecode_bits | timecode.hours;
+ msg[5] = mtc_timecode_bits | (timecode.hours % 24);
msg[6] = timecode.minutes;
msg[7] = timecode.seconds;
msg[8] = timecode.frames;
@@ -440,7 +439,7 @@ Session::send_full_time_code (framepos_t const t, pframes_t nframes)
* earlier already this cycle by send_full_time_code)
*/
int
-Session::send_midi_time_code_for_cycle (framepos_t start_frame, framepos_t end_frame, pframes_t nframes)
+Session::send_midi_time_code_for_cycle (framepos_t start_frame, framepos_t end_frame, ARDOUR::pframes_t nframes)
{
if (_engine.freewheeling() || !_send_qf_mtc || transmitting_timecode_time.negative || (next_quarter_frame_to_send < 0)) {
// cerr << "(MTC) Not sending MTC\n";
@@ -512,7 +511,7 @@ Session::send_midi_time_code_for_cycle (framepos_t start_frame, framepos_t end_f
assert (msg_time < end_frame);
/* convert from session frames back to JACK frames using the transport speed */
- pframes_t const out_stamp = (msg_time - start_frame) / _transport_speed;
+ ARDOUR::pframes_t const out_stamp = (msg_time - start_frame) / _transport_speed;
assert (out_stamp < nframes);
MidiBuffer& mb (_midi_ports->mtc_output_port()->get_midi_buffer(nframes));
@@ -645,3 +644,27 @@ Session::mmc_input_port () const
{
return _midi_ports->mmc_input_port ();
}
+
+MIDI::Port*
+Session::scene_output_port () const
+{
+ return _midi_ports->scene_output_port ();
+}
+
+MIDI::Port*
+Session::scene_input_port () const
+{
+ return _midi_ports->scene_input_port ();
+}
+
+boost::shared_ptr<MidiPort>
+Session::scene_in () const
+{
+ return _midi_ports->scene_in ();
+}
+
+boost::shared_ptr<MidiPort>
+Session::scene_out () const
+{
+ return _midi_ports->scene_out ();
+}
diff --git a/libs/ardour/session_playlists.cc b/libs/ardour/session_playlists.cc
index b2c4640880..b586ab196e 100644
--- a/libs/ardour/session_playlists.cc
+++ b/libs/ardour/session_playlists.cc
@@ -221,11 +221,11 @@ SessionPlaylists::get (vector<boost::shared_ptr<Playlist> >& s) const
{
Glib::Threads::Mutex::Lock lm (lock);
- for (List::iterator i = playlists.begin(); i != playlists.end(); ++i) {
+ for (List::const_iterator i = playlists.begin(); i != playlists.end(); ++i) {
s.push_back (*i);
}
- for (List::iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) {
+ for (List::const_iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) {
s.push_back (*i);
}
}
@@ -448,11 +448,11 @@ SessionPlaylists::region_use_count (boost::shared_ptr<Region> region) const
Glib::Threads::Mutex::Lock lm (lock);
uint32_t cnt = 0;
- for (List::iterator i = playlists.begin(); i != playlists.end(); ++i) {
+ for (List::const_iterator i = playlists.begin(); i != playlists.end(); ++i) {
cnt += (*i)->region_use_count (region);
}
- for (List::iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) {
+ for (List::const_iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) {
cnt += (*i)->region_use_count (region);
}
diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc
index 6bfb250aec..680f2861de 100644
--- a/libs/ardour/session_process.cc
+++ b/libs/ardour/session_process.cc
@@ -35,6 +35,7 @@
#include "ardour/graph.h"
#include "ardour/port.h"
#include "ardour/process_thread.h"
+#include "ardour/scene_changer.h"
#include "ardour/session.h"
#include "ardour/slave.h"
#include "ardour/ticker.h"
@@ -86,6 +87,9 @@ Session::process (pframes_t nframes)
if (!_silent && !_engine.freewheeling() && Config->get_send_midi_clock() && (transport_speed() == 1.0f || transport_speed() == 0.0f) && midi_clock->has_midi_port()) {
midi_clock->tick (transport_at_start, nframes);
}
+
+ _scene_changer->run (transport_at_start, transport_at_start + nframes);
+
} catch (...) {
/* don't bother with a message */
}
@@ -1010,7 +1014,7 @@ Session::process_event (SessionEvent* ev)
switch (ev->type) {
case SessionEvent::SetLoop:
- set_play_loop (ev->yes_or_no);
+ set_play_loop (ev->yes_or_no, ev->speed);
break;
case SessionEvent::AutoLoop:
diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc
index c985f8810a..eaf9f08b25 100644
--- a/libs/ardour/session_state.cc
+++ b/libs/ardour/session_state.cc
@@ -33,15 +33,14 @@
#include <unistd.h>
#include <sys/stat.h>
#include <climits>
-#include <fcntl.h>
-#include <poll.h>
#include <signal.h>
-#include <sys/mman.h>
#include <sys/time.h>
#ifdef HAVE_SYS_VFS_H
#include <sys/vfs.h>
-#else
+#endif
+
+#ifdef __APPLE__
#include <sys/param.h>
#include <sys/mount.h>
#endif
@@ -69,13 +68,14 @@
#include "pbd/enumwriter.h"
#include "pbd/error.h"
#include "pbd/file_utils.h"
-#include "pbd/pathscanner.h"
+#include "pbd/pathexpand.h"
#include "pbd/pthread_utils.h"
#include "pbd/stacktrace.h"
#include "pbd/convert.h"
-#include "pbd/clear_dir.h"
+#include "pbd/localtime_r.h"
#include "ardour/amp.h"
+#include "ardour/async_midi_port.h"
#include "ardour/audio_diskstream.h"
#include "ardour/audio_track.h"
#include "ardour/audioengine.h"
@@ -91,6 +91,7 @@
#include "ardour/midi_model.h"
#include "ardour/midi_patch_manager.h"
#include "ardour/midi_region.h"
+#include "ardour/midi_scene_changer.h"
#include "ardour/midi_source.h"
#include "ardour/midi_track.h"
#include "ardour/pannable.h"
@@ -135,23 +136,8 @@ Session::pre_engine_init (string fullpath)
/* discover canonical fullpath */
- char buf[PATH_MAX+1];
+ _path = canonical_path(fullpath);
- if (!realpath (fullpath.c_str(), buf)) {
- if (errno == ENOENT) {
- /* fullpath does not exist yet, so realpath() returned
- * ENOENT. Just use it as-is
- */
- _path = fullpath;
- } else {
- error << string_compose(_("Could not use path %1 (%2)"), buf, strerror(errno)) << endmsg;
- destroy ();
- throw failed_constructor();
- }
- } else {
- _path = string(buf);
- }
-
/* we require _path to end with a dir separator */
if (_path[_path.length()-1] != G_DIR_SEPARATOR) {
@@ -221,6 +207,16 @@ Session::post_engine_init ()
BootMessage (_("Using configuration"));
_midi_ports = new MidiPortManager;
+
+ MIDISceneChanger* msc;
+
+ _scene_changer = msc = new MIDISceneChanger (*this);
+ msc->set_input_port (scene_input_port());
+ msc->set_output_port (scene_out());
+
+ boost::function<framecnt_t(void)> timer_func (boost::bind (&Session::audible_frame, this));
+ boost::dynamic_pointer_cast<AsyncMIDIPort>(scene_in())->set_timer (timer_func);
+
setup_midi_machine_control ();
if (_butler->start_thread()) {
@@ -363,7 +359,7 @@ Session::post_engine_init ()
string
Session::raid_path () const
{
- SearchPath raid_search_path;
+ Searchpath raid_search_path;
for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
raid_search_path += (*i).path;
@@ -384,11 +380,11 @@ Session::setup_raid_path (string path)
session_dirs.clear ();
- SearchPath search_path(path);
- SearchPath sound_search_path;
- SearchPath midi_search_path;
+ Searchpath search_path(path);
+ Searchpath sound_search_path;
+ Searchpath midi_search_path;
- for (SearchPath::const_iterator i = search_path.begin(); i != search_path.end(); ++i) {
+ for (Searchpath::const_iterator i = search_path.begin(); i != search_path.end(); ++i) {
sp.path = *i;
sp.blocks = 0; // not needed
session_dirs.push_back (sp);
@@ -673,6 +669,12 @@ Session::save_state (string snapshot_name, bool pending, bool switch_to_snapshot
return 1;
}
+ if (g_atomic_int_get(&_suspend_save)) {
+ _save_queued = true;
+ return 1;
+ }
+ _save_queued = false;
+
if (!_engine.connected ()) {
error << string_compose (_("the %1 audio engine is not connected and state saving would lose all I/O connections. Session not saved"),
PROGRAM_NAME)
@@ -734,9 +736,9 @@ Session::save_state (string snapshot_name, bool pending, bool switch_to_snapshot
} else {
- if (::rename (tmp_path.c_str(), xml_path.c_str()) != 0) {
- error << string_compose (_("could not rename temporary session file %1 to %2"),
- tmp_path, xml_path) << endmsg;
+ if (::g_rename (tmp_path.c_str(), xml_path.c_str()) != 0) {
+ error << string_compose (_("could not rename temporary session file %1 to %2 (%3)"),
+ tmp_path, xml_path, g_strerror(errno)) << endmsg;
if (g_remove (tmp_path.c_str()) != 0) {
error << string_compose(_("Could not remove temporary session file at path \"%1\" (%2)"),
tmp_path, g_strerror (errno)) << endmsg;
@@ -812,7 +814,7 @@ Session::load_state (string snapshot_name)
set_dirty();
- _writable = exists_and_writable (xmlpath);
+ _writable = exists_and_writable (xmlpath) && exists_and_writable(Glib::path_get_dirname(xmlpath));
if (!state_tree->read (xmlpath)) {
error << string_compose(_("Could not understand session file %1"), xmlpath) << endmsg;
@@ -877,6 +879,12 @@ Session::load_options (const XMLNode& node)
return 0;
}
+bool
+Session::save_default_options ()
+{
+ return config.save_state();
+}
+
XMLNode&
Session::get_state()
{
@@ -930,7 +938,7 @@ Session::state (bool full_state)
p += (*i).path;
if (next != session_dirs.end()) {
- p += ':';
+ p += G_SEARCHPATH_SEPARATOR;
} else {
break;
}
@@ -1423,7 +1431,13 @@ Session::XMLRouteFactory (const XMLNode& node, int version)
ret = track;
} else {
- boost::shared_ptr<Route> r (new Route (*this, X_("toBeResetFroXML")));
+ enum Route::Flag flags = Route::Flag(0);
+ const XMLProperty* prop = node.property("flags");
+ if (prop) {
+ flags = Route::Flag (string_2_enum (prop->value(), flags));
+ }
+
+ boost::shared_ptr<Route> r (new Route (*this, X_("toBeResetFroXML"), flags));
if (r->init () == 0 && r->set_state (node, version) == 0) {
#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
@@ -1495,7 +1509,13 @@ Session::XMLRouteFactory_2X (const XMLNode& node, int version)
ret = track;
} else {
- boost::shared_ptr<Route> r (new Route (*this, X_("toBeResetFroXML")));
+ enum Route::Flag flags = Route::Flag(0);
+ const XMLProperty* prop = node.property("flags");
+ if (prop) {
+ flags = Route::Flag (string_2_enum (prop->value(), flags));
+ }
+
+ boost::shared_ptr<Route> r (new Route (*this, X_("toBeResetFroXML"), flags));
if (r->init () == 0 && r->set_state (node, version) == 0) {
#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
@@ -2014,6 +2034,54 @@ Session::refresh_disk_space ()
_total_free_4k_blocks_uncertain = true;
}
}
+#elif defined (COMPILER_MSVC)
+ vector<string> scanned_volumes;
+ vector<string>::iterator j;
+ vector<space_and_path>::iterator i;
+ DWORD nSectorsPerCluster, nBytesPerSector,
+ nFreeClusters, nTotalClusters;
+ char disk_drive[4];
+ bool volume_found;
+
+ _total_free_4k_blocks = 0;
+
+ for (i = session_dirs.begin(); i != session_dirs.end(); i++) {
+ strncpy (disk_drive, (*i).path.c_str(), 3);
+ disk_drive[3] = 0;
+ strupr(disk_drive);
+
+ volume_found = false;
+ if (0 != (GetDiskFreeSpace(disk_drive, &nSectorsPerCluster, &nBytesPerSector, &nFreeClusters, &nTotalClusters)))
+ {
+ int64_t nBytesPerCluster = nBytesPerSector * nSectorsPerCluster;
+ int64_t nFreeBytes = nBytesPerCluster * (int64_t)nFreeClusters;
+ i->blocks = (uint32_t)(nFreeBytes / 4096);
+
+ for (j = scanned_volumes.begin(); j != scanned_volumes.end(); j++) {
+ if (0 == j->compare(disk_drive)) {
+ volume_found = true;
+ break;
+ }
+ }
+
+ if (!volume_found) {
+ scanned_volumes.push_back(disk_drive);
+ _total_free_4k_blocks += i->blocks;
+ }
+ }
+ }
+
+ if (0 == _total_free_4k_blocks) {
+ strncpy (disk_drive, path().c_str(), 3);
+ disk_drive[3] = 0;
+
+ if (0 != (GetDiskFreeSpace(disk_drive, &nSectorsPerCluster, &nBytesPerSector, &nFreeClusters, &nTotalClusters)))
+ {
+ int64_t nBytesPerCluster = nBytesPerSector * nSectorsPerCluster;
+ int64_t nFreeBytes = nBytesPerCluster * (int64_t)nFreeClusters;
+ _total_free_4k_blocks = (uint32_t)(nFreeBytes / 4096);
+ }
+ }
#endif
}
@@ -2200,22 +2268,16 @@ Session::auto_save()
}
static bool
-state_file_filter (const string &str, void */*arg*/)
+state_file_filter (const string &str, void* /*arg*/)
{
return (str.length() > strlen(statefile_suffix) &&
str.find (statefile_suffix) == (str.length() - strlen (statefile_suffix)));
}
-struct string_cmp {
- bool operator()(const string* a, const string* b) {
- return *a < *b;
- }
-};
-
-static string*
-remove_end(string* state)
+static string
+remove_end(string state)
{
- string statename(*state);
+ string statename(state);
string::size_type start,end;
if ((start = statename.find_last_of (G_DIR_SEPARATOR)) != string::npos) {
@@ -2226,24 +2288,23 @@ remove_end(string* state)
end = statename.length();
}
- return new string(statename.substr (0, end));
+ return string(statename.substr (0, end));
}
-vector<string *> *
+vector<string>
Session::possible_states (string path)
{
- PathScanner scanner;
- vector<string*>* states = scanner (path, state_file_filter, 0, false, false);
+ vector<string> states;
+ find_files_matching_filter (states, path, state_file_filter, 0, false, false);
- transform(states->begin(), states->end(), states->begin(), remove_end);
+ transform(states.begin(), states.end(), states.begin(), remove_end);
- string_cmp cmp;
- sort (states->begin(), states->end(), cmp);
+ sort (states.begin(), states.end());
return states;
}
-vector<string *> *
+vector<string>
Session::possible_states () const
{
return possible_states(_path);
@@ -2377,7 +2438,7 @@ Session::commit_reversible_command (Command *cmd)
}
static bool
-accept_all_audio_files (const string& path, void */*arg*/)
+accept_all_audio_files (const string& path, void* /*arg*/)
{
if (!Glib::file_test (path, Glib::FILE_TEST_IS_REGULAR)) {
return false;
@@ -2391,7 +2452,7 @@ accept_all_audio_files (const string& path, void */*arg*/)
}
static bool
-accept_all_midi_files (const string& path, void */*arg*/)
+accept_all_midi_files (const string& path, void* /*arg*/)
{
if (!Glib::file_test (path, Glib::FILE_TEST_IS_REGULAR)) {
return false;
@@ -2403,7 +2464,7 @@ accept_all_midi_files (const string& path, void */*arg*/)
}
static bool
-accept_all_state_files (const string& path, void */*arg*/)
+accept_all_state_files (const string& path, void* /*arg*/)
{
if (!Glib::file_test (path, Glib::FILE_TEST_IS_REGULAR)) {
return false;
@@ -2467,8 +2528,7 @@ Session::find_all_sources (string path, set<string>& result)
int
Session::find_all_sources_across_snapshots (set<string>& result, bool exclude_this_snapshot)
{
- PathScanner scanner;
- vector<string*>* state_files;
+ vector<string> state_files;
string ripped;
string this_snapshot_path;
@@ -2480,9 +2540,9 @@ Session::find_all_sources_across_snapshots (set<string>& result, bool exclude_th
ripped = ripped.substr (0, ripped.length() - 1);
}
- state_files = scanner (ripped, accept_all_state_files, (void *) 0, true, true);
+ find_files_matching_filter (state_files, ripped, accept_all_state_files, (void *) 0, true, true);
- if (state_files == 0) {
+ if (state_files.empty()) {
/* impossible! */
return 0;
}
@@ -2491,13 +2551,13 @@ Session::find_all_sources_across_snapshots (set<string>& result, bool exclude_th
this_snapshot_path += legalize_for_path (_current_snapshot_name);
this_snapshot_path += statefile_suffix;
- for (vector<string*>::iterator i = state_files->begin(); i != state_files->end(); ++i) {
+ for (vector<string>::iterator i = state_files.begin(); i != state_files.end(); ++i) {
- if (exclude_this_snapshot && **i == this_snapshot_path) {
+ if (exclude_this_snapshot && *i == this_snapshot_path) {
continue;
}
- if (find_all_sources (**i, result) < 0) {
+ if (find_all_sources (*i, result) < 0) {
return -1;
}
}
@@ -2547,18 +2607,18 @@ Session::cleanup_sources (CleanupReport& rep)
// FIXME: needs adaptation to midi
vector<boost::shared_ptr<Source> > dead_sources;
- PathScanner scanner;
string audio_path;
string midi_path;
- vector<space_and_path>::iterator i;
- vector<space_and_path>::iterator nexti;
- vector<string*>* candidates;
- vector<string*>* candidates2;
+ vector<string> candidates;
vector<string> unused;
set<string> all_sources;
bool used;
string spath;
int ret = -1;
+ string tmppath1;
+ string tmppath2;
+ Searchpath asp;
+ Searchpath msp;
_state_of_the_state = (StateOfTheState) (_state_of_the_state | InCleanup);
@@ -2600,54 +2660,23 @@ Session::cleanup_sources (CleanupReport& rep)
/* build a list of all the possible audio directories for the session */
- for (i = session_dirs.begin(); i != session_dirs.end(); ) {
-
- nexti = i;
- ++nexti;
-
+ for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
SessionDirectory sdir ((*i).path);
- audio_path += sdir.sound_path();
-
- if (nexti != session_dirs.end()) {
- audio_path += ':';
- }
-
- i = nexti;
+ asp += sdir.sound_path();
}
+ audio_path += asp.to_string();
/* build a list of all the possible midi directories for the session */
- for (i = session_dirs.begin(); i != session_dirs.end(); ) {
-
- nexti = i;
- ++nexti;
-
+ for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
SessionDirectory sdir ((*i).path);
- midi_path += sdir.midi_path();
-
- if (nexti != session_dirs.end()) {
- midi_path += ':';
- }
-
- i = nexti;
+ msp += sdir.midi_path();
}
+ midi_path += msp.to_string();
- candidates = scanner (audio_path, accept_all_audio_files, (void *) 0, true, true);
- candidates2 = scanner (midi_path, accept_all_midi_files, (void *) 0, true, true);
-
- /* merge them */
-
- if (candidates) {
- if (candidates2) {
- for (vector<string*>::iterator i = candidates2->begin(); i != candidates2->end(); ++i) {
- candidates->push_back (*i);
- }
- delete candidates2;
- }
- } else {
- candidates = candidates2; // might still be null
- }
+ find_files_matching_filter (candidates, audio_path, accept_all_audio_files, (void *) 0, true, true);
+ find_files_matching_filter (candidates, midi_path, accept_all_midi_files, (void *) 0, true, true);
/* find all sources, but don't use this snapshot because the
state file on disk still references sources we may have already
@@ -2687,44 +2716,26 @@ Session::cleanup_sources (CleanupReport& rep)
i = tmp;
}
- char tmppath1[PATH_MAX+1];
- char tmppath2[PATH_MAX+1];
-
- if (candidates) {
- for (vector<string*>::iterator x = candidates->begin(); x != candidates->end(); ++x) {
-
- used = false;
- spath = **x;
-
- for (set<string>::iterator i = all_sources.begin(); i != all_sources.end(); ++i) {
+ for (vector<string>::iterator x = candidates.begin(); x != candidates.end(); ++x) {
- if (realpath(spath.c_str(), tmppath1) == 0) {
- error << string_compose (_("Cannot expand path %1 (%2)"),
- spath, strerror (errno)) << endmsg;
- continue;
- }
+ used = false;
+ spath = *x;
- if (realpath((*i).c_str(), tmppath2) == 0) {
- error << string_compose (_("Cannot expand path %1 (%2)"),
- (*i), strerror (errno)) << endmsg;
- continue;
- }
+ for (set<string>::iterator i = all_sources.begin(); i != all_sources.end(); ++i) {
- if (strcmp(tmppath1, tmppath2) == 0) {
- used = true;
- break;
- }
- }
-
- if (!used) {
- unused.push_back (spath);
- }
+ tmppath1 = canonical_path (spath);
+ tmppath2 = canonical_path ((*i));
- delete *x;
- }
+ if (tmppath1 == tmppath2) {
+ used = true;
+ break;
+ }
+ }
- delete candidates;
- }
+ if (!used) {
+ unused.push_back (spath);
+ }
+ }
/* now try to move all unused files into the "dead" directory(ies) */
@@ -2814,7 +2825,7 @@ Session::cleanup_sources (CleanupReport& rep)
string peakpath = peak_path (base);
if (Glib::file_test (peakpath.c_str(), Glib::FILE_TEST_EXISTS)) {
- if (::unlink (peakpath.c_str()) != 0) {
+ if (::g_unlink (peakpath.c_str()) != 0) {
error << string_compose (_("cannot remove peakfile %1 for %2 (%3)"),
peakpath, _path, strerror (errno))
<< endmsg;
@@ -3543,8 +3554,6 @@ Session::rename (const std::string& new_name)
string const old_sources_root = _session_dir->sources_root();
-#define RENAME ::rename
-
/* Rename:
* session directory
@@ -3606,7 +3615,8 @@ Session::rename (const std::string& new_name)
cerr << "Rename " << oldstr << " => " << newstr << endl;
- if (RENAME (oldstr.c_str(), newstr.c_str()) != 0) {
+ if (::g_rename (oldstr.c_str(), newstr.c_str()) != 0) {
+ error << string_compose (_("renaming %s as %2 failed (%3)"), oldstr, newstr, g_strerror (errno)) << endmsg;
return 1;
}
@@ -3633,7 +3643,8 @@ Session::rename (const std::string& new_name)
cerr << "Rename " << oldstr << " => " << newstr << endl;
- if (RENAME (oldstr.c_str(), newstr.c_str()) != 0) {
+ if (::g_rename (oldstr.c_str(), newstr.c_str()) != 0) {
+ error << string_compose (_("renaming %s as %2 failed (%3)"), oldstr, newstr, g_strerror (errno)) << endmsg;
return 1;
}
}
@@ -3645,7 +3656,8 @@ Session::rename (const std::string& new_name)
cerr << "Rename " << oldstr << " => " << newstr << endl;
- if (RENAME (oldstr.c_str(), newstr.c_str()) != 0) {
+ if (::g_rename (oldstr.c_str(), newstr.c_str()) != 0) {
+ error << string_compose (_("renaming %s as %2 failed (%3)"), oldstr, newstr, g_strerror (errno)) << endmsg;
return 1;
}
@@ -3659,7 +3671,8 @@ Session::rename (const std::string& new_name)
cerr << "Rename " << oldstr << " => " << newstr << endl;
- if (RENAME (oldstr.c_str(), newstr.c_str()) != 0) {
+ if (::g_rename (oldstr.c_str(), newstr.c_str()) != 0) {
+ error << string_compose (_("renaming %s as %2 failed (%3)"), oldstr, newstr, g_strerror (errno)) << endmsg;
return 1;
}
}
@@ -3683,6 +3696,11 @@ Session::rename (const std::string& new_name)
_current_snapshot_name = new_name;
_name = new_name;
+ /* re-add directory separator - reverse hack to oldstr above */
+ if (_path[_path.length()-1] != G_DIR_SEPARATOR) {
+ _path += G_DIR_SEPARATOR;
+ }
+
set_dirty ();
/* save state again to get everything just right */
@@ -3695,8 +3713,6 @@ Session::rename (const std::string& new_name)
store_recent_sessions (new_name, _path);
return 0;
-
-#undef RENAME
}
int
diff --git a/libs/ardour/session_state_utils.cc b/libs/ardour/session_state_utils.cc
index 13d65e5b3c..5d5c9cc8df 100644
--- a/libs/ardour/session_state_utils.cc
+++ b/libs/ardour/session_state_utils.cc
@@ -47,10 +47,8 @@ void
get_state_files_in_directory (const std::string & directory_path,
vector<std::string> & result)
{
- Glib::PatternSpec state_file_pattern('*' + string(statefile_suffix));
-
- find_matching_files_in_directory (directory_path, state_file_pattern,
- result);
+ find_files_matching_pattern (result, directory_path,
+ '*' + string(statefile_suffix));
}
vector<string>
diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc
index 38ad521235..85b36e5a66 100644
--- a/libs/ardour/session_transport.cc
+++ b/libs/ardour/session_transport.cc
@@ -30,6 +30,7 @@
#include "pbd/enumwriter.h"
#include "pbd/pthread_utils.h"
#include "pbd/memento_command.h"
+#include "pbd/stacktrace.h"
#include "midi++/mmc.h"
#include "midi++/port.h"
@@ -40,6 +41,8 @@
#include "ardour/click.h"
#include "ardour/debug.h"
#include "ardour/location.h"
+#include "ardour/profile.h"
+#include "ardour/scene_changer.h"
#include "ardour/session.h"
#include "ardour/slave.h"
#include "ardour/operations.h"
@@ -158,10 +161,11 @@ Session::force_locate (framepos_t target_frame, bool with_roll)
}
void
-Session::request_play_loop (bool yn, bool leave_rolling)
+Session::request_play_loop (bool yn, bool change_transport_roll)
{
SessionEvent* ev;
Location *location = _locations->auto_loop_location();
+ double target_speed;
if (location == 0 && yn) {
error << _("Cannot loop - no loop range defined")
@@ -169,14 +173,44 @@ Session::request_play_loop (bool yn, bool leave_rolling)
return;
}
- ev = new SessionEvent (SessionEvent::SetLoop, SessionEvent::Add, SessionEvent::Immediate, 0, (leave_rolling ? 1.0 : 0.0), yn);
- DEBUG_TRACE (DEBUG::Transport, string_compose ("Request set loop = %1, leave rolling ? %2\n", yn, leave_rolling));
+ if (change_transport_roll) {
+ if (transport_rolling()) {
+ /* start looping at current speed */
+ target_speed = transport_speed ();
+ } else {
+ /* currently stopped */
+ if (yn) {
+ /* start looping at normal speed */
+ target_speed = 1.0;
+ } else {
+ target_speed = 0.0;
+ }
+ }
+ } else {
+ /* leave the speed alone */
+ target_speed = transport_speed ();
+ }
+
+ ev = new SessionEvent (SessionEvent::SetLoop, SessionEvent::Add, SessionEvent::Immediate, 0, target_speed, yn);
+ DEBUG_TRACE (DEBUG::Transport, string_compose ("Request set loop = %1, change roll state ? %2\n", yn, change_transport_roll));
queue_event (ev);
- if (!leave_rolling && !yn && Config->get_seamless_loop() && transport_rolling()) {
- // request an immediate locate to refresh the tracks
- // after disabling looping
- request_locate (_transport_frame-1, false);
+ if (yn) {
+ if (!change_transport_roll) {
+ if (!transport_rolling()) {
+ /* we're not changing transport state, but we do want
+ to set up position for the new loop. Don't
+ do this if we're rolling already.
+ */
+ request_locate (location->start(), false);
+ }
+ }
+ } else {
+ if (!change_transport_roll && Config->get_seamless_loop() && transport_rolling()) {
+ // request an immediate locate to refresh the tracks
+ // after disabling looping
+ request_locate (_transport_frame-1, false);
+ }
}
}
@@ -423,6 +457,8 @@ Session::non_realtime_locate ()
(*i)->non_realtime_locate (_transport_frame);
}
+ _scene_changer->locate (_transport_frame);
+
/* XXX: it would be nice to generate the new clicks here (in the non-RT thread)
rather than clearing them so that the RT thread has to spend time constructing
them (in Session::click).
@@ -498,6 +534,11 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
if (did_record) {
commit_reversible_command ();
+ /* increase take name */
+ if (config.get_track_name_take () && !config.get_take_name ().empty()) {
+ string newname = config.get_take_name();
+ config.set_take_name(bump_name_number (newname));
+ }
}
if (_engine.running()) {
@@ -531,8 +572,6 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
/* explicit return request pre-queued in event list. overrides everything else */
- cerr << "explicit auto-return to " << _requested_return_frame << endl;
-
_transport_frame = _requested_return_frame;
do_locate = true;
@@ -589,8 +628,10 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
*/
if (ptw & PostTransportClearSubstate) {
- _play_range = false;
- unset_play_loop ();
+ unset_play_range ();
+ if (!Config->get_loop_is_mode()) {
+ unset_play_loop ();
+ }
}
/* this for() block can be put inside the previous if() and has the effect of ... ??? what */
@@ -657,8 +698,10 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
}
if (ptw & PostTransportStop) {
- _play_range = false;
- play_loop = false;
+ unset_play_range ();
+ if (!Config->get_loop_is_mode()) {
+ unset_play_loop ();
+ }
}
PositionChanged (_transport_frame); /* EMIT SIGNAL */
@@ -723,7 +766,7 @@ Session::unset_play_loop ()
}
void
-Session::set_play_loop (bool yn)
+Session::set_play_loop (bool yn, double speed)
{
/* Called from event-handling context */
@@ -782,12 +825,24 @@ Session::set_play_loop (bool yn)
merge_event (new SessionEvent (SessionEvent::AutoLoopDeclick, SessionEvent::Replace, dcp, dcl, 0.0f));
merge_event (new SessionEvent (SessionEvent::AutoLoop, SessionEvent::Replace, loc->end(), loc->start(), 0.0f));
- /* locate to start of loop and roll.
+ /* if requested to roll, locate to start of loop and
+ * roll but ONLY if we're not already rolling.
args: positition, roll=true, flush=true, with_loop=false, force buffer refill if seamless looping
*/
- start_locate (loc->start(), true, true, false, Config->get_seamless_loop());
+ if (Config->get_loop_is_mode()) {
+ /* loop IS a transport mode: if already
+ rolling, do not locate to loop start.
+ */
+ if (!transport_rolling() && (speed != 0.0)) {
+ start_locate (loc->start(), true, true, false, Config->get_seamless_loop());
+ }
+ } else {
+ if (speed != 0.0) {
+ start_locate (loc->start(), true, true, false, Config->get_seamless_loop());
+ }
+ }
}
} else {
@@ -983,7 +1038,9 @@ Session::locate (framepos_t target_frame, bool with_roll, bool with_flush, bool
// located outside the loop: cancel looping directly, this is called from event handling context
- set_play_loop (false);
+ if (!Config->get_loop_is_mode()) {
+ set_play_loop (false, _transport_speed);
+ }
} else if (_transport_frame == al->start()) {
@@ -1080,12 +1137,27 @@ Session::set_transport_speed (double speed, bool abort, bool clear_state, bool a
stop_transport (abort);
}
- unset_play_loop ();
+ if (!Config->get_loop_is_mode()) {
+ unset_play_loop ();
+ }
} else if (transport_stopped() && speed == 1.0) {
/* we are stopped and we want to start rolling at speed 1 */
+ if (Config->get_loop_is_mode() && play_loop) {
+
+ Location *location = _locations->auto_loop_location();
+
+ if (location != 0) {
+ if (_transport_frame != location->start()) {
+ /* jump to start and then roll from there */
+ request_locate (location->start(), true);
+ return;
+ }
+ }
+ }
+
if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
set_track_monitor_input_status (false);
}
diff --git a/libs/ardour/session_vst.cc b/libs/ardour/session_vst.cc
index c746a9d388..508f11df13 100644
--- a/libs/ardour/session_vst.cc
+++ b/libs/ardour/session_vst.cc
@@ -28,6 +28,9 @@
#include "ardour/windows_vst_plugin.h"
#include "ardour/vestige/aeffectx.h"
#include "ardour/vst_types.h"
+#ifdef WINDOWS_VST_SUPPORT
+#include <fst.h>
+#endif
#include "i18n.h"
@@ -42,6 +45,20 @@ static int debug_callbacks = -1;
using namespace ARDOUR;
+int Session::vst_current_loading_id = 0;
+const char* Session::vst_can_do_strings[] = {
+ X_("supplyIdle"),
+ X_("sendVstTimeInfo"),
+ X_("sendVstEvents"),
+ X_("sendVstMidiEvent"),
+ X_("receiveVstEvents"),
+ X_("receiveVstMidiEvent"),
+ X_("supportShell"),
+ X_("shellCategory"),
+ X_("shellCategorycurID")
+};
+const int Session::vst_can_do_string_count = sizeof (vst_can_do_strings) / sizeof (char*);
+
intptr_t Session::vst_callback (
AEffect* effect,
int32_t opcode,
@@ -60,7 +77,7 @@ intptr_t Session::vst_callback (
}
if (effect && effect->user) {
- plug = (VSTPlugin *) (effect->user);
+ plug = (VSTPlugin *) (effect->user);
session = &plug->session();
#ifdef COMPILER_MSVC
SHOW_CALLBACK ("am callback 0x%x, opcode = %d, plugin = \"%s\" ", (int) pthread_self().p, opcode, plug->name());
@@ -90,18 +107,18 @@ intptr_t Session::vst_callback (
case audioMasterVersion:
SHOW_CALLBACK ("amc: audioMasterVersion\n");
// vst version, currently 2 (0 for older)
- return 2;
+ return 2400;
case audioMasterCurrentId:
SHOW_CALLBACK ("amc: audioMasterCurrentId\n");
- // returns the unique id of a plug that's currently
- // loading
- return 0;
+ // returns the unique id of a plug that's currently loading
+ return vst_current_loading_id;
case audioMasterIdle:
SHOW_CALLBACK ("amc: audioMasterIdle\n");
- // call application idle routine (this will
- // call effEditIdle for all open editors too)
+#ifdef WINDOWS_VST_SUPPORT
+ fst_audio_master_idle();
+#endif
if (effect) {
effect->dispatcher(effect, effEditIdle, 0, 0, NULL, 0.0f);
}
@@ -137,7 +154,7 @@ intptr_t Session::vst_callback (
_timeInfo.samplePos = now;
_timeInfo.sampleRate = session->frame_rate();
-
+
const TempoMetric& tm (session->tempo_map().metric_at (now));
if (value & (kVstTempoValid)) {
@@ -156,22 +173,21 @@ intptr_t Session::vst_callback (
try {
session->tempo_map().bbt_time_rt (now, bbt);
-
+
/* PPQ = pulse per quarter
- VST's "pulse" is our "division".
-
- 8 divisions per bar, 1 division = quarter, so 8 quarters per bar, ppq = 1
- 8 divisions per bar, 1 division = eighth, so 4 quarters per bar, ppq = 2
- 4 divisions per bar, 1 division = quarter, so 4 quarters per bar, ppq = 1
- 4 divisions per bar, 1 division = half, so 8 quarters per bar, ppq = 0.5
- 4 divisions per bar, 1 division = fifth, so (4 * 5/4) quarters per bar, ppq = 5/4
-
- general: divs_per_bar / (note_type / 4.0)
- */
+ * VST's "pulse" is our "division".
+ *
+ * 8 divisions per bar, 1 division = quarter, so 8 quarters per bar, ppq = 1
+ * 8 divisions per bar, 1 division = eighth, so 4 quarters per bar, ppq = 2
+ * 4 divisions per bar, 1 division = quarter, so 4 quarters per bar, ppq = 1
+ * 4 divisions per bar, 1 division = half, so 8 quarters per bar, ppq = 0.5
+ * 4 divisions per bar, 1 division = fifth, so (4 * 5/4) quarters per bar, ppq = 5/4
+ *
+ * general: divs_per_bar / (note_type / 4.0)
+ */
double ppq_scaling = tm.meter().note_divisor() / 4.0;
- /* Note that this assumes constant meter/tempo throughout the session. Stupid VST
- */
+ /* Note that this assumes constant meter/tempo throughout the session. Stupid VST */
double ppqBar = double(bbt.bars - 1) * tm.meter().divisions_per_bar();
double ppqBeat = double(bbt.beats - 1);
double ppqTick = double(bbt.ticks) / Timecode::BBT_Time::ticks_per_beat;
@@ -179,17 +195,17 @@ intptr_t Session::vst_callback (
ppqBar *= ppq_scaling;
ppqBeat *= ppq_scaling;
ppqTick *= ppq_scaling;
-
+
if (value & (kVstPpqPosValid)) {
_timeInfo.ppqPos = ppqBar + ppqBeat + ppqTick;
_timeInfo.flags |= (kVstPpqPosValid);
}
-
+
if (value & (kVstBarsValid)) {
_timeInfo.barStartPos = ppqBar;
_timeInfo.flags |= (kVstBarsValid);
}
-
+
} catch (...) {
/* relax */
}
@@ -197,13 +213,13 @@ intptr_t Session::vst_callback (
if (value & (kVstSmpteValid)) {
Timecode::Time t;
-
+
session->timecode_time (now, t);
-
- _timeInfo.smpteOffset = (t.hours * t.rate * 60.0 * 60.0) +
- (t.minutes * t.rate * 60.0) +
- (t.seconds * t.rate) +
- (t.frames) +
+
+ _timeInfo.smpteOffset = (t.hours * t.rate * 60.0 * 60.0) +
+ (t.minutes * t.rate * 60.0) +
+ (t.seconds * t.rate) +
+ (t.frames) +
(t.subframes);
_timeInfo.smpteOffset *= 80.0; /* VST spec is 1/80th frames */
@@ -239,12 +255,21 @@ intptr_t Session::vst_callback (
_timeInfo.samplePos = 0;
_timeInfo.sampleRate = AudioEngine::instance()->sample_rate();
}
-
+
return (intptr_t) &_timeInfo;
case audioMasterProcessEvents:
SHOW_CALLBACK ("amc: audioMasterProcessEvents\n");
// VstEvents* in <ptr>
+ if (plug && plug->midi_buffer()) {
+ VstEvents* v = (VstEvents*)ptr;
+ for (int n = 0 ; n < v->numEvents; ++n) {
+ VstMidiEvent *vme = (VstMidiEvent*) (v->events[n]->dump);
+ if (vme->type == kVstMidiType) {
+ plug->midi_buffer()->push_back(vme->deltaFrames, 3, (uint8_t*)vme->midiData);
+ }
+ }
+ }
return 0;
case audioMasterSetTime:
@@ -268,14 +293,14 @@ intptr_t Session::vst_callback (
case audioMasterGetParameterQuantization:
SHOW_CALLBACK ("amc: audioMasterGetParameterQuantization\n");
- // returns the integer value for +1.0 representation,
- // or 1 if full single float precision is maintained
- // in automation. parameter index in <value> (-1: all, any)
+ // returns the integer value for +1.0 representation,
+ // or 1 if full single float precision is maintained
+ // in automation. parameter index in <value> (-1: all, any)
return 0;
case audioMasterIOChanged:
SHOW_CALLBACK ("amc: audioMasterIOChanged\n");
- // numInputs and/or numOutputs has changed
+ // numInputs and/or numOutputs has changed
return 0;
case audioMasterNeedIdle:
@@ -315,16 +340,16 @@ intptr_t Session::vst_callback (
case audioMasterGetPreviousPlug:
SHOW_CALLBACK ("amc: audioMasterGetPreviousPlug\n");
- // input pin in <value> (-1: first to come), returns cEffect*
+ // input pin in <value> (-1: first to come), returns cEffect*
return 0;
case audioMasterGetNextPlug:
SHOW_CALLBACK ("amc: audioMasterGetNextPlug\n");
- // output pin in <value> (-1: first to come), returns cEffect*
+ // output pin in <value> (-1: first to come), returns cEffect*
case audioMasterWillReplaceOrAccumulate:
SHOW_CALLBACK ("amc: audioMasterWillReplaceOrAccumulate\n");
- // returns: 0: not supported, 1: replace, 2: accumulate
+ // returns: 0: not supported, 1: replace, 2: accumulate
return 0;
case audioMasterGetCurrentProcessLevel:
@@ -346,10 +371,10 @@ intptr_t Session::vst_callback (
case audioMasterOfflineStart:
SHOW_CALLBACK ("amc: audioMasterOfflineStart\n");
return 0;
-
+
case audioMasterOfflineRead:
SHOW_CALLBACK ("amc: audioMasterOfflineRead\n");
- // ptr points to offline structure, see below. return 0: error, 1 ok
+ // ptr points to offline structure, see below. return 0: error, 1 ok
return 0;
case audioMasterOfflineWrite:
@@ -360,7 +385,7 @@ intptr_t Session::vst_callback (
case audioMasterOfflineGetCurrentPass:
SHOW_CALLBACK ("amc: audioMasterOfflineGetCurrentPass\n");
return 0;
-
+
case audioMasterOfflineGetCurrentMetaPass:
SHOW_CALLBACK ("amc: audioMasterOfflineGetCurrentMetaPass\n");
return 0;
@@ -404,7 +429,12 @@ intptr_t Session::vst_callback (
case audioMasterCanDo:
SHOW_CALLBACK ("amc: audioMasterCanDo\n");
- // string in ptr, see below
+ // string in ptr, (const char*)ptr
+ for (int i = 0; i < vst_can_do_string_count; i++) {
+ if (! strcmp(vst_can_do_strings[i], (const char*)ptr)) {
+ return 1;
+ }
+ }
return 0;
case audioMasterGetLanguage:
diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc
index 1cd456ee58..e39ef3f548 100644
--- a/libs/ardour/smf_source.cc
+++ b/libs/ardour/smf_source.cc
@@ -26,15 +26,15 @@
#include <errno.h>
#include <regex.h>
-#include "pbd/pathscanner.h"
#include "pbd/stl_delete.h"
#include "pbd/strsplit.h"
+#include <glib/gstdio.h>
#include <glibmm/miscutils.h>
#include <glibmm/fileutils.h>
#include "evoral/Control.hpp"
-#include "evoral/evoral/SMF.hpp"
+#include "evoral/SMF.hpp"
#include "ardour/event_type_map.h"
#include "ardour/midi_model.h"
@@ -148,7 +148,7 @@ SMFSource::SMFSource (Session& s, const XMLNode& node, bool must_exist)
SMFSource::~SMFSource ()
{
if (removable()) {
- unlink (_path.c_str());
+ ::g_unlink (_path.c_str());
}
}
diff --git a/libs/ardour/sndfile_helpers.cc b/libs/ardour/sndfile_helpers.cc
index 459890e829..2e618e043b 100644
--- a/libs/ardour/sndfile_helpers.cc
+++ b/libs/ardour/sndfile_helpers.cc
@@ -17,7 +17,9 @@
*/
+#ifndef COMPILER_MSVC
#include <strings.h>
+#endif
#include <map>
#include <sndfile.h>
diff --git a/libs/ardour/sndfileimportable.cc b/libs/ardour/sndfileimportable.cc
index c9f6c4014f..ceb88eddc9 100644
--- a/libs/ardour/sndfileimportable.cc
+++ b/libs/ardour/sndfileimportable.cc
@@ -51,7 +51,7 @@ SndFileImportableSource::read (Sample* buffer, framecnt_t nframes)
return per_channel * sf_info.channels;
}
-uint
+uint32_t
SndFileImportableSource::channels () const
{
return sf_info.channels;
diff --git a/libs/ardour/sndfilesource.cc b/libs/ardour/sndfilesource.cc
index 5465c5e4a4..af25b3e76f 100644
--- a/libs/ardour/sndfilesource.cc
+++ b/libs/ardour/sndfilesource.cc
@@ -26,8 +26,6 @@
#include <climits>
#include <cstdarg>
-#include <pwd.h>
-#include <sys/utsname.h>
#include <sys/stat.h>
#ifdef PLATFORM_WINDOWS
@@ -77,7 +75,9 @@ SndFileSource::SndFileSource (Session& s, const XMLNode& node)
}
}
-/** Files created this way are never writable or removable */
+/** Constructor for existing external-to-session files.
+ Files created this way are never writable or removable
+*/
SndFileSource::SndFileSource (Session& s, const string& path, int chn, Flag flags)
: Source(s, DataType::AUDIO, path, flags)
/* note that the origin of an external file is itself */
@@ -101,7 +101,9 @@ SndFileSource::SndFileSource (Session& s, const string& path, int chn, Flag flag
}
}
-/** This constructor is used to construct new files, not open existing ones. */
+/** This constructor is used to construct new internal-to-session files,
+ not open existing ones.
+*/
SndFileSource::SndFileSource (Session& s, const string& path, const string& origin,
SampleFormat sfmt, HeaderFormat hf, framecnt_t rate, Flag flags)
: Source(s, DataType::AUDIO, path, flags)
@@ -231,22 +233,30 @@ SndFileSource::init_sndfile ()
int
SndFileSource::open ()
{
- _descriptor = new SndFileDescriptor (_path, writable(), &_info);
+ string path_to_open;
+
+#ifdef PLATFORM_WINDOWS
+ path_to_open = Glib::locale_from_utf8(_path);
+#else
+ path_to_open = _path;
+#endif
+
+ _descriptor = new SndFileDescriptor (path_to_open.c_str(), writable(), &_info);
_descriptor->Closed.connect_same_thread (file_manager_connection, boost::bind (&SndFileSource::file_closed, this));
SNDFILE* sf = _descriptor->allocate ();
if (sf == 0) {
- char errbuf[256];
+ char errbuf[1024];
sf_error_str (0, errbuf, sizeof (errbuf) - 1);
#ifndef HAVE_COREAUDIO
/* if we have CoreAudio, we will be falling back to that if libsndfile fails,
so we don't want to see this message.
*/
- cerr << "failed to open " << _path << " with name " << _name << endl;
+ cerr << "failed to open " << path_to_open << " with name " << _name << endl;
error << string_compose(_("SndFileSource: cannot open file \"%1\" for %2 (%3)"),
- _path, (writable() ? "read+write" : "reading"), errbuf) << endmsg;
+ path_to_open, (writable() ? "read+write" : "reading"), errbuf) << endmsg;
#endif
return -1;
}
@@ -308,7 +318,7 @@ SndFileSource::open ()
if (!_broadcast_info->write_to_file (sf)) {
error << string_compose (_("cannot set broadcast info for audio file %1 (%2); dropping broadcast info for this file"),
- _path, _broadcast_info->get_error())
+ path_to_open, _broadcast_info->get_error())
<< endmsg;
_flags = Flag (_flags & ~Broadcast);
delete _broadcast_info;
@@ -596,6 +606,30 @@ SndFileSource::flush_header ()
return r;
}
+void
+SndFileSource::flush ()
+{
+ if (!_open) {
+ warning << string_compose (_("attempt to flush an un-opened audio file source (%1)"), _path) << endmsg;
+ return;
+ }
+
+ if (!writable()) {
+ warning << string_compose (_("attempt to flush a non-writable audio file source (%1)"), _path) << endmsg;
+ return;
+ }
+
+ SNDFILE* sf = _descriptor->allocate ();
+ if (sf == 0) {
+ error << string_compose (_("could not allocate file %1 to flush contents"), _path) << endmsg;
+ return;
+ }
+
+ // Hopefully everything OK
+ sf_write_sync (sf);
+ _descriptor->release ();
+}
+
int
SndFileSource::setup_broadcast_info (framepos_t /*when*/, struct tm& now, time_t /*tnow*/)
{
@@ -823,12 +857,12 @@ SndFileSource::crossfade (Sample* data, framecnt_t cnt, int fade_in)
} else if (xfade < xfade_frames) {
- gain_t in[xfade];
- gain_t out[xfade];
+ std::vector<gain_t> in(xfade);
+ std::vector<gain_t> out(xfade);
/* short xfade, compute custom curve */
- compute_equal_power_fades (xfade, in, out);
+ compute_equal_power_fades (xfade, &in[0], &out[0]);
for (framecnt_t n = 0; n < xfade; ++n) {
xfade_buf[n] = (xfade_buf[n] * out[n]) + (fade_data[n] * in[n]);
diff --git a/libs/ardour/soundcloud_upload.cc b/libs/ardour/soundcloud_upload.cc
new file mode 100644
index 0000000000..da887d49f5
--- /dev/null
+++ b/libs/ardour/soundcloud_upload.cc
@@ -0,0 +1,355 @@
+/* soundcloud_export.cpp **********************************************************************
+
+ Adapted for Ardour by Ben Loftis, March 2012
+
+ Licence GPL:
+
+ 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+*************************************************************************************/
+#include "ardour/debug.h"
+#include "ardour/soundcloud_upload.h"
+
+#include "pbd/xml++.h"
+#include <pbd/error.h>
+
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <iostream>
+#include <glib/gstdio.h>
+
+#include "i18n.h"
+
+using namespace PBD;
+
+size_t
+WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
+{
+ register int realsize = (int)(size * nmemb);
+ struct MemoryStruct *mem = (struct MemoryStruct *)data;
+
+ mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1);
+
+ if (mem->memory) {
+ memcpy(&(mem->memory[mem->size]), ptr, realsize);
+ mem->size += realsize;
+ mem->memory[mem->size] = 0;
+ }
+ return realsize;
+}
+
+SoundcloudUploader::SoundcloudUploader()
+{
+ curl_handle = curl_easy_init();
+ multi_handle = curl_multi_init();
+}
+
+std::string
+SoundcloudUploader::Get_Auth_Token( std::string username, std::string password )
+{
+ struct MemoryStruct xml_page;
+ xml_page.memory = NULL;
+ xml_page.size = 0;
+
+ setcUrlOptions();
+
+ curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
+ curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *) &xml_page);
+
+ struct curl_httppost *formpost=NULL;
+ struct curl_httppost *lastptr=NULL;
+
+ /* Fill in the filename field */
+ curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "client_id",
+ CURLFORM_COPYCONTENTS, "6dd9cf0ad281aa57e07745082cec580b",
+ CURLFORM_END);
+
+ curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "client_secret",
+ CURLFORM_COPYCONTENTS, "53f5b0113fb338800f8a7a9904fc3569",
+ CURLFORM_END);
+
+ curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "grant_type",
+ CURLFORM_COPYCONTENTS, "password",
+ CURLFORM_END);
+
+ curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "username",
+ CURLFORM_COPYCONTENTS, username.c_str(),
+ CURLFORM_END);
+
+ curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "password",
+ CURLFORM_COPYCONTENTS, password.c_str(),
+ CURLFORM_END);
+
+ struct curl_slist *headerlist=NULL;
+ headerlist = curl_slist_append(headerlist, "Expect:");
+ headerlist = curl_slist_append(headerlist, "Accept: application/xml");
+ curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headerlist);
+
+ /* what URL that receives this POST */
+ std::string url = "https://api.soundcloud.com/oauth2/token";
+ curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str());
+ curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, formpost);
+
+ // curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L);
+
+ // perform online request
+ CURLcode res = curl_easy_perform(curl_handle);
+ if (res != 0) {
+ DEBUG_TRACE (DEBUG::Soundcloud, string_compose ("curl error %1 (%2)", res, curl_easy_strerror(res) ) );
+ return "";
+ }
+
+ if (xml_page.memory){
+ // cheesy way to parse the json return value. find access_token, then advance 3 quotes
+
+ if ( strstr ( xml_page.memory , "access_token" ) == NULL) {
+ error << _("Upload to Soundcloud failed. Perhaps your email or password are incorrect?\n") << endmsg;
+ return "";
+ }
+
+ std::string token = strtok( xml_page.memory, "access_token" );
+ token = strtok( NULL, "\"" );
+ token = strtok( NULL, "\"" );
+ token = strtok( NULL, "\"" );
+
+ free( xml_page.memory );
+ return token;
+ }
+
+ return "";
+}
+
+int
+SoundcloudUploader::progress_callback(void *caller, double dltotal, double dlnow, double ultotal, double ulnow)
+{
+ SoundcloudUploader *scu = (SoundcloudUploader *) caller;
+ DEBUG_TRACE (DEBUG::Soundcloud, string_compose ("%1: uploaded %2 of %3", scu->title, ulnow, ultotal) );
+ scu->caller->SoundcloudProgress(ultotal, ulnow, scu->title); /* EMIT SIGNAL */
+ return 0;
+}
+
+
+std::string
+SoundcloudUploader::Upload(std::string file_path, std::string title, std::string token, bool ispublic, bool downloadable, ARDOUR::ExportHandler *caller)
+{
+ int still_running;
+
+ struct MemoryStruct xml_page;
+ xml_page.memory = NULL;
+ xml_page.size = 0;
+
+ setcUrlOptions();
+
+ curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
+ curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *) &xml_page);
+
+ struct curl_httppost *formpost=NULL;
+ struct curl_httppost *lastptr=NULL;
+
+ /* Fill in the file upload field. This makes libcurl load data from
+ the given file name when curl_easy_perform() is called. */
+ curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "track[asset_data]",
+ CURLFORM_FILE, file_path.c_str(),
+ CURLFORM_END);
+
+ /* Fill in the filename field */
+ curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "oauth_token",
+ CURLFORM_COPYCONTENTS, token.c_str(),
+ CURLFORM_END);
+
+ curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "track[title]",
+ CURLFORM_COPYCONTENTS, title.c_str(),
+ CURLFORM_END);
+
+ curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "track[sharing]",
+ CURLFORM_COPYCONTENTS, ispublic ? "public" : "private",
+ CURLFORM_END);
+
+ curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "track[downloadable]",
+ CURLFORM_COPYCONTENTS, downloadable ? "true" : "false",
+ CURLFORM_END);
+
+
+
+ /* initalize custom header list (stating that Expect: 100-continue is not
+ wanted */
+ struct curl_slist *headerlist=NULL;
+ static const char buf[] = "Expect:";
+ headerlist = curl_slist_append(headerlist, buf);
+
+
+ if (curl_handle && multi_handle) {
+
+ /* what URL that receives this POST */
+ std::string url = "https://api.soundcloud.com/tracks";
+ curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str());
+ // curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L);
+
+ curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headerlist);
+ curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, formpost);
+
+ this->title = title; // save title to show in progress bar
+ this->caller = caller;
+
+ curl_easy_setopt (curl_handle, CURLOPT_NOPROGRESS, 0); // turn on the progress bar
+ curl_easy_setopt (curl_handle, CURLOPT_PROGRESSFUNCTION, &SoundcloudUploader::progress_callback);
+ curl_easy_setopt (curl_handle, CURLOPT_PROGRESSDATA, this);
+
+ curl_multi_add_handle(multi_handle, curl_handle);
+
+ curl_multi_perform(multi_handle, &still_running);
+
+
+ while(still_running) {
+ struct timeval timeout;
+ int rc; /* select() return code */
+
+ fd_set fdread;
+ fd_set fdwrite;
+ fd_set fdexcep;
+ int maxfd = -1;
+
+ long curl_timeo = -1;
+
+ FD_ZERO(&fdread);
+ FD_ZERO(&fdwrite);
+ FD_ZERO(&fdexcep);
+
+ /* set a suitable timeout to play around with */
+ timeout.tv_sec = 1;
+ timeout.tv_usec = 0;
+
+ curl_multi_timeout(multi_handle, &curl_timeo);
+ if(curl_timeo >= 0) {
+ timeout.tv_sec = curl_timeo / 1000;
+ if(timeout.tv_sec > 1)
+ timeout.tv_sec = 1;
+ else
+ timeout.tv_usec = (curl_timeo % 1000) * 1000;
+ }
+
+ /* get file descriptors from the transfers */
+ curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
+
+ /* In a real-world program you OF COURSE check the return code of the
+ function calls. On success, the value of maxfd is guaranteed to be
+ greater or equal than -1. We call select(maxfd + 1, ...), specially in
+ case of (maxfd == -1), we call select(0, ...), which is basically equal
+ to sleep. */
+
+ rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+
+ switch(rc) {
+ case -1:
+ /* select error */
+ break;
+ case 0:
+ default:
+ /* timeout or readable/writable sockets */
+ curl_multi_perform(multi_handle, &still_running);
+ break;
+ }
+ }
+
+ /* then cleanup the formpost chain */
+ curl_formfree(formpost);
+
+ /* free slist */
+ curl_slist_free_all (headerlist);
+ }
+
+ curl_easy_setopt (curl_handle, CURLOPT_NOPROGRESS, 1); // turn off the progress bar
+
+ if(xml_page.memory){
+
+ DEBUG_TRACE (DEBUG::Soundcloud, xml_page.memory);
+
+ XMLTree doc;
+ doc.read_buffer( xml_page.memory );
+ XMLNode *root = doc.root();
+
+ if (!root) {
+ DEBUG_TRACE (DEBUG::Soundcloud, "no root XML node!");
+ return "";
+ }
+
+ XMLNode *url_node = root->child("permalink-url");
+ if (!url_node) {
+ DEBUG_TRACE (DEBUG::Soundcloud, "no child node \"permalink-url\" found!");
+ return "";
+ }
+
+ XMLNode *text_node = url_node->child("text");
+ if (!text_node) {
+ DEBUG_TRACE (DEBUG::Soundcloud, "no text node found!");
+ return "";
+ }
+
+ free( xml_page.memory );
+ return text_node->content();
+ }
+
+ return "";
+};
+
+
+SoundcloudUploader:: ~SoundcloudUploader()
+{
+ curl_easy_cleanup(curl_handle);
+ curl_multi_cleanup(multi_handle);
+}
+
+
+void
+SoundcloudUploader::setcUrlOptions()
+{
+ // basic init for curl
+ curl_global_init(CURL_GLOBAL_ALL);
+ // some servers don't like requests that are made without a user-agent field, so we provide one
+ curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
+ // setup curl error buffer
+ curl_easy_setopt(curl_handle, CURLOPT_ERRORBUFFER, errorBuffer);
+ // Allow redirection
+ curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1);
+
+ // Allow connections to time out (without using signals)
+ curl_easy_setopt(curl_handle, CURLOPT_NOSIGNAL, 1);
+ curl_easy_setopt(curl_handle, CURLOPT_CONNECTTIMEOUT, 30);
+
+ curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYHOST, 0);
+ curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, 0);
+}
+
diff --git a/libs/ardour/source.cc b/libs/ardour/source.cc
index 618dddc70b..03039fea5b 100644
--- a/libs/ardour/source.cc
+++ b/libs/ardour/source.cc
@@ -19,8 +19,6 @@
#include <sys/stat.h>
#include <unistd.h>
-#include <fcntl.h>
-#include <poll.h>
#include <float.h>
#include <cerrno>
#include <ctime>
diff --git a/libs/ardour/sse_functions_xmm.cc b/libs/ardour/sse_functions_xmm.cc
index 48212ea8e1..f8a53cc6f8 100644
--- a/libs/ardour/sse_functions_xmm.cc
+++ b/libs/ardour/sse_functions_xmm.cc
@@ -45,8 +45,11 @@ x86_sse_find_peaks(const ARDOUR::Sample* buf, ARDOUR::pframes_t nframes, float *
// use 64 byte prefetch for quadruple quads
while (nframes >= 16) {
+#ifdef COMPILER_MSVC
+ _mm_prefetch(((char*)buf+64), 0); // A total guess! Assumed to be eqivalent to
+#else // the line below but waiting to be tested !!
__builtin_prefetch(buf+64,0,0);
-
+#endif
work = _mm_load_ps(buf);
current_min = _mm_min_ps(current_min, work);
current_max = _mm_max_ps(current_max, work);
diff --git a/libs/ardour/system_exec.cc b/libs/ardour/system_exec.cc
new file mode 100644
index 0000000000..456f8351f2
--- /dev/null
+++ b/libs/ardour/system_exec.cc
@@ -0,0 +1,77 @@
+/*
+ Copyright (C) 2010 Paul Davis
+ Copyright (C) 2010-2014 Robin Gareus <robin@gareus.org>
+
+ 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.
+
+*/
+
+#include <glibmm/miscutils.h>
+#include "pbd/file_utils.h"
+#include "pbd/error.h"
+
+#include "ardour/filesystem_paths.h"
+#include "ardour/system_exec.h"
+
+using namespace ARDOUR;
+
+char * SystemExec::_vfork_exec_wrapper = NULL;
+
+static char *vfork_exec_wrapper_path() {
+#ifdef PLATFORM_WINDOWS
+ return NULL;
+#else
+ std::string vfork_exec_wrapper;
+ if (!PBD::find_file (
+ PBD::Searchpath(Glib::build_filename(ARDOUR::ardour_dll_directory(), "vfork")),
+ "ardour-exec-wrapper", vfork_exec_wrapper)) {
+ PBD::warning << "vfork exec wrapper not found..'" << endmsg;
+ return NULL;
+ }
+ return strdup(vfork_exec_wrapper.c_str());
+#endif
+}
+
+SystemExec::SystemExec (std::string c, char ** a)
+ : PBD::SystemExec(c, a)
+{
+#ifndef PLATFORM_WINDOWS
+ if (!_vfork_exec_wrapper) {
+ _vfork_exec_wrapper = vfork_exec_wrapper_path();
+ }
+#endif
+}
+
+SystemExec::SystemExec (std::string c, std::string a)
+ : PBD::SystemExec(c, a)
+{
+#ifndef PLATFORM_WINDOWS
+ if (!_vfork_exec_wrapper) {
+ _vfork_exec_wrapper = vfork_exec_wrapper_path();
+ }
+#endif
+}
+
+SystemExec::SystemExec (std::string c, const std::map<char, std::string> subs)
+ : PBD::SystemExec(c, subs)
+{
+#ifndef PLATFORM_WINDOWS
+ if (!_vfork_exec_wrapper) {
+ _vfork_exec_wrapper = vfork_exec_wrapper_path();
+ }
+#endif
+}
+
+SystemExec::~SystemExec() { }
diff --git a/libs/ardour/template_utils.cc b/libs/ardour/template_utils.cc
index 05007b0ade..f5a4dc78a6 100644
--- a/libs/ardour/template_utils.cc
+++ b/libs/ardour/template_utils.cc
@@ -23,13 +23,15 @@
#include <glibmm.h>
#include "pbd/basename.h"
-#include "pbd/pathscanner.h"
+#include "pbd/file_utils.h"
+#include "pbd/stl_delete.h"
#include "pbd/xml++.h"
#include "ardour/template_utils.h"
#include "ardour/directory_names.h"
#include "ardour/filesystem_paths.h"
#include "ardour/filename_extensions.h"
+#include "ardour/search_paths.h"
#include "ardour/io.h"
using namespace std;
@@ -37,22 +39,6 @@ using namespace PBD;
namespace ARDOUR {
-SearchPath
-template_search_path ()
-{
- SearchPath spath (ardour_data_search_path());
- spath.add_subdirectory_to_paths(templates_dir_name);
- return spath;
-}
-
-SearchPath
-route_template_search_path ()
-{
- SearchPath spath (ardour_data_search_path());
- spath.add_subdirectory_to_paths(route_templates_dir_name);
- return spath;
-}
-
std::string
user_template_directory ()
{
@@ -66,7 +52,7 @@ user_route_template_directory ()
}
static bool
-template_filter (const string &str, void */*arg*/)
+template_filter (const string &str, void* /*arg*/)
{
if (!Glib::file_test (str, Glib::FILE_TEST_IS_DIR)) {
return false;
@@ -76,7 +62,7 @@ template_filter (const string &str, void */*arg*/)
}
static bool
-route_template_filter (const string &str, void */*arg*/)
+route_template_filter (const string &str, void* /*arg*/)
{
if (str.find (template_suffix) == str.length() - strlen (template_suffix)) {
return true;
@@ -95,21 +81,19 @@ session_template_dir_to_file (string const & dir)
void
find_session_templates (vector<TemplateInfo>& template_names)
{
- vector<string *> *templates;
- PathScanner scanner;
- SearchPath spath (template_search_path());
+ vector<string> templates;
- templates = scanner (spath.to_string(), template_filter, 0, true, true);
+ find_files_matching_filter (templates, template_search_path(), template_filter, 0, true, true);
- if (!templates) {
- cerr << "Found nothing along " << spath.to_string() << endl;
+ if (templates.empty()) {
+ cerr << "Found nothing along " << template_search_path().to_string() << endl;
return;
}
- cerr << "Found " << templates->size() << " along " << spath.to_string() << endl;
+ cerr << "Found " << templates.size() << " along " << template_search_path().to_string() << endl;
- for (vector<string*>::iterator i = templates->begin(); i != templates->end(); ++i) {
- string file = session_template_dir_to_file (**i);
+ for (vector<string>::iterator i = templates.begin(); i != templates.end(); ++i) {
+ string file = session_template_dir_to_file (*i);
XMLTree tree;
@@ -119,30 +103,26 @@ find_session_templates (vector<TemplateInfo>& template_names)
TemplateInfo rti;
- rti.name = basename_nosuffix (**i);
- rti.path = **i;
+ rti.name = basename_nosuffix (*i);
+ rti.path = *i;
template_names.push_back (rti);
}
-
- delete templates;
}
void
find_route_templates (vector<TemplateInfo>& template_names)
{
- vector<string *> *templates;
- PathScanner scanner;
- SearchPath spath (route_template_search_path());
+ vector<string> templates;
- templates = scanner (spath.to_string(), route_template_filter, 0, false, true);
+ find_files_matching_filter (templates, route_template_search_path(), route_template_filter, 0, false, true);
- if (!templates) {
+ if (templates.empty()) {
return;
}
- for (vector<string*>::iterator i = templates->begin(); i != templates->end(); ++i) {
- string fullpath = *(*i);
+ for (vector<string>::iterator i = templates.begin(); i != templates.end(); ++i) {
+ string fullpath = *i;
XMLTree tree;
@@ -159,8 +139,6 @@ find_route_templates (vector<TemplateInfo>& template_names)
template_names.push_back (rti);
}
-
- delete templates;
}
}
diff --git a/libs/ardour/test/audio_engine_test.cc b/libs/ardour/test/audio_engine_test.cc
new file mode 100644
index 0000000000..0bed81f8a6
--- /dev/null
+++ b/libs/ardour/test/audio_engine_test.cc
@@ -0,0 +1,53 @@
+#include <iostream>
+
+#include "ardour/audioengine.h"
+#include "ardour/audio_backend.h"
+#include "ardour/search_paths.h"
+
+#include "audio_engine_test.h"
+#include "test_common.h"
+
+CPPUNIT_TEST_SUITE_REGISTRATION (AudioEngineTest);
+
+using namespace std;
+using namespace ARDOUR;
+using namespace PBD;
+
+void
+print_audio_backend_info (AudioBackendInfo const* abi)
+{
+ cerr << "Audio Backend, name:" << abi->name << endl;
+}
+
+void
+AudioEngineTest::test_backends ()
+{
+ AudioEngine* engine = AudioEngine::create ();
+
+ CPPUNIT_ASSERT (engine);
+
+ std::vector<AudioBackendInfo const *> backends = engine->available_backends ();
+
+ CPPUNIT_ASSERT (backends.size () != 0);
+
+ for (std::vector<AudioBackendInfo const *>::const_iterator i = backends.begin();
+ i != backends.end(); ++i) {
+ print_audio_backend_info(*i);
+ }
+}
+
+void
+AudioEngineTest::test_start ()
+{
+ AudioEngine* engine = AudioEngine::create ();
+
+ CPPUNIT_ASSERT_NO_THROW (engine->set_default_backend ());
+
+ init_post_engine ();
+
+ CPPUNIT_ASSERT (engine->start () == 0);
+
+ // sleep
+ // stop
+ // destroy
+}
diff --git a/libs/ardour/test/audio_engine_test.h b/libs/ardour/test/audio_engine_test.h
new file mode 100644
index 0000000000..9a6d9cc241
--- /dev/null
+++ b/libs/ardour/test/audio_engine_test.h
@@ -0,0 +1,14 @@
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+
+class AudioEngineTest : public CppUnit::TestFixture
+{
+ CPPUNIT_TEST_SUITE (AudioEngineTest);
+ CPPUNIT_TEST (test_backends);
+ CPPUNIT_TEST (test_start);
+ CPPUNIT_TEST_SUITE_END ();
+
+public:
+ void test_backends ();
+ void test_start ();
+};
diff --git a/libs/ardour/test/jack_utils_test.cc b/libs/ardour/test/jack_utils_test.cc
new file mode 100644
index 0000000000..7645df6ff3
--- /dev/null
+++ b/libs/ardour/test/jack_utils_test.cc
@@ -0,0 +1,290 @@
+
+#include <stdexcept>
+
+#ifdef PLATFORM_WINDOWS
+#include <windows.h> // only for Sleep
+#endif
+
+#include <glibmm/miscutils.h>
+
+#include "ardour/jack_utils.h"
+
+#include "jack_utils_test.h"
+
+CPPUNIT_TEST_SUITE_REGISTRATION (JackUtilsTest);
+
+using namespace std;
+using namespace ARDOUR;
+
+void
+JackUtilsTest::test_driver_names ()
+{
+ vector<string> driver_names;
+
+ get_jack_audio_driver_names (driver_names);
+
+ CPPUNIT_ASSERT(!driver_names.empty());
+
+ cout << endl;
+ cout << "Number of possible JACK Audio drivers found on this system: " << driver_names.size () << endl;
+
+ for (vector<string>::const_iterator i = driver_names.begin(); i != driver_names.end(); ++i) {
+ cout << "JACK Audio driver found: " << *i << endl;
+ }
+
+ string default_audio_driver;
+ get_jack_default_audio_driver_name (default_audio_driver);
+
+ cout << "The default audio driver on this system is: " << default_audio_driver << endl;
+
+ driver_names.clear();
+
+ get_jack_midi_system_names (default_audio_driver, driver_names);
+
+ CPPUNIT_ASSERT(!driver_names.empty());
+
+ cout << "Number of possible JACK MIDI drivers found on this system for default audio driver: " << driver_names.size () << endl;
+
+ for (vector<string>::const_iterator i = driver_names.begin(); i != driver_names.end(); ++i) {
+ cout << "JACK MIDI driver found: " << *i << endl;
+ }
+
+ string default_midi_driver;
+ get_jack_default_midi_system_name (default_audio_driver, default_midi_driver);
+
+ cout << "The default midi driver on this system is: " << default_midi_driver << endl;
+}
+
+string
+devices_string (const vector<string>& devices)
+{
+ std::string str;
+ for (vector<string>::const_iterator i = devices.begin(); i != devices.end();) {
+ str += *i;
+ if (++i != devices.end()) str += ", ";
+ }
+ return str;
+}
+
+void
+JackUtilsTest::test_device_names ()
+{
+ vector<string> driver_names;
+
+ get_jack_audio_driver_names (driver_names);
+
+ CPPUNIT_ASSERT(!driver_names.empty());
+
+ cout << endl;
+
+ for (vector<string>::const_iterator i = driver_names.begin(); i != driver_names.end(); ++i) {
+ string devices = devices_string (get_jack_device_names_for_audio_driver (*i));
+ cout << "JACK Audio driver found: " << *i << " with devices: " << devices << endl;
+ }
+}
+
+void
+JackUtilsTest::test_samplerates ()
+{
+ vector<string> samplerates;
+
+ get_jack_sample_rate_strings (samplerates);
+ cout << endl;
+ cout << "Number of possible Samplerates supported by JACK: " << samplerates.size () << endl;
+
+ for (vector<string>::const_iterator i = samplerates.begin(); i != samplerates.end(); ++i) {
+ cout << "Samplerate: " << *i << endl;
+ }
+}
+
+void
+JackUtilsTest::test_period_sizes ()
+{
+ vector<string> period_sizes;
+
+ get_jack_period_size_strings (period_sizes);
+ cout << endl;
+ cout << "Number of possible Period sizes supported by JACK: " << period_sizes.size () << endl;
+
+ for (vector<string>::const_iterator i = period_sizes.begin(); i != period_sizes.end(); ++i) {
+ cout << "Period size: " << *i << endl;
+ }
+}
+
+void
+JackUtilsTest::test_dither_modes ()
+{
+ vector<string> driver_names;
+
+ get_jack_audio_driver_names (driver_names);
+
+ CPPUNIT_ASSERT(!driver_names.empty());
+
+ cout << endl;
+
+ for (vector<string>::const_iterator i = driver_names.begin(); i != driver_names.end(); ++i) {
+ vector<string> dither_modes;
+
+ get_jack_dither_mode_strings (*i, dither_modes);
+ cout << "Number of possible Dither Modes supported by JACK driver " << *i <<
+ ": " << dither_modes.size () << endl;
+ for (vector<string>::const_iterator j = dither_modes.begin(); j != dither_modes.end(); ++j) {
+ cout << "Dither Mode: " << *j << endl;
+ }
+ cout << endl;
+ }
+
+}
+
+void
+JackUtilsTest::test_connect_server ()
+{
+ cout << endl;
+ if (jack_server_running ()) {
+ cout << "Jack server running " << endl;
+ } else {
+ cout << "Jack server not running " << endl;
+ }
+}
+
+void
+JackUtilsTest::test_set_jack_path_env ()
+{
+ cout << endl;
+
+ bool path_env_set = false;
+
+ string path_env = Glib::getenv ("PATH", path_env_set);
+
+ if (path_env_set) {
+ cout << "PATH env set to: " << path_env << endl;
+ } else {
+ cout << "PATH env not set" << endl;
+ }
+ vector<string> server_dirs;
+ get_jack_server_dir_paths (server_dirs);
+ set_path_env_for_jack_autostart (server_dirs);
+
+ path_env_set = false;
+
+ path_env = Glib::getenv ("PATH", path_env_set);
+
+ CPPUNIT_ASSERT (path_env_set);
+
+ cout << "After set_jack_path_env PATH env set to: " << path_env << endl;
+}
+
+void
+JackUtilsTest::test_server_paths ()
+{
+ cout << endl;
+
+ vector<std::string> server_dirs;
+
+ CPPUNIT_ASSERT (get_jack_server_dir_paths (server_dirs));
+
+ cout << "Number of Directories that may contain JACK servers: " << server_dirs.size () << endl;
+
+ for (vector<std::string>::const_iterator i = server_dirs.begin(); i != server_dirs.end(); ++i) {
+ cout << "JACK server directory path: " << *i << endl;
+ }
+
+ vector<string> server_names;
+
+ CPPUNIT_ASSERT (get_jack_server_application_names (server_names));
+
+ cout << "Number of possible JACK server names on this system: " << server_names.size () << endl;
+
+ for (vector<string>::const_iterator i = server_names.begin(); i != server_names.end(); ++i) {
+ cout << "JACK server name: " << *i << endl;
+ }
+
+ vector<std::string> server_paths;
+
+ CPPUNIT_ASSERT (get_jack_server_paths (server_dirs, server_names, server_paths));
+
+ cout << "Number of JACK servers on this system: " << server_paths.size () << endl;
+
+ for (vector<std::string>::const_iterator i = server_paths.begin(); i != server_paths.end(); ++i) {
+ cout << "JACK server path: " << *i << endl;
+ }
+
+ vector<std::string> server_paths2;
+
+ CPPUNIT_ASSERT (get_jack_server_paths (server_paths2));
+
+ CPPUNIT_ASSERT (server_paths.size () == server_paths2.size ());
+
+ std::string default_server_path;
+
+ CPPUNIT_ASSERT (get_jack_default_server_path (default_server_path));
+
+ cout << "The default JACK server on this system: " << default_server_path << endl;
+}
+
+bool
+get_default_jack_command_line (std::string& command_line)
+{
+ cout << endl;
+
+ JackCommandLineOptions options;
+
+ CPPUNIT_ASSERT (get_jack_default_server_path (options.server_path));
+
+ get_jack_default_audio_driver_name (options.driver);
+
+
+ // should fail, haven't set any device yet
+ CPPUNIT_ASSERT (!get_jack_command_line_string (options, command_line));
+
+ vector<string> devices = get_jack_device_names_for_audio_driver (options.driver);
+
+ if (!devices.empty()) {
+ options.input_device = devices.front ();
+ options.output_device = devices.front ();
+ } else {
+ cout << "No audio devices available using default JACK driver using Dummy driver" << endl;
+ options.driver = dummy_driver_name;
+ devices = get_jack_device_names_for_audio_driver (options.driver);
+ CPPUNIT_ASSERT (!devices.empty ());
+ options.input_device = devices.front ();
+ options.output_device = devices.front ();
+ }
+
+ options.input_device = devices.front ();
+ options.output_device = devices.front ();
+
+ string midi_driver;
+
+ get_jack_default_midi_system_name (options.driver, options.midi_driver);
+ //
+ // this at least should create a valid jack command line
+ return get_jack_command_line_string (options, command_line);
+
+}
+
+void
+JackUtilsTest::test_config ()
+{
+ std::string config_path(get_jack_server_user_config_file_path());
+
+ cout << "Jack server config file path: " << config_path << endl;
+
+ std::string command_line;
+
+ CPPUNIT_ASSERT (get_default_jack_command_line (command_line));
+
+ CPPUNIT_ASSERT (write_jack_config_file (config_path, command_line));
+}
+
+
+void
+JackUtilsTest::test_command_line ()
+{
+ string command_line;
+
+ // this at least should create a valid jack command line
+ CPPUNIT_ASSERT (get_default_jack_command_line (command_line));
+
+ cout << "Default JACK command line: " << command_line << endl;
+}
diff --git a/libs/ardour/test/jack_utils_test.h b/libs/ardour/test/jack_utils_test.h
new file mode 100644
index 0000000000..08fad2fc36
--- /dev/null
+++ b/libs/ardour/test/jack_utils_test.h
@@ -0,0 +1,31 @@
+
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+
+class JackUtilsTest : public CppUnit::TestFixture
+{
+ CPPUNIT_TEST_SUITE (JackUtilsTest);
+ CPPUNIT_TEST (test_driver_names);
+ CPPUNIT_TEST (test_device_names);
+ CPPUNIT_TEST (test_samplerates);
+ CPPUNIT_TEST (test_period_sizes);
+ CPPUNIT_TEST (test_dither_modes);
+ CPPUNIT_TEST (test_connect_server);
+ CPPUNIT_TEST (test_set_jack_path_env);
+ CPPUNIT_TEST (test_server_paths);
+ CPPUNIT_TEST (test_config);
+ CPPUNIT_TEST (test_command_line);
+ CPPUNIT_TEST_SUITE_END ();
+
+public:
+ void test_driver_names ();
+ void test_device_names ();
+ void test_samplerates ();
+ void test_period_sizes ();
+ void test_dither_modes ();
+ void test_connect_server ();
+ void test_set_jack_path_env ();
+ void test_server_paths ();
+ void test_config ();
+ void test_command_line ();
+};
diff --git a/libs/ardour/test/midi_clock_slave_test.cc b/libs/ardour/test/midi_clock_slave_test.cc
index dcb159cb2c..4349df22eb 100644
--- a/libs/ardour/test/midi_clock_slave_test.cc
+++ b/libs/ardour/test/midi_clock_slave_test.cc
@@ -27,7 +27,7 @@ MIDIClock_SlaveTest::testStepResponse ()
for (framecnt_t i = 1; i<= 100 * period_size; i++) {
// simulate jitter
- framecnt_t input_delta = framecnt_t (one_ppqn_in_frames + 0.1 * (double(random()) / double (RAND_MAX)) * one_ppqn_in_frames);
+ framecnt_t input_delta = framecnt_t (one_ppqn_in_frames + 0.1 * (double(g_random_int()) / double (RAND_MAX)) * one_ppqn_in_frames);
if (i % input_delta == 0) {
update_midi_clock (*parser, start_time + i);
diff --git a/libs/ardour/test/plugins_test.cc b/libs/ardour/test/plugins_test.cc
new file mode 100644
index 0000000000..c769bdaac0
--- /dev/null
+++ b/libs/ardour/test/plugins_test.cc
@@ -0,0 +1,54 @@
+#include <iostream>
+
+#include "ardour/plugin_manager.h"
+#include "ardour/search_paths.h"
+
+#include "plugins_test.h"
+#include "test_common.h"
+
+CPPUNIT_TEST_SUITE_REGISTRATION (PluginsTest);
+
+using namespace std;
+using namespace ARDOUR;
+using namespace PBD;
+
+void
+print_plugin_info (PluginInfoPtr pp)
+{
+ cout << "LADSPA Plugin, name " << pp->name
+ << ", category " << pp->category
+ << ", creator " << pp->creator
+ << ", path " << pp->path
+ << ", n_inputs " << pp->n_inputs.n_audio ()
+ << ", n_outputs " << pp->n_outputs.n_audio ()
+ << endl;
+
+}
+
+void
+PluginsTest::test ()
+{
+ PluginManager& pm = PluginManager::instance ();
+
+ pm.refresh ();
+
+ Searchpath ladspa_paths(ladspa_search_path ());
+
+ cout << "Number of Ladspa paths found: " << ladspa_paths.size () << endl;
+
+ for (vector<std::string>::iterator i = ladspa_paths.begin (); i != ladspa_paths.end(); ++i)
+ {
+ cout << "LADSPA search path includes: " << *i << endl;
+ }
+
+ PluginInfoList& ladspa_list = pm.ladspa_plugin_info ();
+
+ cout << "Number of Ladspa plugins found: " << ladspa_list.size () << endl;
+
+ for (PluginInfoList::iterator i = ladspa_list.begin (); i != ladspa_list.end(); ++i)
+ {
+ print_plugin_info (*i);
+ }
+
+
+}
diff --git a/libs/ardour/test/plugins_test.h b/libs/ardour/test/plugins_test.h
new file mode 100644
index 0000000000..1503b2bde2
--- /dev/null
+++ b/libs/ardour/test/plugins_test.h
@@ -0,0 +1,12 @@
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+
+class PluginsTest : public CppUnit::TestFixture
+{
+ CPPUNIT_TEST_SUITE (PluginsTest);
+ CPPUNIT_TEST (test);
+ CPPUNIT_TEST_SUITE_END ();
+
+public:
+ void test ();
+};
diff --git a/libs/ardour/test/resampled_source_test.cc b/libs/ardour/test/resampled_source_test.cc
index 5aaf71b7aa..9aa8989992 100644
--- a/libs/ardour/test/resampled_source_test.cc
+++ b/libs/ardour/test/resampled_source_test.cc
@@ -1,4 +1,4 @@
-// this is included first to avoid SearchPath definition on windows
+// this is included first to avoid Searchpath definition on windows
#include "test_common.h"
#include "pbd/file_utils.h"
@@ -19,7 +19,7 @@ ResampledSourceTest::seekTest ()
std::string test_file_path;
const string test_filename = "test.wav";
- CPPUNIT_ASSERT (find_file_in_search_path (test_search_path (), test_filename, test_file_path));
+ CPPUNIT_ASSERT (find_file (test_search_path (), test_filename, test_file_path));
boost::shared_ptr<SndFileImportableSource> s (new SndFileImportableSource (test_file_path));
ResampledImportableSource r (s, 48000, SrcBest);
diff --git a/libs/ardour/test/test_common.cc b/libs/ardour/test/test_common.cc
index 61f92972d1..71eba65bbb 100644
--- a/libs/ardour/test/test_common.cc
+++ b/libs/ardour/test/test_common.cc
@@ -25,10 +25,10 @@
using namespace std;
-PBD::SearchPath
+PBD::Searchpath
test_search_path ()
{
-#ifdef WIN32
+#ifdef PLATFORM_WINDOWS
std::string wsp(g_win32_get_package_installation_directory_of_module(NULL));
return Glib::build_filename (wsp, "ardour_testdata");
#else
diff --git a/libs/ardour/test/test_common.h b/libs/ardour/test/test_common.h
index 91fd066ac2..bfda543508 100644
--- a/libs/ardour/test/test_common.h
+++ b/libs/ardour/test/test_common.h
@@ -21,7 +21,7 @@
#include "pbd/search_path.h"
-PBD::SearchPath test_search_path ();
+PBD::Searchpath test_search_path ();
std::string new_test_output_dir (std::string prefix = "");
diff --git a/libs/ardour/thread_buffers.cc b/libs/ardour/thread_buffers.cc
index e469187ce9..b51576bfc9 100644
--- a/libs/ardour/thread_buffers.cc
+++ b/libs/ardour/thread_buffers.cc
@@ -40,7 +40,7 @@ ThreadBuffers::ThreadBuffers ()
}
void
-ThreadBuffers::ensure_buffers (ChanCount howmany)
+ThreadBuffers::ensure_buffers (ChanCount howmany, size_t custom)
{
// std::cerr << "ThreadBuffers " << this << " resize buffers with count = " << howmany << std::endl;
@@ -60,7 +60,14 @@ ThreadBuffers::ensure_buffers (ChanCount howmany)
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
size_t count = std::max (scratch_buffers->available().get(*t), howmany.get(*t));
- size_t size = _engine->raw_buffer_size (*t) / sizeof (Sample);
+ size_t size;
+ if (custom > 0) {
+ size = custom;
+ } else {
+ size = (*t == DataType::MIDI)
+ ? _engine->raw_buffer_size (*t)
+ : _engine->raw_buffer_size (*t) / sizeof (Sample);
+ }
scratch_buffers->ensure_buffers (*t, count, size);
mix_buffers->ensure_buffers (*t, count, size);
@@ -68,7 +75,7 @@ ThreadBuffers::ensure_buffers (ChanCount howmany)
route_buffers->ensure_buffers (*t, count, size);
}
- size_t audio_buffer_size = _engine->raw_buffer_size (DataType::AUDIO) / sizeof (Sample);
+ size_t audio_buffer_size = custom > 0 ? custom : _engine->raw_buffer_size (DataType::AUDIO) / sizeof (Sample);
delete [] gain_automation_buffer;
gain_automation_buffer = new gain_t[audio_buffer_size];
diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc
index 5c95de0c41..d463be598f 100644
--- a/libs/ardour/track.cc
+++ b/libs/ardour/track.cc
@@ -68,8 +68,10 @@ Track::init ()
/* don't add rec_enable_control to controls because we don't want it to
* appear as an automatable parameter
*/
+ track_number_changed.connect_same_thread (*this, boost::bind (&Track::resync_track_name, this));
+ _session.config.ParameterChanged.connect_same_thread (*this, boost::bind (&Track::parameter_changed, this, _1));
- return 0;
+ return 0;
}
void
@@ -284,6 +286,28 @@ Track::set_record_enabled (bool yn, void *src)
_rec_enable_control->Changed ();
}
+void
+Track::parameter_changed (string const & p)
+{
+ if (p == "track-name-number") {
+ resync_track_name ();
+ }
+ else if (p == "track-name-take") {
+ resync_track_name ();
+ }
+ else if (p == "take-name") {
+ if (_session.config.get_track_name_take()) {
+ resync_track_name ();
+ }
+ }
+}
+
+void
+Track::resync_track_name ()
+{
+ set_name(name());
+}
+
bool
Track::set_name (const string& str)
{
@@ -294,6 +318,29 @@ Track::set_name (const string& str)
return false;
}
+ string diskstream_name = "";
+ if (_session.config.get_track_name_take () && !_session.config.get_take_name ().empty()) {
+ // Note: any text is fine, legalize_for_path() fixes this later
+ diskstream_name += _session.config.get_take_name ();
+ diskstream_name += "_";
+ }
+ const int64_t tracknumber = track_number();
+ if (tracknumber > 0 && _session.config.get_track_name_number()) {
+ char num[64], fmt[10];
+ snprintf(fmt, sizeof(fmt), "%%0%d" PRId64, _session.track_number_decimals());
+ snprintf(num, sizeof(num), fmt, tracknumber);
+ diskstream_name += num;
+ diskstream_name += "_";
+ }
+ diskstream_name += str;
+
+ if (diskstream_name == _diskstream_name) {
+ return true;
+ }
+ _diskstream_name = diskstream_name;
+
+ _diskstream->set_write_source_name (diskstream_name);
+
boost::shared_ptr<Track> me = boost::dynamic_pointer_cast<Track> (shared_from_this ());
if (_diskstream->playlist()->all_regions_empty () && _session.playlists->playlists_for_track (me).size() == 1) {
/* Only rename the diskstream (and therefore the playlist) if
diff --git a/libs/ardour/utils.cc b/libs/ardour/utils.cc
index aa06912913..54943562cb 100644
--- a/libs/ardour/utils.cc
+++ b/libs/ardour/utils.cc
@@ -36,7 +36,9 @@
#include <sys/stat.h>
#include <sys/time.h>
#include <fcntl.h>
+#ifndef COMPILER_MSVC
#include <dirent.h>
+#endif
#include <errno.h>
#include <regex.h>
@@ -91,7 +93,7 @@ replace_chars (const string& str, const string& illegal_chars)
* the goal there is to be legal across filesystems.
*/
string
-legalize_for_path (const string& str)
+ARDOUR::legalize_for_path (const string& str)
{
return replace_chars (str, "/\\");
}
@@ -106,7 +108,7 @@ legalize_for_path (const string& str)
* ANY filesystem.
*/
string
-legalize_for_universal_path (const string& str)
+ARDOUR::legalize_for_universal_path (const string& str)
{
return replace_chars (str, "<>:\"/\\|?*");
}
@@ -117,7 +119,7 @@ legalize_for_universal_path (const string& str)
* correct.
*/
string
-legalize_for_uri (const string& str)
+ARDOUR::legalize_for_uri (const string& str)
{
return replace_chars (str, "<>:\"/\\|?* #");
}
@@ -131,7 +133,7 @@ legalize_for_uri (const string& str)
*/
string
-legalize_for_path_2X (const string& str)
+ARDOUR::legalize_for_path_2X (const string& str)
{
string::size_type pos;
string legal_chars = "abcdefghijklmnopqrtsuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_+=: ";
@@ -153,7 +155,7 @@ legalize_for_path_2X (const string& str)
}
string
-bump_name_once (const std::string& name, char delimiter)
+ARDOUR::bump_name_once (const std::string& name, char delimiter)
{
string::size_type delim;
string newname;
@@ -194,8 +196,34 @@ bump_name_once (const std::string& name, char delimiter)
}
+string
+ARDOUR::bump_name_number (const std::string& name)
+{
+ size_t pos = name.length();
+ size_t num = 0;
+ bool have_number = false;
+ while (pos > 0 && isdigit(name.at(--pos))) {
+ have_number = true;
+ num = pos;
+ }
+
+ string newname;
+ if (have_number) {
+ int32_t seq = strtol (name.c_str() + num, (char **)NULL, 10);
+ char buf[32];
+ snprintf (buf, sizeof(buf), "%d", seq + 1);
+ newname = name.substr (0, num);
+ newname += buf;
+ } else {
+ newname = name;
+ newname += "1";
+ }
+
+ return newname;
+}
+
XMLNode *
-find_named_node (const XMLNode& node, string name)
+ARDOUR::find_named_node (const XMLNode& node, string name)
{
XMLNodeList nlist;
XMLNodeConstIterator niter;
@@ -216,7 +244,7 @@ find_named_node (const XMLNode& node, string name)
}
int
-cmp_nocase (const string& s, const string& s2)
+ARDOUR::cmp_nocase (const string& s, const string& s2)
{
string::const_iterator p = s.begin();
string::const_iterator p2 = s2.begin();
@@ -232,7 +260,8 @@ cmp_nocase (const string& s, const string& s2)
return (s2.size() == s.size()) ? 0 : (s.size() < s2.size()) ? -1 : 1;
}
-int cmp_nocase_utf8 (const string& s1, const string& s2)
+int
+ARDOUR::cmp_nocase_utf8 (const string& s1, const string& s2)
{
const char *cstr1 = s1.c_str();
const char *cstr2 = s2.c_str();
@@ -268,7 +297,7 @@ int cmp_nocase_utf8 (const string& s1, const string& s2)
}
int
-touch_file (string path)
+ARDOUR::touch_file (string path)
{
int fd = open (path.c_str(), O_RDWR|O_CREAT, 0660);
if (fd >= 0) {
@@ -279,7 +308,7 @@ touch_file (string path)
}
string
-region_name_from_path (string path, bool strip_channels, bool add_channel_suffix, uint32_t total, uint32_t this_one)
+ARDOUR::region_name_from_path (string path, bool strip_channels, bool add_channel_suffix, uint32_t total, uint32_t this_one)
{
path = PBD::basename_nosuffix (path);
@@ -311,7 +340,7 @@ region_name_from_path (string path, bool strip_channels, bool add_channel_suffix
}
bool
-path_is_paired (string path, string& pair_base)
+ARDOUR::path_is_paired (string path, string& pair_base)
{
string::size_type pos;
@@ -344,7 +373,7 @@ path_is_paired (string path, string& pair_base)
#if __APPLE__
string
-CFStringRefToStdString(CFStringRef stringRef)
+ARDOUR::CFStringRefToStdString(CFStringRef stringRef)
{
CFIndex size =
CFStringGetMaximumSizeForEncoding(CFStringGetLength(stringRef) ,
@@ -362,7 +391,7 @@ CFStringRefToStdString(CFStringRef stringRef)
#endif // __APPLE__
void
-compute_equal_power_fades (framecnt_t nframes, float* in, float* out)
+ARDOUR::compute_equal_power_fades (framecnt_t nframes, float* in, float* out)
{
double step;
@@ -388,7 +417,7 @@ compute_equal_power_fades (framecnt_t nframes, float* in, float* out)
}
EditMode
-string_to_edit_mode (string str)
+ARDOUR::string_to_edit_mode (string str)
{
if (str == _("Splice")) {
return Splice;
@@ -403,7 +432,7 @@ string_to_edit_mode (string str)
}
const char*
-edit_mode_to_string (EditMode mode)
+ARDOUR::edit_mode_to_string (EditMode mode)
{
switch (mode) {
case Slide:
@@ -419,7 +448,7 @@ edit_mode_to_string (EditMode mode)
}
SyncSource
-string_to_sync_source (string str)
+ARDOUR::string_to_sync_source (string str)
{
if (str == _("MIDI Timecode") || str == _("MTC")) {
return MTC;
@@ -440,7 +469,7 @@ string_to_sync_source (string str)
/** @param sh Return a short version of the string */
const char*
-sync_source_to_string (SyncSource src, bool sh)
+ARDOUR::sync_source_to_string (SyncSource src, bool sh)
{
switch (src) {
case Engine:
@@ -471,7 +500,7 @@ sync_source_to_string (SyncSource src, bool sh)
}
float
-meter_falloff_to_float (MeterFalloff falloff)
+ARDOUR::meter_falloff_to_float (MeterFalloff falloff)
{
switch (falloff) {
case MeterFalloffOff:
@@ -498,7 +527,7 @@ meter_falloff_to_float (MeterFalloff falloff)
}
MeterFalloff
-meter_falloff_from_float (float val)
+ARDOUR::meter_falloff_from_float (float val)
{
if (val == METER_FALLOFF_OFF) {
return MeterFalloffOff;
@@ -611,7 +640,7 @@ bool_as_string (bool yn)
}
const char*
-native_header_format_extension (HeaderFormat hf, const DataType& type)
+ARDOUR::native_header_format_extension (HeaderFormat hf, const DataType& type)
{
if (type == DataType::MIDI) {
return ".mid";
@@ -640,7 +669,7 @@ native_header_format_extension (HeaderFormat hf, const DataType& type)
}
bool
-matching_unsuffixed_filename_exists_in (const string& dir, const string& path)
+ARDOUR::matching_unsuffixed_filename_exists_in (const string& dir, const string& path)
{
string bws = basename_nosuffix (path);
struct dirent* dentry;
@@ -685,7 +714,7 @@ matching_unsuffixed_filename_exists_in (const string& dir, const string& path)
}
uint32_t
-how_many_dsp_threads ()
+ARDOUR::how_many_dsp_threads ()
{
/* CALLER MUST HOLD PROCESS LOCK */
@@ -718,12 +747,14 @@ how_many_dsp_threads ()
return num_threads;
}
-double gain_to_slider_position_with_max (double g, double max_gain)
+double
+ARDOUR::gain_to_slider_position_with_max (double g, double max_gain)
{
return gain_to_slider_position (g * 2.0/max_gain);
}
-double slider_position_to_gain_with_max (double g, double max_gain)
+double
+ARDOUR::slider_position_to_gain_with_max (double g, double max_gain)
{
return slider_position_to_gain (g * max_gain/2.0);
}
diff --git a/libs/ardour/vst_info_file.cc b/libs/ardour/vst_info_file.cc
new file mode 100644
index 0000000000..da49d1b8eb
--- /dev/null
+++ b/libs/ardour/vst_info_file.cc
@@ -0,0 +1,1058 @@
+/*
+ Copyright (C) 2012-2014 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.
+
+*/
+
+/** @file libs/ardour/vst_info_file.cc
+ * @brief Code to manage info files containing cached information about a plugin.
+ * e.g. its name, creator etc.
+ */
+
+#include <iostream>
+#include <cassert>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include <stdlib.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <glib.h>
+#include <glib/gstdio.h>
+#include <glibmm.h>
+
+#include "pbd/error.h"
+
+#ifndef VST_SCANNER_APP
+#include "ardour/plugin_manager.h" // scanner_bin_path
+#include "ardour/rc_configuration.h"
+#include "ardour/system_exec.h"
+#endif
+
+#include "ardour/filesystem_paths.h"
+#include "ardour/linux_vst_support.h"
+#include "ardour/plugin_types.h"
+#include "ardour/vst_info_file.h"
+
+#define MAX_STRING_LEN 256
+#define PLUGIN_SCAN_TIMEOUT (Config->get_vst_scan_timeout()) // in deciseconds
+
+
+/* CACHE FILE PATHS */
+#define EXT_BLACKLIST ".fsb"
+#define EXT_ERRORFILE ".err"
+#define EXT_INFOFILE ".fsi"
+
+#ifdef PLATFORM_WINDOWS
+#define PFX_DOTFILE ""
+#else
+#define PFX_DOTFILE "."
+#endif
+
+
+using namespace std;
+#ifndef VST_SCANNER_APP
+namespace ARDOUR {
+#endif
+
+/* prototypes */
+#ifdef WINDOWS_VST_SUPPORT
+#include <fst.h>
+static bool
+vstfx_instantiate_and_get_info_fst (const char* dllpath, vector<VSTInfo*> *infos, int uniqueID);
+#endif
+
+#ifdef LXVST_SUPPORT
+static bool vstfx_instantiate_and_get_info_lx (const char* dllpath, vector<VSTInfo*> *infos, int uniqueID);
+#endif
+
+/* ID for shell plugins */
+static int vstfx_current_loading_id = 0;
+
+
+
+/* *** CACHE FILE PATHS *** */
+
+static string
+vstfx_cache_file (const char* dllpath, int personal, const char *ext)
+{
+ string dir;
+ if (personal) {
+ dir = get_personal_vst_blacklist_dir();
+ } else {
+ dir = Glib::path_get_dirname (std::string(dllpath));
+ }
+
+ stringstream s;
+ s << PFX_DOTFILE << Glib::path_get_basename (dllpath) << ext;
+ return Glib::build_filename (dir, s.str ());
+}
+
+static string
+vstfx_blacklist_path (const char* dllpath, int personal)
+{
+ return vstfx_cache_file(dllpath, personal, EXT_BLACKLIST);
+}
+
+static string
+vstfx_infofile_path (const char* dllpath, int personal)
+{
+ return vstfx_cache_file(dllpath, personal, EXT_INFOFILE);
+}
+
+#ifndef VST_SCANNER_APP
+static string
+vstfx_errorfile_path (const char* dllpath, int personal)
+{
+ return vstfx_cache_file(dllpath, personal, EXT_ERRORFILE);
+}
+#endif
+
+
+/* *** MEMORY MANAGEMENT *** */
+
+/** cleanup single allocated VSTInfo */
+static void
+vstfx_free_info (VSTInfo *info)
+{
+ for (int i = 0; i < info->numParams; i++) {
+ free (info->ParamNames[i]);
+ free (info->ParamLabels[i]);
+ }
+
+ free (info->name);
+ free (info->creator);
+ free (info->Category);
+ free (info->ParamNames);
+ free (info->ParamLabels);
+ free (info);
+}
+
+/** reset vector */
+static void
+vstfx_clear_info_list (vector<VSTInfo *> *infos)
+{
+ for (vector<VSTInfo *>::iterator i = infos->begin(); i != infos->end(); ++i) {
+ vstfx_free_info(*i);
+ }
+ infos->clear();
+}
+
+
+
+/* *** CACHE FILE I/O *** */
+
+/** Helper function to read a line from the cache file
+ * @return newly allocated string of NULL
+ */
+static char *
+read_string (FILE *fp)
+{
+ char buf[MAX_STRING_LEN];
+
+ if (!fgets (buf, MAX_STRING_LEN, fp)) {
+ return 0;
+ }
+
+ if (strlen(buf) < MAX_STRING_LEN) {
+ if (strlen (buf)) {
+ buf[strlen(buf)-1] = 0;
+ }
+ return strdup (buf);
+ } else {
+ return 0;
+ }
+}
+
+/** Read an integer value from a line in fp into n,
+ * @return true on failure, false on success.
+ */
+static bool
+read_int (FILE* fp, int* n)
+{
+ char buf[MAX_STRING_LEN];
+
+ char* p = fgets (buf, MAX_STRING_LEN, fp);
+ if (p == 0) {
+ return true;
+ }
+
+ return (sscanf (p, "%d", n) != 1);
+}
+
+/** parse a plugin-block from the cache info file */
+static bool
+vstfx_load_info_block(FILE* fp, VSTInfo *info)
+{
+ if ((info->name = read_string(fp)) == 0) return false;
+ if ((info->creator = read_string(fp)) == 0) return false;
+ if (read_int (fp, &info->UniqueID)) return false;
+ if ((info->Category = read_string(fp)) == 0) return false;
+ if (read_int (fp, &info->numInputs)) return false;
+ if (read_int (fp, &info->numOutputs)) return false;
+ if (read_int (fp, &info->numParams)) return false;
+ if (read_int (fp, &info->wantMidi)) return false;
+ if (read_int (fp, &info->hasEditor)) return false;
+ if (read_int (fp, &info->canProcessReplacing)) return false;
+
+ /* backwards compatibility with old .fsi files */
+ if (info->wantMidi == -1) {
+ info->wantMidi = 1;
+ }
+
+ if ((info->ParamNames = (char **) malloc(sizeof(char*)*info->numParams)) == 0) {
+ return false;
+ }
+
+ for (int i = 0; i < info->numParams; ++i) {
+ if ((info->ParamNames[i] = read_string(fp)) == 0) return false;
+ }
+
+ if ((info->ParamLabels = (char **) malloc(sizeof(char*)*info->numParams)) == 0) {
+ return false;
+ }
+
+ for (int i = 0; i < info->numParams; ++i) {
+ if ((info->ParamLabels[i] = read_string(fp)) == 0) {
+ return false;
+ }
+ }
+ return true;
+}
+
+/** parse all blocks in a cache info file */
+static bool
+vstfx_load_info_file (FILE* fp, vector<VSTInfo*> *infos)
+{
+ VSTInfo *info;
+ if ((info = (VSTInfo*) calloc (1, sizeof (VSTInfo))) == 0) {
+ return false;
+ }
+ if (vstfx_load_info_block(fp, info)) {
+ if (strncmp (info->Category, "Shell", 5)) {
+ infos->push_back(info);
+ } else {
+ int plugin_cnt = 0;
+ vstfx_free_info(info);
+ if (!read_int (fp, &plugin_cnt)) {
+ for (int i = 0; i < plugin_cnt; i++) {
+ if ((info = (VSTInfo*) calloc (1, sizeof (VSTInfo))) == 0) {
+ vstfx_clear_info_list(infos);
+ return false;
+ }
+ if (vstfx_load_info_block(fp, info)) {
+ infos->push_back(info);
+ } else {
+ vstfx_free_info(info);
+ vstfx_clear_info_list(infos);
+ return false;
+ }
+ }
+ } else {
+ return false; /* Bad file */
+ }
+ }
+ return true;
+ }
+ vstfx_free_info(info);
+ vstfx_clear_info_list(infos);
+ return false;
+}
+
+static void
+vstfx_write_info_block (FILE* fp, VSTInfo *info)
+{
+ assert (info);
+ assert (fp);
+
+ fprintf (fp, "%s\n", info->name);
+ fprintf (fp, "%s\n", info->creator);
+ fprintf (fp, "%d\n", info->UniqueID);
+ fprintf (fp, "%s\n", info->Category);
+ fprintf (fp, "%d\n", info->numInputs);
+ fprintf (fp, "%d\n", info->numOutputs);
+ fprintf (fp, "%d\n", info->numParams);
+ fprintf (fp, "%d\n", info->wantMidi);
+ fprintf (fp, "%d\n", info->hasEditor);
+ fprintf (fp, "%d\n", info->canProcessReplacing);
+
+ for (int i = 0; i < info->numParams; i++) {
+ fprintf (fp, "%s\n", info->ParamNames[i]);
+ }
+
+ for (int i = 0; i < info->numParams; i++) {
+ fprintf (fp, "%s\n", info->ParamLabels[i]);
+ }
+}
+
+static void
+vstfx_write_info_file (FILE* fp, vector<VSTInfo *> *infos)
+{
+ assert(infos);
+ assert(fp);
+
+ if (infos->size() > 1) {
+ vector<VSTInfo *>::iterator x = infos->begin();
+ /* write out the shell info first along with count of the number of
+ * plugins contained in this shell
+ */
+ vstfx_write_info_block(fp, *x);
+ fprintf( fp, "%d\n", (int)infos->size() - 1 );
+ ++x;
+ /* Now write out the info for each plugin */
+ for (; x != infos->end(); ++x) {
+ vstfx_write_info_block(fp, *x);
+ }
+ } else if (infos->size() == 1) {
+ vstfx_write_info_block(fp, infos->front());
+ } else {
+ PBD::error << "Zero plugins in VST." << endmsg; // XXX here? rather make this impossible before if it ain't already.
+ }
+}
+
+
+/* *** CACHE AND BLACKLIST MANAGEMENT *** */
+
+/* return true if plugin is blacklisted or has an invalid file extension */
+static bool
+vstfx_blacklist_stat (const char *dllpath, int personal)
+{
+ if (strstr (dllpath, ".so" ) == 0 && strstr(dllpath, ".dll") == 0) {
+ return true;
+ }
+ string const path = vstfx_blacklist_path (dllpath, personal);
+
+ if (Glib::file_test (path, Glib::FileTest (Glib::FILE_TEST_EXISTS | Glib::FILE_TEST_IS_REGULAR))) {
+ struct stat dllstat;
+ struct stat fsbstat;
+
+ if (stat (dllpath, &dllstat) == 0 && stat (path.c_str(), &fsbstat) == 0) {
+ if (dllstat.st_mtime > fsbstat.st_mtime) {
+ /* plugin is newer than blacklist file */
+ return true;
+ }
+ }
+ /* stat failed or plugin is older than blacklist file */
+ return true;
+ }
+ /* blacklist file does not exist */
+ return false;
+}
+
+/* return true if plugin is blacklisted, checks both personal
+ * and global folder */
+static bool
+vstfx_check_blacklist (const char *dllpath)
+{
+ if (vstfx_blacklist_stat(dllpath, 0)) return true;
+ if (vstfx_blacklist_stat(dllpath, 1)) return true;
+ return false;
+}
+
+/* create blacklist file, preferably in same folder as the
+ * plugin, fall back to personal folder in $HOME
+ */
+static FILE *
+vstfx_blacklist_file (const char *dllpath)
+{
+ FILE *f;
+ if ((f = fopen (vstfx_blacklist_path (dllpath, 0).c_str(), "w"))) {
+ return f;
+ }
+ return fopen (vstfx_blacklist_path (dllpath, 1).c_str(), "w");
+}
+
+/** mark plugin as blacklisted */
+static bool
+vstfx_blacklist (const char *dllpath)
+{
+ FILE *f = vstfx_blacklist_file(dllpath);
+ if (f) {
+ fclose(f);
+ return true;
+ }
+ return false;
+}
+
+/** mark plugin as not blacklisted */
+static void
+vstfx_un_blacklist (const char *dllpath)
+{
+ ::g_unlink(vstfx_blacklist_path (dllpath, 0).c_str());
+ ::g_unlink(vstfx_blacklist_path (dllpath, 1).c_str());
+}
+
+/** remove info file from cache */
+static void
+vstfx_remove_infofile (const char *dllpath)
+{
+ ::g_unlink(vstfx_infofile_path (dllpath, 0).c_str());
+ ::g_unlink(vstfx_infofile_path (dllpath, 1).c_str());
+}
+
+/** helper function, check if cache is newer than plugin
+ * @return path to cache file */
+static char *
+vstfx_infofile_stat (const char *dllpath, struct stat* statbuf, int personal)
+{
+ if (strstr (dllpath, ".so" ) == 0 && strstr(dllpath, ".dll") == 0) {
+ return 0;
+ }
+
+ string const path = vstfx_infofile_path (dllpath, personal);
+
+ if (Glib::file_test (path, Glib::FileTest (Glib::FILE_TEST_EXISTS | Glib::FILE_TEST_IS_REGULAR))) {
+
+ struct stat dllstat;
+
+ if (stat (dllpath, &dllstat) == 0) {
+ if (stat (path.c_str(), statbuf) == 0) {
+ if (dllstat.st_mtime <= statbuf->st_mtime) {
+ /* plugin is older than info file */
+ return strdup (path.c_str ());
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+/** cache file for given plugin
+ * @return FILE of the .fsi cache if found and up-to-date*/
+static FILE *
+vstfx_infofile_for_read (const char* dllpath)
+{
+ struct stat own_statbuf;
+ struct stat sys_statbuf;
+ FILE *rv = NULL;
+
+ char* own_info = vstfx_infofile_stat (dllpath, &own_statbuf, 1);
+ char* sys_info = vstfx_infofile_stat (dllpath, &sys_statbuf, 0);
+
+ if (own_info) {
+ if (sys_info) {
+ if (own_statbuf.st_mtime <= sys_statbuf.st_mtime) {
+ /* system info file is newer, use it */
+ rv = g_fopen (sys_info, "rb");
+ }
+ } else {
+ rv = g_fopen (own_info, "rb");
+ }
+ } else if (sys_info) {
+ rv = g_fopen (sys_info, "rb");
+ }
+ free(own_info);
+ free(sys_info);
+
+ return rv;
+}
+
+/** helper function for \ref vstfx_infofile_for_write
+ * abstract global and personal cache folders
+ */
+static FILE *
+vstfx_infofile_create (const char* dllpath, int personal)
+{
+ if (strstr (dllpath, ".so" ) == 0 && strstr(dllpath, ".dll") == 0) {
+ return 0;
+ }
+
+ string const path = vstfx_infofile_path (dllpath, personal);
+ return fopen (path.c_str(), "w");
+}
+
+/** newly created cache file for given plugin
+ * @return FILE for the .fsi cache, NULL if neither personal,
+ * nor global cache folder is writable */
+static FILE *
+vstfx_infofile_for_write (const char* dllpath)
+{
+ FILE* f;
+
+ if ((f = vstfx_infofile_create (dllpath, 0)) == 0) {
+ f = vstfx_infofile_create (dllpath, 1);
+ }
+
+ return f;
+}
+
+/** check if cache-file exists, is up-to-date and parse cache file
+ * @param infos [return] loaded plugin info
+ * @return true if .fsi cache was read successfully, false otherwise
+ */
+static bool
+vstfx_get_info_from_file(const char* dllpath, vector<VSTInfo*> *infos)
+{
+ FILE* infofile;
+ bool rv = false;
+ if ((infofile = vstfx_infofile_for_read (dllpath)) != 0) {
+ rv = vstfx_load_info_file(infofile, infos);
+ fclose (infofile);
+ if (!rv) {
+ PBD::warning << "Cannot get VST information form " << dllpath << ": info file load failed." << endmsg;
+ }
+ }
+ return rv;
+}
+
+
+
+/* *** VST system-under-test methods *** */
+
+static
+bool vstfx_midi_input (VSTState* vstfx)
+{
+ AEffect* plugin = vstfx->plugin;
+
+ int const vst_version = plugin->dispatcher (plugin, effGetVstVersion, 0, 0, 0, 0.0f);
+
+ if (vst_version >= 2) {
+ /* should we send it VST events (i.e. MIDI) */
+
+ if ((plugin->flags & effFlagsIsSynth) || (plugin->dispatcher (plugin, effCanDo, 0, 0,(void*) "receiveVstEvents", 0.0f) > 0)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+static
+bool vstfx_midi_output (VSTState* vstfx)
+{
+ AEffect* plugin = vstfx->plugin;
+
+ int const vst_version = plugin->dispatcher (plugin, effGetVstVersion, 0, 0, 0, 0.0f);
+
+ if (vst_version >= 2) {
+ /* should we send it VST events (i.e. MIDI) */
+
+ if ( (plugin->dispatcher (plugin, effCanDo, 0, 0,(void*) "sendVstEvents", 0.0f) > 0)
+ || (plugin->dispatcher (plugin, effCanDo, 0, 0,(void*) "sendVstMidiEvent", 0.0f) > 0)
+ ) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/** simple 'dummy' audiomaster callback to instantiate the plugin
+ * and query information
+ */
+static intptr_t
+simple_master_callback (AEffect *, int32_t opcode, int32_t, intptr_t, void *ptr, float)
+{
+ const char* vstfx_can_do_strings[] = {
+ "supplyIdle",
+ "sendVstTimeInfo",
+ "sendVstEvents",
+ "sendVstMidiEvent",
+ "receiveVstEvents",
+ "receiveVstMidiEvent",
+ "supportShell",
+ "shellCategory",
+ "shellCategorycurID"
+ };
+ const int vstfx_can_do_string_count = 9;
+
+ if (opcode == audioMasterVersion) {
+ return 2400;
+ }
+ else if (opcode == audioMasterCanDo) {
+ for (int i = 0; i < vstfx_can_do_string_count; i++) {
+ if (! strcmp(vstfx_can_do_strings[i], (const char*)ptr)) {
+ return 1;
+ }
+ }
+ return 0;
+ }
+ else if (opcode == audioMasterCurrentId) {
+ return vstfx_current_loading_id;
+ }
+ else {
+ return 0;
+ }
+}
+
+
+/** main plugin query and test function */
+static VSTInfo*
+vstfx_parse_vst_state (VSTState* vstfx)
+{
+ assert (vstfx);
+
+ VSTInfo* info = (VSTInfo*) malloc (sizeof (VSTInfo));
+ if (!info) {
+ return 0;
+ }
+
+ /*We need to init the creator because some plugins
+ fail to implement getVendorString, and so won't stuff the
+ string with any name*/
+
+ char creator[65] = "Unknown";
+ char name[65] = "";
+
+ AEffect* plugin = vstfx->plugin;
+
+
+ plugin->dispatcher (plugin, effGetEffectName, 0, 0, name, 0);
+
+ if (strlen(name) == 0) {
+ plugin->dispatcher (plugin, effGetProductString, 0, 0, name, 0);
+ }
+
+ if (strlen(name) == 0) {
+ info->name = strdup (vstfx->handle->name);
+ } else {
+ info->name = strdup (name);
+ }
+
+ /*If the plugin doesn't bother to implement GetVendorString we will
+ have pre-stuffed the string with 'Unknown' */
+
+ plugin->dispatcher (plugin, effGetVendorString, 0, 0, creator, 0);
+
+ /*Some plugins DO implement GetVendorString, but DON'T put a name in it
+ so if its just a zero length string we replace it with 'Unknown' */
+
+ if (strlen(creator) == 0) {
+ info->creator = strdup ("Unknown");
+ } else {
+ info->creator = strdup (creator);
+ }
+
+
+ switch (plugin->dispatcher (plugin, effGetPlugCategory, 0, 0, 0, 0))
+ {
+ case kPlugCategEffect: info->Category = strdup ("Effect"); break;
+ case kPlugCategSynth: info->Category = strdup ("Synth"); break;
+ case kPlugCategAnalysis: info->Category = strdup ("Anaylsis"); break;
+ case kPlugCategMastering: info->Category = strdup ("Mastering"); break;
+ case kPlugCategSpacializer: info->Category = strdup ("Spacializer"); break;
+ case kPlugCategRoomFx: info->Category = strdup ("RoomFx"); break;
+ case kPlugSurroundFx: info->Category = strdup ("SurroundFx"); break;
+ case kPlugCategRestoration: info->Category = strdup ("Restoration"); break;
+ case kPlugCategOfflineProcess: info->Category = strdup ("Offline"); break;
+ case kPlugCategShell: info->Category = strdup ("Shell"); break;
+ case kPlugCategGenerator: info->Category = strdup ("Generator"); break;
+ default: info->Category = strdup ("Unknown"); break;
+ }
+
+ info->UniqueID = plugin->uniqueID;
+
+ info->numInputs = plugin->numInputs;
+ info->numOutputs = plugin->numOutputs;
+ info->numParams = plugin->numParams;
+ info->wantMidi = (vstfx_midi_input(vstfx) ? 1 : 0) | (vstfx_midi_output(vstfx) ? 2 : 0);
+ info->hasEditor = plugin->flags & effFlagsHasEditor ? true : false;
+ info->canProcessReplacing = plugin->flags & effFlagsCanReplacing ? true : false;
+ info->ParamNames = (char **) malloc(sizeof(char*)*info->numParams);
+ info->ParamLabels = (char **) malloc(sizeof(char*)*info->numParams);
+
+ for (int i = 0; i < info->numParams; ++i) {
+ char name[64];
+ char label[64];
+
+ /* Not all plugins give parameters labels as well as names */
+
+ strcpy (name, "No Name");
+ strcpy (label, "No Label");
+
+ plugin->dispatcher (plugin, effGetParamName, i, 0, name, 0);
+ info->ParamNames[i] = strdup(name);
+
+ //NOTE: 'effGetParamLabel' is no longer defined in vestige headers
+ //plugin->dispatcher (plugin, effGetParamLabel, i, 0, label, 0);
+ info->ParamLabels[i] = strdup(label);
+ }
+ return info;
+}
+
+/** wrapper around \ref vstfx_parse_vst_state,
+ * iterate over plugins in shell, translate VST-info into ardour VSTState
+ */
+static void
+vstfx_info_from_plugin (const char *dllpath, VSTState* vstfx, vector<VSTInfo *> *infos, enum ARDOUR::PluginType type)
+{
+ assert(vstfx);
+ VSTInfo *info;
+
+ if (!(info = vstfx_parse_vst_state(vstfx))) {
+ return;
+ }
+
+ infos->push_back(info);
+#if 1 // shell-plugin support
+ /* If this plugin is a Shell and we are not already inside a shell plugin
+ * read the info for all of the plugins contained in this shell.
+ */
+ if (!strncmp (info->Category, "Shell", 5)
+ && vstfx->handle->plugincnt == 1) {
+ int id;
+ vector< pair<int, string> > ids;
+ AEffect *plugin = vstfx->plugin;
+ string path = vstfx->handle->path;
+
+ do {
+ char name[65] = "Unknown";
+ id = plugin->dispatcher (plugin, effShellGetNextPlugin, 0, 0, name, 0);
+ ids.push_back(std::make_pair(id, name));
+ } while ( id != 0 );
+
+ switch(type) {
+#ifdef WINDOWS_VST_SUPPORT
+ case ARDOUR::Windows_VST: fst_close(vstfx); break;
+#endif
+#ifdef LXVST_SUPPORT
+ case ARDOUR::LXVST: vstfx_close (vstfx); break;
+#endif
+ default: assert(0); break;
+ }
+
+ for (vector< pair<int, string> >::iterator x = ids.begin(); x != ids.end(); ++x) {
+ id = (*x).first;
+ if (id == 0) continue;
+ /* recurse vstfx_get_info() */
+
+ bool ok;
+ switch (type) {
+#ifdef WINDOWS_VST_SUPPORT
+ case ARDOUR::Windows_VST: ok = vstfx_instantiate_and_get_info_fst(dllpath, infos, id); break;
+#endif
+#ifdef LXVST_SUPPORT
+ case ARDOUR::LXVST: ok = vstfx_instantiate_and_get_info_lx(dllpath, infos, id); break;
+#endif
+ default: ok = false;
+ }
+ if (ok) {
+ // One shell (some?, all?) does not report the actual plugin name
+ // even after the shelled plugin has been instantiated.
+ // Replace the name of the shell with the real name.
+ info = infos->back();
+ free (info->name);
+
+ if ((*x).second.length() == 0) {
+ info->name = strdup("Unknown");
+ }
+ else {
+ info->name = strdup ((*x).second.c_str());
+ }
+ }
+ }
+ } else {
+ switch(type) {
+#ifdef WINDOWS_VST_SUPPORT
+ case ARDOUR::Windows_VST: fst_close(vstfx); break;
+#endif
+#ifdef LXVST_SUPPORT
+ case ARDOUR::LXVST: vstfx_close (vstfx); break;
+#endif
+ default: assert(0); break;
+ }
+ }
+#endif
+}
+
+
+
+/* *** TOP-LEVEL PLUGIN INSTANTIATION FUNCTIONS *** */
+
+#ifdef LXVST_SUPPORT
+static bool
+vstfx_instantiate_and_get_info_lx (
+ const char* dllpath, vector<VSTInfo*> *infos, int uniqueID)
+{
+ VSTHandle* h;
+ VSTState* vstfx;
+ if (!(h = vstfx_load(dllpath))) {
+ PBD::warning << "Cannot get LinuxVST information from " << dllpath << ": load failed." << endmsg;
+ return false;
+ }
+
+ vstfx_current_loading_id = uniqueID;
+
+ if (!(vstfx = vstfx_instantiate(h, simple_master_callback, 0))) {
+ vstfx_unload(h);
+ PBD::warning << "Cannot get LinuxVST information from " << dllpath << ": instantiation failed." << endmsg;
+ return false;
+ }
+
+ vstfx_current_loading_id = 0;
+
+ vstfx_info_from_plugin(dllpath, vstfx, infos, ARDOUR::LXVST);
+
+ vstfx_unload (h);
+ return true;
+}
+#endif
+
+#ifdef WINDOWS_VST_SUPPORT
+static bool
+vstfx_instantiate_and_get_info_fst (
+ const char* dllpath, vector<VSTInfo*> *infos, int uniqueID)
+{
+ VSTHandle* h;
+ VSTState* vstfx;
+ if(!(h = fst_load(dllpath))) {
+ PBD::warning << "Cannot get Windows VST information from " << dllpath << ": load failed." << endmsg;
+ return false;
+ }
+
+ vstfx_current_loading_id = uniqueID;
+
+ if(!(vstfx = fst_instantiate(h, simple_master_callback, 0))) {
+ fst_unload(&h);
+ vstfx_current_loading_id = 0;
+ PBD::warning << "Cannot get Windows VST information from " << dllpath << ": instantiation failed." << endmsg;
+ return false;
+ }
+ vstfx_current_loading_id = 0;
+
+ vstfx_info_from_plugin(dllpath, vstfx, infos, ARDOUR::Windows_VST);
+
+ return true;
+}
+#endif
+
+
+
+/* *** ERROR LOGGING *** */
+#ifndef VST_SCANNER_APP
+
+static FILE * _errorlog_fd = 0;
+static char * _errorlog_dll = 0;
+
+static void parse_scanner_output (std::string msg, size_t /*len*/)
+{
+ if (!_errorlog_fd && !_errorlog_dll) {
+ PBD::error << "VST scanner: " << msg;
+ return;
+ }
+
+ if (!_errorlog_fd) {
+ if (!(_errorlog_fd = fopen(vstfx_errorfile_path(_errorlog_dll, 0).c_str(), "w"))) {
+ if (!(_errorlog_fd = fopen(vstfx_errorfile_path(_errorlog_dll, 1).c_str(), "w"))) {
+ PBD::error << "Cannot create plugin error-log for plugin " << _errorlog_dll;
+ free(_errorlog_dll);
+ _errorlog_dll = NULL;
+ }
+ }
+ }
+
+ if (_errorlog_fd) {
+ fprintf (_errorlog_fd, "%s\n", msg.c_str());
+ } else {
+ PBD::error << "VST scanner: " << msg;
+ }
+}
+
+static void
+set_error_log (const char* dllpath) {
+ assert(!_errorlog_fd);
+ assert(!_errorlog_dll);
+ _errorlog_dll = strdup(dllpath);
+}
+
+static void
+close_error_log () {
+ if (_errorlog_fd) {
+ fclose(_errorlog_fd);
+ _errorlog_fd = 0;
+ }
+ free(_errorlog_dll);
+ _errorlog_dll = 0;
+}
+
+#endif
+
+
+/* *** THE MAIN FUNCTION THAT USES ALL OF THE ABOVE :) *** */
+
+static vector<VSTInfo *> *
+vstfx_get_info (const char* dllpath, enum ARDOUR::PluginType type, enum VSTScanMode mode)
+{
+ FILE* infofile;
+ vector<VSTInfo*> *infos = new vector<VSTInfo*>;
+
+ if (vstfx_check_blacklist(dllpath)) {
+ return infos;
+ }
+
+ if (vstfx_get_info_from_file(dllpath, infos)) {
+ return infos;
+ }
+
+#ifndef VST_SCANNER_APP
+ std::string scanner_bin_path = ARDOUR::PluginManager::scanner_bin_path;
+
+ if (mode == VST_SCAN_CACHE_ONLY) {
+ /* never scan explicitly, use cache only */
+ return infos;
+ }
+ else if (mode == VST_SCAN_USE_APP && scanner_bin_path != "") {
+ /* use external scanner app */
+
+ char **argp= (char**) calloc(3,sizeof(char*));
+ argp[0] = strdup(scanner_bin_path.c_str());
+ argp[1] = strdup(dllpath);
+ argp[2] = 0;
+
+ set_error_log(dllpath);
+ ARDOUR::SystemExec scanner (scanner_bin_path, argp);
+ PBD::ScopedConnectionList cons;
+ scanner.ReadStdout.connect_same_thread (cons, boost::bind (&parse_scanner_output, _1 ,_2));
+ if (scanner.start (2 /* send stderr&stdout via signal */)) {
+ PBD::error << "Cannot launch VST scanner app '" << scanner_bin_path << "': "<< strerror(errno) << endmsg;
+ close_error_log();
+ return infos;
+ } else {
+ int timeout = PLUGIN_SCAN_TIMEOUT;
+ bool no_timeout = (timeout <= 0);
+ ARDOUR::PluginScanTimeout(timeout);
+ while (scanner.is_running() && (no_timeout || timeout > 0)) {
+ if (!no_timeout && !ARDOUR::PluginManager::instance().no_timeout()) {
+ if (timeout%5 == 0) {
+ ARDOUR::PluginScanTimeout(timeout);
+ }
+ --timeout;
+ }
+ ARDOUR::GUIIdle();
+ Glib::usleep (100000);
+
+ if (ARDOUR::PluginManager::instance().cancelled()) {
+ // remove info file (might be incomplete)
+ vstfx_remove_infofile(dllpath);
+ // remove temporary blacklist file (scan incomplete)
+ vstfx_un_blacklist(dllpath);
+ scanner.terminate();
+ close_error_log();
+ return infos;
+ }
+ }
+ scanner.terminate();
+ }
+ close_error_log();
+ /* re-read index (generated by external scanner) */
+ vstfx_clear_info_list(infos);
+ if (!vstfx_check_blacklist(dllpath)) {
+ vstfx_get_info_from_file(dllpath, infos);
+ }
+ return infos;
+ }
+ /* else .. instantiate and check in in ardour process itself */
+#else
+ (void) mode; // unused parameter
+#endif
+
+ bool ok;
+ /* blacklist in case instantiation fails */
+ vstfx_blacklist(dllpath);
+
+ switch (type) {
+#ifdef WINDOWS_VST_SUPPORT
+ case ARDOUR::Windows_VST: ok = vstfx_instantiate_and_get_info_fst(dllpath, infos, 0); break;
+#endif
+#ifdef LXVST_SUPPORT
+ case ARDOUR::LXVST: ok = vstfx_instantiate_and_get_info_lx(dllpath, infos, 0); break;
+#endif
+ default: ok = false;
+ }
+
+ if (!ok) {
+ return infos;
+ }
+
+ /* remove from blacklist */
+ vstfx_un_blacklist(dllpath);
+
+ /* crate cache/whitelist */
+ infofile = vstfx_infofile_for_write (dllpath);
+ if (!infofile) {
+ PBD::warning << "Cannot cache VST information for " << dllpath << ": cannot create new FST info file." << endmsg;
+ return infos;
+ } else {
+ vstfx_write_info_file (infofile, infos);
+ fclose (infofile);
+ }
+ return infos;
+}
+
+
+
+/* *** public API *** */
+
+void
+vstfx_free_info_list (vector<VSTInfo *> *infos)
+{
+ for (vector<VSTInfo *>::iterator i = infos->begin(); i != infos->end(); ++i) {
+ vstfx_free_info(*i);
+ }
+ delete infos;
+}
+
+string
+get_personal_vst_blacklist_dir() {
+ string dir = Glib::build_filename (ARDOUR::user_cache_directory(), "fst_blacklist");
+ /* if the directory doesn't exist, try to create it */
+ if (!Glib::file_test (dir, Glib::FILE_TEST_IS_DIR)) {
+ if (g_mkdir (dir.c_str (), 0700)) {
+ PBD::error << "Cannot create VST blacklist folder '" << dir << "'" << endmsg;
+ //exit(1);
+ }
+ }
+ return dir;
+}
+
+string
+get_personal_vst_info_cache_dir() {
+ string dir = Glib::build_filename (ARDOUR::user_cache_directory(), "fst_info");
+ /* if the directory doesn't exist, try to create it */
+ if (!Glib::file_test (dir, Glib::FILE_TEST_IS_DIR)) {
+ if (g_mkdir (dir.c_str (), 0700)) {
+ PBD::error << "Cannot create VST info folder '" << dir << "'" << endmsg;
+ //exit(1);
+ }
+ }
+ return dir;
+}
+
+#ifdef LXVST_SUPPORT
+vector<VSTInfo *> *
+vstfx_get_info_lx (char* dllpath, enum VSTScanMode mode)
+{
+ return vstfx_get_info(dllpath, ARDOUR::LXVST, mode);
+}
+#endif
+
+#ifdef WINDOWS_VST_SUPPORT
+vector<VSTInfo *> *
+vstfx_get_info_fst (char* dllpath, enum VSTScanMode mode)
+{
+ return vstfx_get_info(dllpath, ARDOUR::Windows_VST, mode);
+}
+#endif
+
+#ifndef VST_SCANNER_APP
+} // namespace
+#endif
diff --git a/libs/ardour/vst_plugin.cc b/libs/ardour/vst_plugin.cc
index 729ee5c129..24020e8356 100644
--- a/libs/ardour/vst_plugin.cc
+++ b/libs/ardour/vst_plugin.cc
@@ -25,7 +25,6 @@
#include "pbd/floating.h"
#include "pbd/locale_guard.h"
-#include "pbd/pathscanner.h"
#include "ardour/vst_plugin.h"
#include "ardour/vestige/aeffectx.h"
@@ -46,12 +45,12 @@ VSTPlugin::VSTPlugin (AudioEngine& engine, Session& session, VSTHandle* handle)
, _state (0)
, _plugin (0)
{
-
+
}
VSTPlugin::~VSTPlugin ()
{
-
+
}
void
@@ -78,7 +77,7 @@ VSTPlugin::activate ()
_plugin->dispatcher (_plugin, effMainsChanged, 0, 1, NULL, 0.0f);
}
-int
+int
VSTPlugin::set_block_size (pframes_t nframes)
{
deactivate ();
@@ -93,13 +92,13 @@ VSTPlugin::default_value (uint32_t)
return 0;
}
-float
+float
VSTPlugin::get_parameter (uint32_t which) const
{
return _plugin->getParameter (_plugin, which);
}
-void
+void
VSTPlugin::set_parameter (uint32_t which, float newval)
{
float oldval = get_parameter (which);
@@ -109,7 +108,7 @@ VSTPlugin::set_parameter (uint32_t which, float newval)
}
_plugin->setParameter (_plugin, which, newval);
-
+
float curval = get_parameter (which);
if (!PBD::floateq (curval, oldval, 1)) {
@@ -215,8 +214,8 @@ VSTPlugin::set_state (const XMLNode& node, int version)
for (n = child->children ().begin (); n != child->children ().end (); ++n) {
if ((*n)->is_content ()) {
/* XXX: this may be dubious for the same reasons that we delay
- execution of load_preset.
- */
+ execution of load_preset.
+ */
ret = set_chunk ((*n)->content().c_str(), false);
}
}
@@ -250,6 +249,7 @@ VSTPlugin::get_parameter_descriptor (uint32_t which, ParameterDescriptor& desc)
{
VstParameterProperties prop;
+ memset (&prop, 0, sizeof (VstParameterProperties));
desc.min_unbound = false;
desc.max_unbound = false;
prop.flags = 0;
@@ -257,6 +257,7 @@ VSTPlugin::get_parameter_descriptor (uint32_t which, ParameterDescriptor& desc)
if (_plugin->dispatcher (_plugin, effGetParameterProperties, which, 0, &prop, 0)) {
/* i have yet to find or hear of a VST plugin that uses this */
+ /* RG: faust2vsti does use this :) */
if (prop.flags & kVstParameterUsesIntegerMinMax) {
desc.lower = prop.minInteger;
@@ -287,6 +288,10 @@ VSTPlugin::get_parameter_descriptor (uint32_t which, ParameterDescriptor& desc)
desc.largestep = desc.step * 10.0f;
}
+ if (strlen(prop.label) == 0) {
+ _plugin->dispatcher (_plugin, effGetParamName, which, 0, prop.label, 0);
+ }
+
desc.toggled = prop.flags & kVstParameterIsSwitch;
desc.logarithmic = false;
desc.sr_dependent = false;
@@ -301,7 +306,7 @@ VSTPlugin::get_parameter_descriptor (uint32_t which, ParameterDescriptor& desc)
memset (label, 0, sizeof (label));
_plugin->dispatcher (_plugin, effGetParamName, which, 0, label, 0);
-
+
desc.label = label;
desc.integer_step = false;
desc.lower = 0.0f;
@@ -335,7 +340,7 @@ VSTPlugin::load_preset (PresetRecord r)
return s;
}
-bool
+bool
VSTPlugin::load_plugin_preset (PresetRecord r)
{
/* This is a plugin-provided preset.
@@ -348,15 +353,14 @@ VSTPlugin::load_plugin_preset (PresetRecord r)
#ifndef NDEBUG
int const p = sscanf (r.uri.c_str(), "VST:%d:%d", &id, &index);
assert (p == 2);
-#else
+#else
sscanf (r.uri.c_str(), "VST:%d:%d", &id, &index);
#endif
-
_state->want_program = index;
return true;
}
-bool
+bool
VSTPlugin::load_user_preset (PresetRecord r)
{
/* This is a user preset; we load it, and this code also knows about the
@@ -402,7 +406,7 @@ VSTPlugin::load_user_preset (PresetRecord r)
return false;
} else {
-
+
for (XMLNodeList::const_iterator j = (*i)->children().begin(); j != (*i)->children().end(); ++j) {
if ((*j)->name() == X_("Parameter")) {
XMLProperty* index = (*j)->property (X_("index"));
@@ -420,7 +424,7 @@ VSTPlugin::load_user_preset (PresetRecord r)
return false;
}
-string
+string
VSTPlugin::do_save_preset (string name)
{
boost::shared_ptr<XMLTree> t (presets_tree ());
@@ -466,7 +470,7 @@ VSTPlugin::do_save_preset (string name)
return uri;
}
-void
+void
VSTPlugin::do_remove_preset (string name)
{
boost::shared_ptr<XMLTree> t (presets_tree ());
@@ -482,7 +486,7 @@ VSTPlugin::do_remove_preset (string name)
t->write (f);
}
-string
+string
VSTPlugin::describe_parameter (Evoral::Parameter param)
{
char name[64];
@@ -499,7 +503,7 @@ VSTPlugin::describe_parameter (Evoral::Parameter param)
return name;
}
-framecnt_t
+framecnt_t
VSTPlugin::signal_latency () const
{
if (_user_latency) {
@@ -509,7 +513,7 @@ VSTPlugin::signal_latency () const
return *((int32_t *) (((char *) &_plugin->flags) + 12)); /* initialDelay */
}
-set<Evoral::Parameter>
+set<Evoral::Parameter>
VSTPlugin::automatable () const
{
set<Evoral::Parameter> ret;
@@ -523,20 +527,30 @@ VSTPlugin::automatable () const
int
VSTPlugin::connect_and_run (BufferSet& bufs,
- ChanMapping in_map, ChanMapping out_map,
- pframes_t nframes, framecnt_t offset)
+ ChanMapping in_map, ChanMapping out_map,
+ pframes_t nframes, framecnt_t offset)
{
Plugin::connect_and_run (bufs, in_map, out_map, nframes, offset);
ChanCount bufs_count;
bufs_count.set(DataType::AUDIO, 1);
bufs_count.set(DataType::MIDI, 1);
+ _midi_out_buf = 0;
BufferSet& silent_bufs = _session.get_silent_buffers(bufs_count);
BufferSet& scratch_bufs = _session.get_scratch_buffers(bufs_count);
- float *ins[_plugin->numInputs];
- float *outs[_plugin->numOutputs];
+ /* VC++ doesn't support the C99 extension that allows
+
+ typeName foo[variableDefiningSize];
+
+ Use alloca instead of dynamic array (rather than std::vector which
+ allocs on the heap) because this is realtime code.
+ */
+
+ float** ins = (float**)alloca(_plugin->numInputs*sizeof(float*));
+ float** outs = (float**)alloca(_plugin->numInputs*sizeof(float*));
+
int32_t i;
uint32_t in_index = 0;
@@ -560,58 +574,74 @@ VSTPlugin::connect_and_run (BufferSet& bufs,
}
if (bufs.count().n_midi() > 0) {
- VstEvents* v = bufs.get_vst_midi (0);
- _plugin->dispatcher (_plugin, effProcessEvents, 0, 0, v, 0);
+ VstEvents* v = 0;
+ bool valid = false;
+ const uint32_t buf_index_in = in_map.get(DataType::MIDI, 0, &valid);
+ if (valid) {
+ v = bufs.get_vst_midi (buf_index_in);
+ }
+ valid = false;
+ const uint32_t buf_index_out = out_map.get(DataType::MIDI, 0, &valid);
+ if (valid) {
+ _midi_out_buf = &bufs.get_midi(buf_index_out);
+ _midi_out_buf->silence(0, 0);
+ } else {
+ _midi_out_buf = 0;
+ }
+ if (v) {
+ _plugin->dispatcher (_plugin, effProcessEvents, 0, 0, v, 0);
+ }
}
/* we already know it can support processReplacing */
- _plugin->processReplacing (_plugin, ins, outs, nframes);
+ _plugin->processReplacing (_plugin, &ins[0], &outs[0], nframes);
+ _midi_out_buf = 0;
return 0;
}
-string
+string
VSTPlugin::unique_id () const
{
char buf[32];
snprintf (buf, sizeof (buf), "%d", _plugin->uniqueID);
-
+
return string (buf);
}
-const char *
+const char *
VSTPlugin::name () const
{
return _handle->name;
}
-const char *
+const char *
VSTPlugin::maker () const
{
return _info->creator.c_str();
}
-const char *
+const char *
VSTPlugin::label () const
{
return _handle->name;
}
-uint32_t
+uint32_t
VSTPlugin::parameter_count () const
{
return _plugin->numParams;
}
-bool
+bool
VSTPlugin::has_editor () const
{
return _plugin->flags & effFlagsHasEditor;
}
-void
+void
VSTPlugin::print_parameter (uint32_t param, char *buf, uint32_t /*len*/) const
{
char *first_nonws;
diff --git a/libs/ardour/windows_vst_plugin.cc b/libs/ardour/windows_vst_plugin.cc
index 9fe9ba0049..03170e0d04 100644
--- a/libs/ardour/windows_vst_plugin.cc
+++ b/libs/ardour/windows_vst_plugin.cc
@@ -28,12 +28,14 @@ using namespace std;
using namespace ARDOUR;
using namespace PBD;
-WindowsVSTPlugin::WindowsVSTPlugin (AudioEngine& e, Session& session, VSTHandle* h)
+WindowsVSTPlugin::WindowsVSTPlugin (AudioEngine& e, Session& session, VSTHandle* h, int unique_id)
: VSTPlugin (e, session, h)
{
+ Session::vst_current_loading_id = unique_id;
if ((_state = fst_instantiate (_handle, Session::vst_callback, this)) == 0) {
throw failed_constructor();
}
+ Session::vst_current_loading_id = 0;
set_plugin (_state->plugin);
}
@@ -43,9 +45,11 @@ WindowsVSTPlugin::WindowsVSTPlugin (const WindowsVSTPlugin &other)
{
_handle = other._handle;
+ Session::vst_current_loading_id = PBD::atoi(other.unique_id());
if ((_state = fst_instantiate (_handle, Session::vst_callback, this)) == 0) {
throw failed_constructor();
}
+ Session::vst_current_loading_id = 0;
_plugin = _state->plugin;
}
@@ -70,7 +74,7 @@ WindowsVSTPluginInfo::load (Session& session)
if ((int) handle == -1) {
error << string_compose(_("VST: cannot load module from \"%1\""), path) << endmsg;
} else {
- plugin.reset (new WindowsVSTPlugin (session.engine(), session, handle));
+ plugin.reset (new WindowsVSTPlugin (session.engine(), session, handle, PBD::atoi(unique_id)));
}
} else {
error << _("You asked ardour to not use any VST plugins") << endmsg;
diff --git a/libs/ardour/worker.cc b/libs/ardour/worker.cc
index b13398c69d..aea1c6f8e3 100644
--- a/libs/ardour/worker.cc
+++ b/libs/ardour/worker.cc
@@ -23,6 +23,8 @@
#include "ardour/worker.h"
#include "pbd/error.h"
+#include <glibmm/timer.h>
+
namespace ARDOUR {
Worker::Worker(Workee* workee, uint32_t ring_size)
@@ -80,6 +82,9 @@ Worker::verify_message_completeness(RingBuffer<uint8_t>* rb)
uint32_t size;
RingBuffer<uint8_t>::rw_vector vec;
rb->get_read_vector (&vec);
+ if (vec.len[0] + vec.len[1] < sizeof(size)) {
+ return false;
+ }
if (vec.len[0] >= sizeof(size)) {
memcpy (&size, vec.buf[0], sizeof (size));
} else {
@@ -119,6 +124,7 @@ Worker::run()
while (true) {
_sem.wait();
if (_exit) {
+ if (buf) free(buf);
return;
}
@@ -128,8 +134,9 @@ Worker::run()
continue;
}
while (!verify_message_completeness(_requests)) {
- ::usleep(2000);
+ Glib::usleep(2000);
if (_exit) {
+ if (buf) free(buf);
return;
}
}
@@ -141,7 +148,13 @@ Worker::run()
if (size > buf_size) {
buf = realloc(buf, size);
- buf_size = size;
+ if (buf) {
+ buf_size = size;
+ } else {
+ PBD::error << "Worker: Error allocating memory"
+ << endmsg;
+ buf_size = 0; // TODO: This is probably fatal
+ }
}
if (_requests->read((uint8_t*)buf, size) < size) {
diff --git a/libs/ardour/wscript b/libs/ardour/wscript
index 608bbf1991..3ce94d892b 100644
--- a/libs/ardour/wscript
+++ b/libs/ardour/wscript
@@ -2,6 +2,7 @@
from waflib.extras import autowaf as autowaf
from waflib import Options
import os
+import sys
import re
import subprocess
import sys
@@ -45,7 +46,6 @@ libardour_sources = [
'automation_control.cc',
'automation_list.cc',
'automation_watch.cc',
- 'backend_search_path.cc',
'beats_frames_converter.cc',
'broadcast_info.cc',
'buffer.cc',
@@ -59,11 +59,11 @@ libardour_sources = [
'configuration.cc',
'config_text.cc',
'control_protocol_manager.cc',
- 'control_protocol_search_path.cc',
'cycle_timer.cc',
'data_type.cc',
'default_click.cc',
'debug.cc',
+ 'delayline.cc',
'delivery.cc',
'directory_names.cc',
'diskstream.cc',
@@ -80,7 +80,6 @@ libardour_sources = [
'export_format_manager.cc',
'export_format_specification.cc',
'export_formats.cc',
- 'export_formats_search_path.cc',
'export_graph_builder.cc',
'export_handler.cc',
'export_preset.cc',
@@ -109,7 +108,6 @@ libardour_sources = [
'location.cc',
'location_importer.cc',
'ltc_slave.cc',
- 'lv2_bundled_search_path.cc',
'meter.cc',
'midi_automation_list_binder.cc',
'midi_buffer.cc',
@@ -117,12 +115,13 @@ libardour_sources = [
'midi_diskstream.cc',
'midi_model.cc',
'midi_patch_manager.cc',
- 'midi_patch_search_path.cc',
'midi_playlist.cc',
'midi_playlist_source.cc',
'midi_port.cc',
'midi_region.cc',
'midi_ring_buffer.cc',
+ 'midi_scene_change.cc',
+ 'midi_scene_changer.cc',
'midi_source.cc',
'midi_state_tracker.cc',
'midi_stretch.cc',
@@ -132,6 +131,7 @@ libardour_sources = [
'mix.cc',
'monitor_processor.cc',
'mtc_slave.cc',
+ 'mididm.cc',
'mtdm.cc',
'mute_master.cc',
'onset_detector.cc',
@@ -140,10 +140,8 @@ libardour_sources = [
'pannable.cc',
'panner.cc',
'panner_manager.cc',
- 'panner_search_path.cc',
'panner_shell.cc',
'pcm_utils.cc',
- 'pi_controller.cc',
'playlist.cc',
'playlist_factory.cc',
'playlist_source.cc',
@@ -170,6 +168,8 @@ libardour_sources = [
'route_group.cc',
'route_group_member.cc',
'rb_effect.cc',
+ 'scene_change.cc',
+ 'search_paths.cc',
'send.cc',
'session.cc',
'session_butler.cc',
@@ -196,11 +196,13 @@ libardour_sources = [
'sndfile_helpers.cc',
'sndfileimportable.cc',
'sndfilesource.cc',
+ 'soundcloud_upload.cc',
'source.cc',
'source_factory.cc',
'speakers.cc',
'srcfilesource.cc',
'strip_silence.cc',
+ 'system_exec.cc',
'revision.cc',
'tape_file_matcher.cc',
'template_utils.cc',
@@ -242,23 +244,24 @@ def configure(conf):
autowaf.build_version_files(
path_prefix + 'ardour/version.h',
path_prefix + 'version.cc',
- 'libardour3', conf.env['MAJOR'], conf.env['MINOR'], 0)
+ 'libardour3', conf.env['MAJOR'], conf.env['MINOR'], 0,
+ 'LIBARDOUR_API', 'ardour/libardour_visibility.h')
autowaf.configure(conf)
autowaf.check_pkg(conf, 'aubio', uselib_store='AUBIO',
atleast_version='0.3.2')
autowaf.check_pkg(conf, 'aubio', uselib_store='AUBIO4',
atleast_version='0.4.0', mandatory=False)
autowaf.check_pkg(conf, 'libxml-2.0', uselib_store='XML')
- autowaf.check_pkg(conf, 'lrdf', uselib_store='LRDF',
- atleast_version='0.4.0')
+ if Options.options.dist_target != 'mingw':
+ autowaf.check_pkg(conf, 'lrdf', uselib_store='LRDF',
+ atleast_version='0.4.0')
+ autowaf.check_pkg(conf, 'aubio', uselib_store='AUBIO',
+ atleast_version='0.3.2')
autowaf.check_pkg(conf, 'samplerate', uselib_store='SAMPLERATE',
atleast_version='0.1.0')
autowaf.check_pkg(conf, 'sigc++-2.0', uselib_store='SIGCPP',
atleast_version='2.0')
- if re.search ("linux", sys.platform) != None:
- autowaf.check_pkg(conf, 'alsa', uselib_store='ALSA')
-
if Options.options.lv2:
autowaf.check_pkg(conf, 'lv2', uselib_store='LV2',
atleast_version='1.0.0', mandatory=True)
@@ -288,10 +291,9 @@ def configure(conf):
autowaf.check_pkg(conf, 'libcurl', uselib_store='CURL',
atleast_version='7.0.0')
- # we don't try to detect this, since its part of our source tree
-
- conf.define('HAVE_RUBBERBAND', 1) # controls whether we think we have it
- conf.define('USE_RUBBERBAND', 1) # controls whether we actually use it
+ # controls whether we actually use it in preference to soundtouch
+ # Note: as of 2104, soundtouch (WSOLA) has been out-of-use for years.
+ conf.define('USE_RUBBERBAND', 1)
conf.define('CURRENT_SESSION_FILE_VERSION', CURRENT_SESSION_FILE_VERSION)
@@ -312,6 +314,11 @@ def configure(conf):
autowaf.check_header(conf, 'cxx', 'boost/weak_ptr.hpp')
autowaf.check_header(conf, 'cxx', 'boost/scoped_ptr.hpp')
autowaf.check_header(conf, 'cxx', 'boost/ptr_container/ptr_list.hpp')
+ if conf.env['WINDOWS_VST_SUPPORT'] == True and Options.options.dist_target == 'mingw':
+ conf.check(compiler='cxx',
+ lib='gdi32',
+ mandatory=True,
+ uselib_store='GDI32')
def build(bld):
@@ -319,40 +326,45 @@ def build(bld):
# major increment <=> incompatible changes
# minor increment <=> compatible changes (additions)
# micro increment <=> no interface changes
- LIBARDOUR_LIB_VERSION = "3.0.0."
+ LIBARDOUR_LIB_VERSION = "3.0.0"
# Library
if bld.is_defined ('INTERNAL_SHARED_LIBS'):
obj = bld.shlib(features = 'c cxx cshlib cxxshlib', source=libardour_sources)
+ # macros for this shared library
+ obj.defines = [ 'LIBARDOUR_DLL_EXPORTS=1' ]
else:
obj = bld.stlib(features = 'c cxx cstlib cxxstlib', source=libardour_sources)
obj.cxxflags = [ '-fPIC' ]
obj.cflags = [ '-fPIC' ]
+ obj.defines = []
obj.export_includes = ['.']
obj.includes = ['.', '../surfaces/control_protocol', '..']
- obj.name = 'ardour'
+ obj.name = 'libardour'
obj.target = 'ardour'
obj.uselib = ['GLIBMM','GTHREAD','AUBIO','SIGCPP','XML','UUID',
'SNDFILE','SAMPLERATE','LRDF','AUDIOUNITS',
- 'OSX','BOOST','CURL','DL']
- obj.use = ['libpbd','libmidipp','libevoral','libvampplugin',
- 'libaudiographer','libltc','libtimecode']
+ 'OSX','BOOST','CURL','TAGLIB','VAMPSDK','VAMPHOSTSDK','RUBBERBAND']
+ obj.use = ['libpbd','libmidipp','libevoral',
+ 'libaudiographer',
+ 'libtimecode',
+ ]
+ if bld.env['build_target'] != 'mingw':
+ obj.uselib += ['DL']
if bld.is_defined('USE_EXTERNAL_LIBS'):
- obj.uselib.extend(['RUBBERBAND', 'TAGLIB', 'LIBLTC', 'VAMPSDK',
- 'VAMPHOSTSDK'])
+ obj.uselib.extend(['VAMPSDK', 'LIBLTC'])
else:
- obj.use.extend(['libltc', 'librubberband', 'libtaglib', 'libvamphost'])
+ obj.use.extend(['librubberband', 'libltc_includes', 'libltc'])
obj.vnum = LIBARDOUR_LIB_VERSION
- obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3')
- obj.defines = [
+ obj.install_path = bld.env['LIBDIR']
+ obj.defines += [
'PACKAGE="' + I18N_PACKAGE + '"',
'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"',
'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
'LOCALEDIR="' + os.path.join(os.path.normpath(bld.env['DATADIR']), 'locale') + '"',
- 'PROGRAM_NAME="' + bld.env['PROGRAM_NAME'] + '"',
- 'EVORAL_MIDI_XML=1'
+ 'EVORAL_MIDI_XML=1',
]
#obj.source += ' st_stretch.cc st_pitch.cc '
@@ -360,7 +372,7 @@ def build(bld):
#obj.add_objects = 'default/libs/surfaces/control_protocol/smpte_1.o'
if bld.is_defined('HAVE_LILV') :
- obj.source += ['lv2_plugin.cc', 'lv2_evbuf.c', 'uri_map.cc']
+ obj.source += ['lv2_plugin.cc', 'lv2_evbuf.c', 'uri_map.cc']
obj.uselib += ['LILV']
if bld.is_defined('HAVE_SUIL'):
obj.uselib += ['SUIL']
@@ -369,13 +381,16 @@ def build(bld):
obj.source += [ 'windows_vst_plugin.cc']
obj.includes += [ '../fst' ]
obj.defines += [ 'WINDOWS_VST_SUPPORT' ]
+ if bld.env['build_target'] == 'mingw':
+ obj.source += [ '../fst/vstwin.c']
+ obj.uselib += ['GDI32']
if bld.is_defined('LXVST_SUPPORT'):
- obj.source += [ 'lxvst_plugin.cc', 'linux_vst_support.cc', 'linux_vst_info_file.cc' ]
+ obj.source += [ 'lxvst_plugin.cc', 'linux_vst_support.cc' ]
obj.defines += [ 'LXVST_SUPPORT' ]
if bld.is_defined('WINDOWS_VST_SUPPORT') or bld.is_defined('LXVST_SUPPORT'):
- obj.source += [ 'session_vst.cc', 'vst_plugin.cc' ]
+ obj.source += [ 'session_vst.cc', 'vst_plugin.cc', 'vst_info_file.cc' ]
if bld.is_defined('HAVE_COREAUDIO'):
obj.source += [ 'coreaudiosource.cc', 'caimportable.cc' ]
@@ -407,21 +422,18 @@ def build(bld):
testcommon.source = ['test/testrunner.cc', 'test/test_needing_session.cc',
'test/test_common.cc', 'test/dummy_lxvst.cc', 'test/audio_region_test.cc', 'test/test_util.cc']
testcommon.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD',
- 'SAMPLERATE','XML','LRDF','COREAUDIO']
+ 'SAMPLERATE','XML','LRDF','COREAUDIO','TAGLIB','VAMPSDK','VAMPHOSTSDK','RUBBERBAND']
testcommon.use = ['libpbd','libmidipp','libevoral',
- 'libvampplugin','libaudiographer','ardour']
+ 'libaudiographer','libardour']
if bld.is_defined('USE_EXTERNAL_LIBS'):
- testcommon.uselib.extend(['RUBBERBAND', 'TAGLIB', 'LIBLTC', 'VAMPSDK',
- 'VAMPHOSTSDK'])
+ testcommon.uselib.extend(['LIBLTC',])
else:
- testcommon.use.extend(['libltc', 'librubberband', 'libtaglib', 'libvamphost'])
+ testcommon.use.extend(['libltc', 'librubberband'])
testcommon.defines = [
'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"',
'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
'LOCALEDIR="' + os.path.join(
os.path.normpath(bld.env['DATADIR']), 'locale') + '"',
- 'VAMP_DIR="' + os.path.join(
- os.path.normpath(bld.env['LIBDIR']), 'ardour3', 'vamp') + '"'
]
testcommon.name = 'testcommon'
@@ -434,6 +446,7 @@ def build(bld):
testcommon.source += [ 'sse_functions_64bit.s' ]
if bld.env['SINGLE_TESTS']:
+ create_ardour_test_program(bld, obj.includes, 'audio_engine_test', 'test_audio_engine', ['test/audio_engine_test.cc'])
create_ardour_test_program(bld, obj.includes, 'automation_list_property_test', 'test_automation_list_property', ['test/automation_list_property_test.cc'])
create_ardour_test_program(bld, obj.includes, 'bbt', 'test_bbt', ['test/bbt_test.cc'])
create_ardour_test_program(bld, obj.includes, 'tempo', 'test_tempo', ['test/tempo_test.cc'])
@@ -445,12 +458,14 @@ def build(bld):
create_ardour_test_program(bld, obj.includes, 'framepos_minus_beats', 'test_framepos_minus_beats', ['test/framepos_minus_beats_test.cc'])
create_ardour_test_program(bld, obj.includes, 'playlist_equivalent_regions', 'test_playlist_equivalent_regions', ['test/playlist_equivalent_regions_test.cc'])
create_ardour_test_program(bld, obj.includes, 'playlist_layering', 'test_playlist_layering', ['test/playlist_layering_test.cc'])
+ create_ardour_test_program(bld, obj.includes, 'plugins_test', 'test_plugins', ['test/plugins_test.cc'])
create_ardour_test_program(bld, obj.includes, 'region_naming', 'test_region_naming', ['test/region_naming_test.cc'])
create_ardour_test_program(bld, obj.includes, 'control_surface', 'test_control_surfaces', ['test/control_surfaces_test.cc'])
create_ardour_test_program(bld, obj.includes, 'mtdm_test', 'test_mtdm', ['test/mtdm_test.cc'])
create_ardour_test_program(bld, obj.includes, 'session_test', 'test_session', ['test/session_test.cc'])
test_sources = '''
+ test/audio_engine_test.cc
test/automation_list_property_test.cc
test/bbt_test.cc
test/tempo_test.cc
@@ -462,6 +477,7 @@ def build(bld):
test/framepos_minus_beats_test.cc
test/playlist_equivalent_regions_test.cc
test/playlist_layering_test.cc
+ test/plugins_test.cc
test/region_naming_test.cc
test/control_surfaces_test.cc
test/mtdm_test.cc
@@ -488,7 +504,7 @@ def build(bld):
session_load_tester.includes.append ('test')
session_load_tester.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD',
'SAMPLERATE','XML','LRDF','COREAUDIO']
- session_load_tester.use = ['libpbd','libmidipp','ardour']
+ session_load_tester.use = ['libpbd','libmidipp','libardour']
session_load_tester.name = 'libardour-session-load-tester'
session_load_tester.target = 'load-session'
session_load_tester.install_path = ''
@@ -498,8 +514,6 @@ def build(bld):
'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
'LOCALEDIR="' + os.path.join(
os.path.normpath(bld.env['DATADIR']), 'locale') + '"',
- 'VAMP_DIR="' + os.path.join(
- os.path.normpath(bld.env['LIBDIR']), 'ardour3', 'vamp') + '"'
]
if bld.env['FPU_OPTIMIZATION']:
session_load_tester.source += [ 'sse_functions_xmm.cc' ]
@@ -523,7 +537,7 @@ def build(bld):
profilingobj.includes.append ('test')
profilingobj.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD',
'SAMPLERATE','XML','LRDF','COREAUDIO']
- profilingobj.use = ['libpbd','libmidipp','ardour']
+ profilingobj.use = ['libpbd','libmidipp','libardour']
profilingobj.name = 'libardour-profiling'
profilingobj.target = p
profilingobj.install_path = ''
@@ -533,8 +547,6 @@ def build(bld):
'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
'LOCALEDIR="' + os.path.join(
os.path.normpath(bld.env['DATADIR']), 'locale') + '"',
- 'VAMP_DIR="' + os.path.join(
- os.path.normpath(bld.env['LIBDIR']), 'ardour3', 'vamp') + '"'
]
if bld.env['FPU_OPTIMIZATION']:
profilingobj.source += [ 'sse_functions_xmm.cc' ]
@@ -549,28 +561,24 @@ def create_ardour_test_program(bld, includes, name, target, sources):
testobj.includes = includes + ['test', '../pbd', '..']
testobj.source = sources
testobj.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD',
- 'SAMPLERATE','XML','LRDF','COREAUDIO']
- testobj.use = ['libpbd','libmidipp','libevoral','libvampplugin',
- 'libaudiographer','ardour','testcommon']
+ 'SAMPLERATE','XML','LRDF','COREAUDIO','TAGLIB','VAMPSDK','VAMPHOSTSDK','RUBBERBAND']
+ testobj.use = ['libpbd','libmidipp','libevoral',
+ 'libaudiographer','libardour','testcommon']
if bld.is_defined('USE_EXTERNAL_LIBS'):
- testobj.uselib.extend(['RUBBERBAND', 'TAGLIB', 'LIBLTC', 'VAMPSDK',
- 'VAMPHOSTSDK'])
+ testobj.uselib.extend(['LIBLTC'])
else:
- testobj.use.extend(['libltc', 'librubberband', 'libtaglib',
- 'libvamphost'])
+ testobj.use.extend(['libltc'])
testobj.name = name
testobj.target = target
# not sure about install path
- testobj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3')
+ testobj.install_path = bld.env['LIBDIR']
testobj.defines = [
'PACKAGE="libardour3test"',
'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"',
'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
'LOCALEDIR="' + os.path.join(
os.path.normpath(bld.env['DATADIR']), 'locale') + '"',
- 'VAMP_DIR="' + os.path.join(
- os.path.normpath(bld.env['LIBDIR']), 'ardour3', 'vamp') + '"'
]
def shutdown():