pulling trunk

git-svn-id: svn://localhost/ardour2/branches/undo@586 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Hans Fugal 2006-06-14 18:37:57 +00:00
parent 3038d8ce4a
commit eb3f77df57
237 changed files with 68673 additions and 4051 deletions

View file

@ -36,8 +36,10 @@ opts.AddOptions(
BoolOption('FPU_OPTIMIZATION', 'Build runtime checked assembler code', 1),
BoolOption('FFT_ANALYSIS', 'Include FFT analysis window', 0),
BoolOption('SURFACES', 'Build support for control surfaces', 0),
BoolOption('DMALLOC', 'Compile and link using the dmalloc library', 0)
)
BoolOption('DMALLOC', 'Compile and link using the dmalloc library', 0),
BoolOption('LIBLO', 'Compile with support for liblo library', 1),
BoolOption('COREAUDIO', 'Compile with Apple\'s CoreAudio library -- UNSTABLE', 0)
)
#----------------------------------------------------------------------
# a handy helper that provides a way to merge compile/link information
@ -351,8 +353,8 @@ libraries = { }
libraries['core'] = LibraryInfo (CCFLAGS = '-Ilibs')
libraries['sndfile'] = LibraryInfo()
libraries['sndfile'].ParseConfig('pkg-config --cflags --libs sndfile')
#libraries['sndfile'] = LibraryInfo(CCFLAGS = '-Ilibs/libsndfile/src')
#libraries['sndfile'].ParseConfig('pkg-config --cflags --libs sndfile')
libraries['lrdf'] = LibraryInfo()
libraries['lrdf'].ParseConfig('pkg-config --cflags --libs lrdf')
@ -380,6 +382,7 @@ libraries['glib2'] = LibraryInfo()
libraries['glib2'].ParseConfig ('pkg-config --cflags --libs glib-2.0')
libraries['glib2'].ParseConfig ('pkg-config --cflags --libs gobject-2.0')
libraries['glib2'].ParseConfig ('pkg-config --cflags --libs gmodule-2.0')
libraries['glib2'].ParseConfig ('pkg-config --cflags --libs gthread-2.0')
libraries['gtk2'] = LibraryInfo()
libraries['gtk2'].ParseConfig ('pkg-config --cflags --libs gtk+-2.0')
@ -425,14 +428,15 @@ libraries['usb'] = conf.Finish ()
#
# Check for liblo
libraries['lo'] = LibraryInfo ()
if env['LIBLO']:
libraries['lo'] = LibraryInfo ()
conf = Configure (libraries['lo'])
if conf.CheckLib ('lo', 'lo_server_new') == False:
conf = Configure (libraries['lo'])
if conf.CheckLib ('lo', 'lo_server_new') == False:
print "liblo does not appear to be installed."
exit (0)
sys.exit (1)
libraries['lo'] = conf.Finish ()
libraries['lo'] = conf.Finish ()
#
# Check for dmalloc
@ -470,6 +474,9 @@ elif conf.CheckCHeader('/System/Library/Frameworks/CoreMIDI.framework/Headers/Co
env['SYSMIDI'] = 'CoreMIDI'
subst_dict['%MIDITAG%'] = "ardour"
subst_dict['%MIDITYPE%'] = "coremidi"
else:
print "It appears you don't have the required MIDI libraries installed."
sys.exit (1)
env = conf.Finish()
@ -539,6 +546,9 @@ else:
libraries['soundtouch'] = LibraryInfo(LIBS='soundtouch',
LIBPATH='#libs/soundtouch',
CPPPATH=['#libs', '#libs/soundtouch'])
libraries['sndfile'] = LibraryInfo(LIBS='libsndfile',
LIBPATH='#libs/libsndfile',
CPPPATH='#libs/libsndfile')
# libraries['libglademm'] = LibraryInfo(LIBS='libglademm',
# LIBPATH='#libs/libglademm',
# CPPPATH='#libs/libglademm')
@ -551,6 +561,7 @@ else:
subdirs = [
# 'libs/cassowary',
'libs/sigc++2',
'libs/libsndfile',
'libs/pbd3',
'libs/midi++2',
'libs/ardour'
@ -729,6 +740,12 @@ if env['FPU_OPTIMIZATION']:
print "\nWarning: you are building Ardour with SSE support even though your system does not support these instructions. (This may not be an error, especially if you are a package maintainer)"
# end optimization section
#
# save off guessed arch element in an env
#
env.Append(CONFIG_ARCH=config[config_arch])
#
# ARCH="..." overrides all
#
@ -757,6 +774,9 @@ env.Append(CCFLAGS="-Wall")
if env['VST']:
env.Append(CCFLAGS="-DVST_SUPPORT")
if env['LIBLO']:
env.Append(CCFLAGS="-DHAVE_LIBLO")
#
# everybody needs this
#

View file

@ -211,7 +211,7 @@ AnalysisWindow::analyze_data (Gtk::Button *button)
{
track_list_ready = false;
{
LockMonitor lm (track_list_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (track_list_lock);
// Empty track list & free old graphs
clear_tracklist();

View file

@ -34,7 +34,7 @@
#include <gtkmm2ext/dndtreeview.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include "ardour_dialog.h"
@ -106,7 +106,7 @@ class AnalysisWindow : public ArdourDialog
FFTGraph fft_graph;
bool track_list_ready;
PBD::Lock track_list_lock;
Glib::Mutex track_list_lock;
friend class FFTGraph;
};

View file

@ -33,7 +33,6 @@
#include <pbd/error.h>
#include <pbd/compose.h>
#include <pbd/basename.h>
#include <pbd/pathscanner.h>
#include <pbd/failed_constructor.h>
#include <gtkmm2ext/gtk_ui.h>
@ -210,22 +209,6 @@ ARDOUR_UI::set_engine (AudioEngine& e)
keyboard = new Keyboard;
string meter_path;
meter_path = ARDOUR::find_data_file("v_meter_strip.xpm", "pixmaps");
if (meter_path.empty()) {
error << _("no vertical meter strip image found") << endmsg;
exit (1);
}
FastMeter::set_vertical_xpm (meter_path);
meter_path = ARDOUR::find_data_file("h_meter_strip.xpm", "pixmaps");
if (meter_path.empty()) {
error << _("no horizontal meter strip image found") << endmsg;
exit (1);
}
FastMeter::set_horizontal_xpm (meter_path);
if (setup_windows ()) {
throw failed_constructor ();
}
@ -717,7 +700,7 @@ ARDOUR_UI::redisplay_recent_sessions ()
TreeModel::Row row = *(recent_session_model->append());
row[recent_session_columns.visible_name] = PBD::basename (fullpath);
row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
row[recent_session_columns.fullpath] = fullpath;
if (states->size() > 1) {
@ -824,9 +807,11 @@ ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
return false;
}
// XXX Portability
string session_file = info.filename;
session_file += '/';
session_file += PBD::basename (info.filename);
session_file += Glib::path_get_basename (info.filename);
session_file += ".ardour";
if (stat (session_file.c_str(), &statbuf) != 0) {

View file

@ -41,6 +41,7 @@ using namespace sigc;
using namespace Gtk;
using PBD::atoi;
using PBD::atof;
const uint32_t AudioClock::field_length[(int) AudioClock::AudioFrames+1] = {
2, /* SMPTE_Hours */

View file

@ -490,7 +490,7 @@ ConnectionEditor::display_ports ()
void
ConnectionEditor::display_connection_state (bool for_input)
{
LockMonitor lm (port_display_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (port_display_lock);
uint32_t limit;
if (session == 0 || current_connection == 0) {
@ -601,7 +601,7 @@ ConnectionEditor::add_port ()
void
ConnectionEditor::connection_port_button_press_event (GdkEventButton* ev, TreeView* tview)
{
LockMonitor lm (port_display_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (port_display_lock);
int which_port = reinterpret_cast<intptr_t> (treeview->get_data ("port"));

View file

@ -39,7 +39,7 @@ using __gnu_cxx::slist;
#include "ardour_dialog.h"
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
namespace ARDOUR {
class Session;
@ -116,7 +116,7 @@ class ConnectionEditor : public ArdourDialog {
Gtk::Button clear_button;
Gtk::Button add_port_button;
PBD::Lock port_display_lock;
Glib::Mutex port_display_lock;
slist<Gtk::ScrolledWindow *> port_displays;
Gtk::Button ok_button;

View file

@ -90,6 +90,7 @@ using namespace Gtkmm2ext;
using namespace Editing;
using PBD::internationalize;
using PBD::atoi;
const double Editor::timebar_height = 15.0;
@ -2191,7 +2192,7 @@ Editor::set_state (const XMLNode& node)
}
if ((prop = node.property ("zoom"))) {
set_frames_per_unit (atof (prop->value()));
set_frames_per_unit (PBD::atof (prop->value()));
}
if ((prop = node.property ("snap-to"))) {
@ -2899,7 +2900,7 @@ Editor::convert_drop_to_paths (vector<ustring>& paths,
for (vector<ustring>::iterator i = uris.begin(); i != uris.end(); ++i) {
if ((*i).substr (0,7) == "file://") {
string p = *i;
url_decode (p);
PBD::url_decode (p);
paths.push_back (p.substr (7));
}
}

View file

@ -203,7 +203,7 @@ Editor::embed_sndfile (Glib::ustring path, bool split, bool multiple_files, bool
/* lets see if we can link it into the session */
linked_path = session->sound_dir();
linked_path += PBD::basename (path);
linked_path += Glib::path_get_basename (path);
if (link (path.c_str(), linked_path.c_str()) == 0) {

View file

@ -27,7 +27,6 @@
#include <samplerate.h>
#include <pbd/convert.h>
#include <pbd/dirname.h>
#include <pbd/xml++.h>
#include <gtkmm2ext/utils.h>
@ -1154,7 +1153,7 @@ ExportDialog::is_filepath_valid(string &filepath)
// directory needs to exist and be writable
string dirpath = PBD::dirname (filepath);
string dirpath = Glib::path_get_dirname (filepath);
if (::access (dirpath.c_str(), W_OK) != 0) {
string txt = _("Cannot write file in: ") + dirpath;
MessageDialog msg (*this, txt, false, MESSAGE_ERROR, BUTTONS_OK, true);

View file

@ -25,8 +25,6 @@
#include <ardour/audioengine.h>
#include <ardour/sndfile_helpers.h>
#include <pbd/dirname.h>
#include "ardour_ui.h"
#include "export_range_markers_dialog.h"
@ -149,7 +147,7 @@ ExportRangeMarkersDialog::is_filepath_valid(string &filepath)
}
// directory needs to exist and be writable
string dirpath = PBD::dirname (filepath);
string dirpath = Glib::path_get_dirname (filepath);
if (::access (dirpath.c_str(), W_OK) != 0) {
string txt = _("Cannot write file in: ") + dirpath;
MessageDialog msg (*this, txt, false, MESSAGE_ERROR, BUTTONS_OK, true);

View file

@ -58,7 +58,7 @@ void
FFTGraph::setWindowSize(int windowSize)
{
if (_a_window) {
LockMonitor lm (_a_window->track_list_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_a_window->track_list_lock);
setWindowSize_internal(windowSize);
} else {
setWindowSize_internal(windowSize);
@ -261,7 +261,7 @@ FFTGraph::draw_scales(Glib::RefPtr<Gdk::Window> window)
void
FFTGraph::redraw()
{
LockMonitor lm (_a_window->track_list_lock, __LINE__, __FILE__ );
Glib::Mutex::Lock lm (_a_window->track_list_lock);
draw_scales(get_window());

View file

@ -133,7 +133,6 @@ gtk_custom_hruler_draw_ticks (GtkCustomRuler * ruler)
{
GtkWidget *widget;
GdkGC *gc, *bg_gc;
GdkFont *font;
gint i;
GtkCustomRulerMark *marks;
gint xthickness;
@ -154,7 +153,6 @@ gtk_custom_hruler_draw_ticks (GtkCustomRuler * ruler)
gc = widget->style->fg_gc[GTK_STATE_NORMAL];
bg_gc = widget->style->bg_gc[GTK_STATE_NORMAL];
font = gtk_style_get_font(widget->style);
layout = gtk_widget_create_pango_layout (widget, "012456789");
pango_layout_get_extents (layout, &ink_rect, &logical_rect);

View file

@ -23,7 +23,7 @@
#include <gtkmm/messagedialog.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <ardour/io.h>
#include <ardour/route.h>
@ -368,7 +368,7 @@ IOSelector::display_ports ()
TreeView *selected_port_tview = 0;
{
LockMonitor lm (port_display_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (port_display_lock);
Port *port;
uint32_t limit;
@ -670,7 +670,7 @@ IOSelector::port_column_button_release (GdkEventButton* event, TreeView* treevie
if (Keyboard::is_delete_event (event)) {
Port* port;
{
LockMonitor lm (port_display_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (port_display_lock);
port = static_cast<Port *> (treeview->get_data (_("port")));
@ -724,7 +724,7 @@ IOSelector::select_treeview (TreeView* tview)
switch.
*/
LockMonitor lm (port_display_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (port_display_lock);
Port* port = reinterpret_cast<Port *> (tview->get_data (_("port")));
if (port != selected_port) {

View file

@ -29,6 +29,9 @@ using __gnu_cxx::slist;
#endif
#include <string>
#include <glibmm/thread.h>
#include <gtkmm/box.h>
#include <gtkmm/frame.h>
#include <gtkmm/button.h>
@ -39,6 +42,7 @@ using __gnu_cxx::slist;
#include <ardour_dialog.h>
namespace ARDOUR {
class IO;
class Session;
@ -105,7 +109,7 @@ class IOSelector : public Gtk::VBox {
Gtk::Button clear_connections_button;
Gtk::ScrolledWindow port_display_scroller;
PBD::Lock port_display_lock;
Glib::Mutex port_display_lock;
slist<Gtk::TreeView *> port_displays;
void display_ports ();

View file

@ -367,6 +367,9 @@ main (int argc, char *argv[])
ARDOUR::AudioEngine *engine;
vector<Glib::ustring> null_file_list;
// needs a better home.
Glib::thread_init();
gtk_set_locale ();
(void) bindtextdomain (PACKAGE, LOCALEDIR);

View file

@ -24,7 +24,7 @@
#include <gtkmm/accelmap.h>
#include <pbd/convert.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <gtkmm2ext/gtk_ui.h>
#include <gtkmm2ext/utils.h>

View file

@ -24,8 +24,6 @@
#include <ardour/recent_sessions.h>
#include <ardour/session.h>
#include <pbd/basename.h>
#include <gtkmm/entry.h>
#include <gtkmm/filechooserbutton.h>
#include <gtkmm/spinbutton.h>
@ -659,7 +657,7 @@ NewSessionDialog::reset_recent()
Gtk::TreeModel::Row row = *(recent_model->append());
row[recent_columns.visible_name] = PBD::basename (fullpath);
row[recent_columns.visible_name] = Glib::path_get_basename (fullpath);
row[recent_columns.fullpath] = fullpath;
if (states->size() > 1) {

View file

@ -1,195 +0,0 @@
/* XPM */
static const gchar *h_meter_strip_xpm[] = {
"186 5 187 2",
" c None",
". c #2BFE00",
"+ c #2DFE00",
"@ c #2FFE01",
"# c #32FE01",
"$ c #34FE02",
"% c #36FE02",
"& c #38FE03",
"* c #3BFE03",
"= c #3DFD04",
"- c #3FFD04",
"; c #41FD05",
"> c #44FD05",
", c #46FD06",
"' c #48FD06",
") c #4AFD07",
"! c #4DFD07",
"~ c #4FFD08",
"{ c #51FC08",
"] c #53FC09",
"^ c #56FC09",
"/ c #58FC09",
"( c #5AFC0A",
"_ c #5CFC0A",
": c #5FFC0B",
"< c #61FC0B",
"[ c #63FB0C",
"} c #65FB0C",
"| c #68FB0D",
"1 c #6AFB0D",
"2 c #6CFB0E",
"3 c #6EFB0E",
"4 c #71FB0F",
"5 c #73FB0F",
"6 c #75FB10",
"7 c #77FA10",
"8 c #7AFA11",
"9 c #7CFA11",
"0 c #7EFA12",
"a c #80FA12",
"b c #83FA12",
"c c #85FA13",
"d c #87FA13",
"e c #89FA14",
"f c #8CF914",
"g c #8EF915",
"h c #90F915",
"i c #92F916",
"j c #95F916",
"k c #97F917",
"l c #99F917",
"m c #9BF918",
"n c #9EF818",
"o c #A0F819",
"p c #A2F819",
"q c #A4F81A",
"r c #A7F81A",
"s c #A9F81A",
"t c #ABF81B",
"u c #ADF81B",
"v c #B0F81C",
"w c #B2F71C",
"x c #B4F71D",
"y c #B6F71D",
"z c #B9F71E",
"A c #BBF71E",
"B c #BDF71F",
"C c #BFF71F",
"D c #C2F720",
"E c #C4F720",
"F c #C6F621",
"G c #C8F621",
"H c #CBF622",
"I c #CDF622",
"J c #CFF623",
"K c #D1F623",
"L c #D4F624",
"M c #D6F624",
"N c #D8F524",
"O c #DAF525",
"P c #DDF525",
"Q c #DFF526",
"R c #E1F526",
"S c #E3F527",
"T c #E6F527",
"U c #E8F528",
"V c #EAF528",
"W c #ECF429",
"X c #EFF429",
"Y c #F1F42A",
"Z c #F3F42A",
"` c #F5F42B",
" . c #F8F42B",
".. c #FAF42C",
"+. c #FCF42C",
"@. c #FFF42D",
"#. c #FFF22C",
"$. c #FFF12B",
"%. c #FFF02A",
"&. c #FFEF2A",
"*. c #FFEE29",
"=. c #FFED28",
"-. c #FFEC28",
";. c #FFEB27",
">. c #FFE926",
",. c #FFE826",
"'. c #FFE725",
"). c #FFE624",
"!. c #FFE524",
"~. c #FFE423",
"{. c #FFE322",
"]. c #FFE222",
"^. c #FFE021",
"/. c #FFDF20",
"(. c #FFDE20",
"_. c #FFDD1F",
":. c #FFDC1E",
"<. c #FFDB1E",
"[. c #FFDA1D",
"}. c #FFD91C",
"|. c #FFD71B",
"1. c #FFD61B",
"2. c #FFD51A",
"3. c #FFD419",
"4. c #FFD319",
"5. c #FFD218",
"6. c #FFD117",
"7. c #FFD017",
"8. c #FFCF16",
"9. c #FFCD15",
"0. c #FFCC15",
"a. c #FFCB14",
"b. c #FFCA13",
"c. c #FFC913",
"d. c #FFC812",
"e. c #FFC711",
"f. c #FFC611",
"g. c #FFC410",
"h. c #FFC30F",
"i. c #FFC20F",
"j. c #FFC10E",
"k. c #FFC00D",
"l. c #FFBF0C",
"m. c #FFBE0C",
"n. c #FFBD0B",
"o. c #FFBB0A",
"p. c #FFBA0A",
"q. c #FFB909",
"r. c #FFB808",
"s. c #FFB708",
"t. c #FFB607",
"u. c #FFB506",
"v. c #FFB406",
"w. c #FFB205",
"x. c #FFB104",
"y. c #FFB004",
"z. c #FFAF03",
"A. c #FFAE02",
"B. c #FFAD02",
"C. c #FFAC01",
"D. c #FFAB00",
"E. c #FFA900",
"F. c #F11F00",
"G. c #F21E00",
"H. c #F21C00",
"I. c #F31B00",
"J. c #F31A00",
"K. c #F41800",
"L. c #F41700",
"M. c #F51600",
"N. c #F61400",
"O. c #F61300",
"P. c #F71100",
"Q. c #F71000",
"R. c #F80F00",
"S. c #F90D00",
"T. c #F90C00",
"U. c #FA0B00",
"V. c #FA0900",
"W. c #FB0800",
"X. c #FC0600",
"Y. c #FC0500",
"Z. c #FD0400",
"`. c #FD0200",
" + c #FE0100",
".+ c #FE0000",
"++ c #FF0000",
". + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ` ...+.@.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +.+",
". + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ` ...+.@.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +.+",
". + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ` ...+.@.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +++",
". + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ` ...+.@.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +++",
". + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ` ...+.@.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +++"};

View file

@ -1,483 +0,0 @@
/* XPM */
static const gchar * v_meter_strip_xpm[] = {
"5 250 230 2",
" c None",
". c #FE0000",
"+ c #FF0000",
"@ c #FE0100",
"# c #FD0200",
"$ c #FD0300",
"% c #FD0400",
"& c #FC0500",
"* c #FC0600",
"= c #FC0700",
"- c #FB0800",
"; c #FA0900",
"> c #FA0A00",
", c #FA0B00",
"' c #F90C00",
") c #F90D00",
"! c #F80E00",
"~ c #F80F00",
"{ c #F71000",
"] c #F71100",
"^ c #F61200",
"/ c #F61300",
"( c #F61400",
"_ c #F51600",
": c #F41700",
"< c #F41800",
"[ c #F31A00",
"} c #F31B00",
"| c #F21C00",
"1 c #F21E00",
"2 c #F11F00",
"3 c #F54A00",
"4 c #FFA900",
"5 c #FFAB00",
"6 c #FFAC01",
"7 c #FFAD02",
"8 c #FFAE02",
"9 c #FFAF03",
"0 c #FFB004",
"a c #FFB104",
"b c #FFB205",
"c c #FFB406",
"d c #FFB506",
"e c #FFB607",
"f c #FFB708",
"g c #FFB808",
"h c #FFB909",
"i c #FFBA0A",
"j c #FFBB0A",
"k c #FFBC0A",
"l c #FFBD0B",
"m c #FFBE0C",
"n c #FFBF0C",
"o c #FFC00D",
"p c #FFC10E",
"q c #FFC20F",
"r c #FFC30F",
"s c #FFC410",
"t c #FFC511",
"u c #FFC611",
"v c #FFC711",
"w c #FFC812",
"x c #FFC913",
"y c #FFCA13",
"z c #FFCB14",
"A c #FFCC15",
"B c #FFCD15",
"C c #FFCF16",
"D c #FFD017",
"E c #FFD117",
"F c #FFD218",
"G c #FFD319",
"H c #FFD419",
"I c #FFD51A",
"J c #FFD61B",
"K c #FFD71B",
"L c #FFD81C",
"M c #FFD91C",
"N c #FFDA1D",
"O c #FFDB1E",
"P c #FFDC1E",
"Q c #FFDD1F",
"R c #FFDE20",
"S c #FFDF20",
"T c #FFE021",
"U c #FFE222",
"V c #FFE322",
"W c #FFE423",
"X c #FFE524",
"Y c #FFE624",
"Z c #FFE725",
"` c #FFE826",
" . c #FFE926",
".. c #FFEA26",
"+. c #FFEB27",
"@. c #FFEC28",
"#. c #FFED28",
"$. c #FFEE29",
"%. c #FFEF2A",
"&. c #FFF02A",
"*. c #FFF12B",
"=. c #FFF22C",
"-. c #FFF32D",
";. c #FFF42D",
">. c #FDF42C",
",. c #FBF42C",
"'. c #FAF42C",
"). c #F8F42B",
"!. c #F6F42B",
"~. c #F4F42B",
"{. c #F3F42A",
"]. c #F1F42A",
"^. c #F0F429",
"/. c #EEF429",
"(. c #ECF429",
"_. c #EAF528",
":. c #E9F528",
"<. c #E7F528",
"[. c #E5F527",
"}. c #E3F527",
"|. c #E2F526",
"1. c #E0F526",
"2. c #DFF526",
"3. c #DDF525",
"4. c #DBF525",
"5. c #D9F525",
"6. c #D8F524",
"7. c #D6F624",
"8. c #D5F624",
"9. c #D3F624",
"0. c #D1F623",
"a. c #CFF623",
"b. c #CEF622",
"c. c #CCF622",
"d. c #CBF622",
"e. c #C9F621",
"f. c #C7F621",
"g. c #C5F621",
"h. c #C4F720",
"i. c #C2F720",
"j. c #C0F71F",
"k. c #BEF71F",
"l. c #BDF71F",
"m. c #BBF71E",
"n. c #BAF71E",
"o. c #B8F71E",
"p. c #B6F71D",
"q. c #B5F71D",
"r. c #B3F71D",
"s. c #B2F71C",
"t. c #B0F81C",
"u. c #AEF81B",
"v. c #ACF81B",
"w. c #ABF81B",
"x. c #A9F81A",
"y. c #A8F81A",
"z. c #A6F81A",
"A. c #A4F81A",
"B. c #A2F819",
"C. c #A1F819",
"D. c #9FF819",
"E. c #9EF818",
"F. c #9BF918",
"G. c #9AF917",
"H. c #98F917",
"I. c #97F917",
"J. c #95F916",
"K. c #93F916",
"L. c #91F916",
"M. c #90F915",
"N. c #8EF915",
"O. c #8DF914",
"P. c #8BF914",
"Q. c #89FA14",
"R. c #87FA13",
"S. c #86FA13",
"T. c #84FA13",
"U. c #83FA12",
"V. c #81FA12",
"W. c #7FFA12",
"X. c #7DFA12",
"Y. c #7CFA11",
"Z. c #7AFA11",
"`. c #78FA10",
" + c #76FA10",
".+ c #75FB10",
"++ c #73FB0F",
"@+ c #72FB0F",
"#+ c #70FB0F",
"$+ c #6EFB0E",
"%+ c #6DFB0E",
"&+ c #6BFB0E",
"*+ c #6AFB0D",
"=+ c #68FB0D",
"-+ c #66FB0C",
";+ c #64FB0C",
">+ c #63FB0C",
",+ c #61FC0B",
"'+ c #60FC0B",
")+ c #5EFC0B",
"!+ c #5CFC0A",
"~+ c #5AFC0A",
"{+ c #59FC09",
"]+ c #57FC09",
"^+ c #56FC09",
"/+ c #53FC09",
"(+ c #52FC08",
"_+ c #50FC08",
":+ c #4FFD08",
"<+ c #4DFD07",
"[+ c #4BFD07",
"}+ c #49FD07",
"|+ c #48FD06",
"1+ c #46FD06",
"2+ c #45FD05",
"3+ c #43FD05",
"4+ c #41FD05",
"5+ c #3FFD04",
"6+ c #3EFD04",
"7+ c #3CFD04",
"8+ c #3BFE03",
"9+ c #39FE03",
"0+ c #37FE02",
"a+ c #35FE02",
"b+ c #34FE02",
"c+ c #32FE01",
"d+ c #30FE01",
"e+ c #2EFE01",
"f+ c #2DFE00",
"g+ c #2BFE00",
". . + + + ",
". . + + + ",
"@ @ @ @ @ ",
"# # # # # ",
"$ $ $ $ $ ",
"% % % % % ",
"& & & & & ",
"* * * * * ",
"= = = = = ",
"- - - - - ",
"; ; ; ; ; ",
"> > > > > ",
", , , , , ",
"' ' ' ' ' ",
") ) ) ) ) ",
"! ! ! ! ! ",
"~ ~ ~ ~ ~ ",
"{ { { { { ",
"] ] ] ] ] ",
"^ ^ ^ ^ ^ ",
"/ / / / / ",
"( ( ( ( ( ",
"_ _ _ _ _ ",
": : : : : ",
": : : : : ",
"< < < < < ",
"[ [ [ [ [ ",
"} } } } } ",
"} } } } } ",
"| | | | | ",
"1 1 1 1 1 ",
"2 2 2 2 2 ",
"3 3 3 3 3 ",
"4 4 4 4 4 ",
"5 5 5 5 5 ",
"6 6 6 6 6 ",
"6 6 6 6 6 ",
"7 7 7 7 7 ",
"8 8 8 8 8 ",
"9 9 9 9 9 ",
"9 9 9 9 9 ",
"0 0 0 0 0 ",
"a a a a a ",
"a a a a a ",
"b b b b b ",
"c c c c c ",
"d d d d d ",
"d d d d d ",
"e e e e e ",
"f f f f f ",
"g g g g g ",
"g g g g g ",
"h h h h h ",
"i i i i i ",
"j j j j j ",
"k k k k k ",
"l l l l l ",
"m m m m m ",
"n n n n n ",
"n n n n n ",
"o o o o o ",
"p p p p p ",
"q q q q q ",
"q q q q q ",
"r r r r r ",
"s s s s s ",
"t t t t t ",
"u u u u u ",
"v v v v v ",
"w w w w w ",
"x x x x x ",
"x x x x x ",
"y y y y y ",
"z z z z z ",
"A A A A A ",
"A A A A A ",
"B B B B B ",
"C C C C C ",
"D D D D D ",
"D D D D D ",
"E E E E E ",
"F F F F F ",
"G G G G G ",
"G G G G G ",
"H H H H H ",
"I I I I I ",
"I I I I I ",
"J J J J J ",
"K K K K K ",
"L L L L L ",
"M M M M M ",
"N N N N N ",
"O O O O O ",
"P P P P P ",
"P P P P P ",
"Q Q Q Q Q ",
"R R R R R ",
"S S S S S ",
"S S S S S ",
"T T T T T ",
"U U U U U ",
"V V V V V ",
"V V V V V ",
"W W W W W ",
"X X X X X ",
"Y Y Y Y Y ",
"Y Y Y Y Y ",
"Z Z Z Z Z ",
"` ` ` ` ` ",
" . . . . .",
"..........",
"+.+.+.+.+.",
"@.@.@.@.@.",
"#.#.#.#.#.",
"#.#.#.#.#.",
"$.$.$.$.$.",
"%.%.%.%.%.",
"&.&.&.&.&.",
"&.&.&.&.&.",
"*.*.*.*.*.",
"=.=.=.=.=.",
"-.-.-.-.-.",
";.;.;.;.;.",
";.;.;.;.;.",
">.>.>.>.>.",
",.,.,.,.,.",
"'.'.'.'.'.",
").).).).).",
"!.!.!.!.!.",
"~.~.~.~.~.",
"{.{.{.{.{.",
"].].].].].",
"^.^.^.^.^.",
"/././././.",
"(.(.(.(.(.",
"_._._._._.",
":.:.:.:.:.",
"<.<.<.<.<.",
"[.[.[.[.[.",
"}.}.}.}.}.",
"|.|.|.|.|.",
"1.1.1.1.1.",
"2.2.2.2.2.",
"3.3.3.3.3.",
"4.4.4.4.4.",
"5.5.5.5.5.",
"6.6.6.6.6.",
"7.7.7.7.7.",
"8.8.8.8.8.",
"9.9.9.9.9.",
"0.0.0.0.0.",
"a.a.a.a.a.",
"b.b.b.b.b.",
"c.c.c.c.c.",
"d.d.d.d.d.",
"e.e.e.e.e.",
"f.f.f.f.f.",
"g.g.g.g.g.",
"h.h.h.h.h.",
"i.i.i.i.i.",
"j.j.j.j.j.",
"k.k.k.k.k.",
"l.l.l.l.l.",
"m.m.m.m.m.",
"n.n.n.n.n.",
"o.o.o.o.o.",
"p.p.p.p.p.",
"q.q.q.q.q.",
"r.r.r.r.r.",
"s.s.s.s.s.",
"t.t.t.t.t.",
"u.u.u.u.u.",
"v.v.v.v.v.",
"w.w.w.w.w.",
"x.x.x.x.x.",
"y.y.y.y.y.",
"z.z.z.z.z.",
"A.A.A.A.A.",
"B.B.B.B.B.",
"C.C.C.C.C.",
"D.D.D.D.D.",
"E.E.E.E.E.",
"F.F.F.F.F.",
"G.G.G.G.G.",
"H.H.H.H.H.",
"I.I.I.I.I.",
"J.J.J.J.J.",
"K.K.K.K.K.",
"L.L.L.L.L.",
"M.M.M.M.M.",
"N.N.N.N.N.",
"O.O.O.O.O.",
"P.P.P.P.P.",
"Q.Q.Q.Q.Q.",
"R.R.R.R.R.",
"S.S.S.S.S.",
"T.T.T.T.T.",
"U.U.U.U.U.",
"V.V.V.V.V.",
"W.W.W.W.W.",
"X.X.X.X.X.",
"Y.Y.Y.Y.Y.",
"Z.Z.Z.Z.Z.",
"`.`.`.`.`.",
" + + + + +",
".+.+.+.+.+",
"++++++++++",
"@+@+@+@+@+",
"#+#+#+#+#+",
"$+$+$+$+$+",
"%+%+%+%+%+",
"&+&+&+&+&+",
"*+*+*+*+*+",
"=+=+=+=+=+",
"-+-+-+-+-+",
";+;+;+;+;+",
">+>+>+>+>+",
",+,+,+,+,+",
"'+'+'+'+'+",
")+)+)+)+)+",
"!+!+!+!+!+",
"~+~+~+~+~+",
"{+{+{+{+{+",
"]+]+]+]+]+",
"^+^+^+^+^+",
"/+/+/+/+/+",
"(+(+(+(+(+",
"_+_+_+_+_+",
":+:+:+:+:+",
"<+<+<+<+<+",
"[+[+[+[+[+",
"}+}+}+}+}+",
"|+|+|+|+|+",
"1+1+1+1+1+",
"2+2+2+2+2+",
"3+3+3+3+3+",
"4+4+4+4+4+",
"5+5+5+5+5+",
"6+6+6+6+6+",
"7+7+7+7+7+",
"8+8+8+8+8+",
"9+9+9+9+9+",
"0+0+0+0+0+",
"a+a+a+a+a+",
"b+b+b+b+b+",
"c+c+c+c+c+",
"d+d+d+d+d+",
"e+e+e+e+e+",
"f+f+f+f+f+",
"g+g+g+g+g+"};

View file

@ -20,7 +20,7 @@
#include <algorithm>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <gtkmm2ext/utils.h>
#include <gtkmm2ext/stop_signal.h>

View file

@ -25,7 +25,6 @@
#include <gtkmm/box.h>
#include <gtkmm/stock.h>
#include <pbd/basename.h>
#include <pbd/convert.h>
#include <gtkmm2ext/utils.h>
@ -206,7 +205,7 @@ SoundFileBox::play_btn_clicked ()
}
string result;
_session->region_name (result, PBD::basename(srclist[0]->name()), false);
_session->region_name (result, Glib::path_get_basename(srclist[0]->name()), false);
AudioRegion* a_region = new AudioRegion(srclist, 0, srclist[0]->length(), result, 0, Region::DefaultFlags, false);
region_cache[path] = a_region;
}

View file

@ -58,7 +58,6 @@ ladspa_plugin.cc
location.cc
mtc_slave.cc
named_selection.cc
osc.cc
panner.cc
pcm_utils.cc
playlist.cc
@ -97,6 +96,7 @@ mix.cc
arch_specific_objects = [ ]
osc_files = [ 'osc.cc' ]
vst_files = [ 'vst_plugin.cc', 'session_vst.cc' ]
coreaudio_files = [ 'coreaudio_source.cc' ]
extra_sources = [ ]
@ -104,6 +104,9 @@ extra_sources = [ ]
if ardour['VST']:
extra_sources += vst_files
if ardour['LIBLO']:
extra_sources += osc_files
ardour.Append(CCFLAGS="-D_REENTRANT -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE")
ardour.Append(CXXFLAGS="-DDATA_DIR=\\\""+final_prefix+"/share\\\"")
ardour.Append(CXXFLAGS="-DMODULE_DIR=\\\""+final_prefix+"/lib\\\"")
@ -172,13 +175,16 @@ if conf.CheckCHeader('sys/vfs.h'):
if conf.CheckCHeader('/System/Library/Frameworks/CoreMIDI.framework/Headers/CoreMIDI.h'):
ardour.Append(LINKFLAGS="-framework CoreMIDI")
if conf.CheckCHeader('/System/Library/Frameworks/AudioToolbox.framework/Headers/ExtendedAudioFile.h'):
if conf.CheckCHeader('/System/Library/Frameworks/AudioToolbox.framework/Headers/ExtendedAudioFile.h') and ardour['COREAUDIO'] == 1:
ardour.Append(CXXFLAGS="-DHAVE_COREAUDIO")
ardour.Append(LINKFLAGS="-framework AudioToolbox")
#
if env['CONFIG_ARCH'] == 'apple':
# this next line avoids issues with circular dependencies between libardour and libardour_cp.
# it is based on the (entirely reasonable) assumption that a system with CoreAudio is OS X
#
print 'APPLE CONFIG'
ardour.Append(LINKFLAGS='-undefined suppress -flat_namespace')
extra_sources += coreaudio_files
@ -188,15 +194,19 @@ ardour.Merge ([
libraries['core'],
libraries['xml'],
libraries['sndfile'],
libraries['raptor'],
libraries['lrdf'],
libraries['samplerate'],
libraries['sigc2'],
libraries['pbd3'],
libraries['soundtouch'],
libraries['midi++2'],
libraries['lo'],
libraries['glib2'],
libraries['glibmm2']
])
if ardour['LIBLO']:
ardour.Merge ([ libraries['lo'] ])
ardour.VersionBuild(['version.cc', 'ardour/version.h'], 'SConscript')

View file

@ -26,14 +26,11 @@
#include <signal.h>
#include <pbd/error.h>
#include <pbd/lockmonitor.h>
#include <pbd/failed_constructor.h>
#include <ardour/configuration.h>
#include <ardour/types.h>
using namespace PBD;
namespace MIDI {
class MachineControl;
class Port;

View file

@ -28,7 +28,9 @@
#include <string>
#include <sigc++/signal.h>
#include <pthread.h>
#include <glibmm/thread.h>
#include <ardour/ardour.h>
#include <jack/jack.h>
#include <jack/transport.h>
@ -59,7 +61,7 @@ class AudioEngine : public sigc::trackable
int start ();
bool running() const { return _running; }
PBD::NonBlockingLock& process_lock() { return _process_lock; }
Glib::Mutex& process_lock() { return _process_lock; }
jack_nframes_t frame_rate();
jack_nframes_t frames_per_cycle();
@ -185,10 +187,10 @@ class AudioEngine : public sigc::trackable
ARDOUR::Session *session;
jack_client_t *_jack;
std::string jack_client_name;
PBD::NonBlockingLock port_lock;
PBD::NonBlockingLock _process_lock;
PBD::Lock session_remove_lock;
pthread_cond_t session_removed;
Glib::Mutex port_lock;
Glib::Mutex _process_lock;
Glib::Mutex session_remove_lock;
Glib::Cond session_removed;
bool session_remove_pending;
bool _running;
bool _has_run;
@ -202,8 +204,6 @@ class AudioEngine : public sigc::trackable
sigc::slot<int,jack_nframes_t> freewheel_action;
bool reconnect_on_halt;
int _usecs_per_cycle;
jack_nframes_t last_meter_point;
jack_nframes_t meter_interval;
typedef std::set<Port*> Ports;
Ports ports;
@ -237,10 +237,10 @@ class AudioEngine : public sigc::trackable
int connect_to_jack (std::string client_name);
static void* _meter_thread (void* arg);
void* meter_thread ();
pthread_t meter_thread_id;
void maybe_start_metering_thread ();
void meter_thread ();
void start_metering_thread ();
Glib::Thread* m_meter_thread;
mutable gint m_meter_exit;
};
}; /* namespace ARDOUR */

View file

@ -22,10 +22,8 @@
#define __ardour_auditioner_h__
#include <string>
#include <pthread.h>
#include <pbd/lockmonitor.h>
#include <pbd/atomic.h>
#include <glibmm/thread.h>
#include <ardour/ardour.h>
#include <ardour/audio_track.h>
@ -50,16 +48,16 @@ class Auditioner : public AudioTrack
int play_audition (jack_nframes_t nframes);
void cancel_audition () {
atomic_set (&_active, 0);
g_atomic_int_set (&_active, 0);
}
bool active() const { return atomic_read (&_active); }
bool active() const { return g_atomic_int_get (&_active); }
private:
AudioRegion *the_region;
jack_nframes_t current_frame;
atomic_t _active;
PBD::Lock lock;
mutable gint _active;
Glib::Mutex lock;
jack_nframes_t length;
void drop_ports ();

View file

@ -26,7 +26,7 @@
#include <cmath>
#include <sigc++/signal.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <pbd/undo.h>
#include <pbd/xml++.h>
#include <ardour/ardour.h>
@ -144,7 +144,7 @@ class AutomationList : public StateManager
std::pair<AutomationList::iterator,AutomationList::iterator> control_points_adjacent (double when);
template<class T> void apply_to_points (T& obj, void (T::*method)(const AutomationList&)) {
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
(obj.*method)(*this);
}
@ -157,13 +157,13 @@ class AutomationList : public StateManager
double get_max_xval() const { return max_xval; }
double eval (double where) {
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
return unlocked_eval (where);
}
double rt_safe_eval (double where, bool& ok) {
TentativeLockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock, Glib::TRY_LOCK);
if ((ok = lm.locked())) {
return unlocked_eval (where);
@ -186,7 +186,7 @@ class AutomationList : public StateManager
};
AutomationEventList events;
mutable PBD::NonBlockingLock lock;
mutable Glib::Mutex lock;
bool _frozen;
bool changed_when_thawed;
bool _dirty;

View file

@ -24,7 +24,7 @@
#include <vector>
#include <string>
#include <sigc++/signal.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <ardour/stateful.h>
using std::vector;
@ -67,7 +67,7 @@ class Connection : public Stateful, public sigc::trackable {
Connection (const XMLNode&);
private:
mutable PBD::Lock port_lock;
mutable Glib::Mutex port_lock;
vector<PortList> _ports;
string _name;
bool _sysdep;

View file

@ -6,7 +6,7 @@
#include <sigc++/sigc++.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <ardour/stateful.h>
@ -52,7 +52,7 @@ struct ControlProtocolInfo {
static ControlProtocolManager* _instance;
Session* _session;
PBD::Lock protocols_lock;
Glib::Mutex protocols_lock;
std::list<ControlProtocol*> control_protocols;
void drop_session ();

View file

@ -40,7 +40,7 @@ class CoreAudioSource : public ExternalSource {
mutable float *tmpbuf;
mutable jack_nframes_t tmpbufsize;
mutable PBD::Lock _tmpbuf_lock;
mutable Glib::Mutex _tmpbuf_lock;
void init (const string &str, bool build_peak);
};

View file

@ -23,11 +23,10 @@
#include <sys/types.h>
#include <sigc++/signal.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <pbd/undo.h>
#include <list>
#include <algorithm>
#include <pthread.h>
#include <ardour/automation_event.h>
namespace ARDOUR {

View file

@ -33,7 +33,7 @@
#include <pbd/fastlog.h>
#include <pbd/ringbufferNPT.h>
#include <pbd/atomic.h>
#include <ardour/ardour.h>
#include <ardour/configuration.h>
@ -115,7 +115,7 @@ class DiskStream : public Stateful, public sigc::trackable
}
void set_record_enabled (bool yn, void *src);
bool record_enabled() const { return atomic_read (&_record_enabled); }
bool record_enabled() const { return g_atomic_int_get (&_record_enabled); }
void punch_in ();
void punch_out ();
@ -320,7 +320,7 @@ class DiskStream : public Stateful, public sigc::trackable
uint32_t _n_channels;
id_t _id;
atomic_t _record_enabled;
mutable gint _record_enabled;
AudioPlaylist* _playlist;
double _visible_speed;
double _actual_speed;
@ -365,7 +365,7 @@ class DiskStream : public Stateful, public sigc::trackable
AlignStyle _persistent_alignment_style;
bool first_input_change;
PBD::NonBlockingLock state_lock;
Glib::Mutex state_lock;
jack_nframes_t scrub_start;
jack_nframes_t scrub_buffer_size;
@ -404,7 +404,7 @@ class DiskStream : public Stateful, public sigc::trackable
};
vector<CaptureInfo*> capture_info;
PBD::Lock capture_info_lock;
Glib::Mutex capture_info_lock;
void init (Flag);

View file

@ -27,10 +27,11 @@
#include <sigc++/signal.h>
#include <jack/jack.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <pbd/fastlog.h>
#include <pbd/undo.h>
#include <pbd/atomic.h>
#include <midi++/controllable.h>
#include <ardour/ardour.h>
@ -205,7 +206,15 @@ class IO : public Stateful, public ARDOUR::StateManager
}
}
static void update_meters();
private:
static sigc::signal<void> Meter;
static Glib::StaticMutex m_meter_signal_lock;
sigc::connection m_meter_connection;
public:
/* automation */
@ -261,7 +270,7 @@ class IO : public Stateful, public ARDOUR::StateManager
int ports_became_legal ();
private:
mutable PBD::Lock io_lock;
mutable Glib::Mutex io_lock;
protected:
Session& _session;
@ -269,7 +278,7 @@ class IO : public Stateful, public ARDOUR::StateManager
gain_t _gain;
gain_t _effective_gain;
gain_t _desired_gain;
PBD::NonBlockingLock declick_lock;
Glib::Mutex declick_lock;
vector<Port*> _outputs;
vector<Port*> _inputs;
vector<float> _peak_power;
@ -331,7 +340,7 @@ class IO : public Stateful, public ARDOUR::StateManager
int save_automation (const string&);
int load_automation (const string&);
PBD::NonBlockingLock automation_lock;
Glib::Mutex automation_lock;
/* AudioTrack::deprecated_use_diskstream_connections() needs these */

View file

@ -27,10 +27,10 @@
#include <map>
#include <sys/types.h>
#include <pthread.h>
#include <sigc++/signal.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <pbd/undo.h>
#include "ardour.h"
@ -168,12 +168,12 @@ class Locations : public Stateful, public StateManager
sigc::signal<void,Location*> removed;
template<class T> void apply (T& obj, void (T::*method)(LocationList&)) {
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
(obj.*method)(locations);
}
template<class T1, class T2> void apply (T1& obj, void (T1::*method)(LocationList&, T2& arg), T2& arg) {
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
(obj.*method)(locations, arg);
}
@ -190,7 +190,7 @@ class Locations : public Stateful, public StateManager
LocationList locations;
Location *current_location;
mutable PBD::Lock lock;
mutable Glib::Mutex lock;
int set_current_unlocked (Location *);
void location_changed (Location*);

View file

@ -22,7 +22,7 @@
#define __ardour_logcurve_h__
#include <pbd/fastlog.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
namespace ARDOUR {
@ -94,7 +94,7 @@ class LogCurve {
}
void set_length (uint32_t len) { l = len; }
mutable PBD::NonBlockingLock lock;
mutable Glib::Mutex lock;
protected:
float a;

View file

@ -28,8 +28,9 @@
#include <sys/stat.h>
#include <glib.h>
#include <sigc++/signal.h>
#include <pbd/atomic.h>
#include <pbd/undo.h>
#include <ardour/ardour.h>
@ -169,9 +170,9 @@ class Playlist : public Stateful, public StateManager {
RegionList regions;
string _name;
Session& _session;
atomic_t block_notifications;
atomic_t ignore_state_changes;
mutable PBD::NonBlockingLock region_lock;
mutable gint block_notifications;
mutable gint ignore_state_changes;
mutable Glib::Mutex region_lock;
RegionList pending_removals;
RegionList pending_adds;
RegionList pending_bounds;
@ -197,8 +198,8 @@ class Playlist : public Stateful, public StateManager {
void init (bool hide);
bool holding_state () const {
return atomic_read (&block_notifications) != 0 ||
atomic_read (&ignore_state_changes) != 0;
return g_atomic_int_get (&block_notifications) != 0 ||
g_atomic_int_get (&ignore_state_changes) != 0;
}
/* prevent the compiler from ever generating these */

View file

@ -27,7 +27,8 @@
#include <map>
#include <sigc++/signal.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <pbd/undo.h>
#include <ardour/ardour.h>
@ -131,7 +132,7 @@ class Redirect : public IO
map<uint32_t,AutomationList*> parameter_automation;
set<uint32_t> visible_parameter_automation;
mutable PBD::NonBlockingLock _automation_lock;
mutable Glib::Mutex _automation_lock;
void can_automate (uint32_t);
set<uint32_t> can_automate_list;

View file

@ -221,7 +221,7 @@ class Region : public Stateful, public StateManager
string _name;
mutable RegionEditState _first_edit;
int _frozen;
PBD::Lock lock;
Glib::Mutex lock;
ARDOUR::id_t _id;
ARDOUR::Playlist* _playlist;
mutable uint32_t _read_data_count; // modified in read()

View file

@ -27,11 +27,8 @@
#include <map>
#include <string>
#include <pthread.h>
#include <pbd/atomic.h>
#include <pbd/fastlog.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <pbd/xml++.h>
#include <pbd/undo.h>
#include <midi++/controllable.h>
@ -142,14 +139,14 @@ class Route : public IO
void flush_redirects ();
template<class T> void foreach_redirect (T *obj, void (T::*func)(Redirect *)) {
RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (redirect_lock);
for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
(obj->*func) (*i);
}
}
Redirect *nth_redirect (uint32_t n) {
RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (redirect_lock);
RedirectList::iterator i;
for (i = _redirects.begin(); i != _redirects.end() && n; ++i, --n);
if (i == _redirects.end()) {
@ -294,9 +291,9 @@ class Route : public IO
jack_nframes_t _roll_delay;
jack_nframes_t _own_latency;
RedirectList _redirects;
PBD::NonBlockingRWLock redirect_lock;
Glib::RWLock redirect_lock;
IO *_control_outs;
PBD::NonBlockingLock control_outs_lock;
Glib::Mutex control_outs_lock;
RouteGroup *_edit_group;
RouteGroup *_mix_group;
std::string _comment;

View file

@ -31,9 +31,9 @@
#include <sndfile.h>
#include <glibmm/thread.h>
#include <pbd/error.h>
#include <pbd/atomic.h>
#include <pbd/lockmonitor.h>
#include <pbd/undo.h>
#include <pbd/pool.h>
@ -274,7 +274,7 @@ class Session : public sigc::trackable, public Stateful
typedef list<DiskStream *> DiskStreamList;
Session::DiskStreamList disk_streams() const {
RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (diskstream_lock);
return diskstreams; /* XXX yes, force a copy */
}
@ -284,7 +284,7 @@ class Session : public sigc::trackable, public Stateful
typedef list<Route *> RouteList;
RouteList get_routes() const {
RWLockMonitor rlock (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock rlock (route_lock);
return routes; /* XXX yes, force a copy */
}
@ -310,7 +310,7 @@ class Session : public sigc::trackable, public Stateful
}
RecordState record_status() const {
return (RecordState) atomic_read (&_record_status);
return (RecordState) g_atomic_int_get (&_record_status);
}
bool actively_recording () {
@ -1004,12 +1004,12 @@ class Session : public sigc::trackable, public Stateful
typedef void (Session::*process_function_type)(jack_nframes_t);
AudioEngine &_engine;
atomic_t processing_prohibited;
mutable gint processing_prohibited;
process_function_type process_function;
process_function_type last_process_function;
jack_nframes_t _current_frame_rate;
int transport_sub_state;
atomic_t _record_status;
mutable gint _record_status;
jack_nframes_t _transport_frame;
Location* end_location;
Location* start_location;
@ -1169,10 +1169,10 @@ class Session : public sigc::trackable, public Stateful
Sample* butler_mixdown_buffer;
float* butler_gain_buffer;
pthread_t butler_thread;
PBD::NonBlockingLock butler_request_lock;
pthread_cond_t butler_paused;
Glib::Mutex butler_request_lock;
Glib::Cond butler_paused;
bool butler_should_run;
atomic_t butler_should_do_transport_work;
mutable gint butler_should_do_transport_work;
int butler_request_pipe[2];
struct ButlerRequest {
@ -1417,10 +1417,10 @@ class Session : public sigc::trackable, public Stateful
static MultiAllocSingleReleasePool pool;
};
PBD::Lock midi_lock;
Glib::Mutex midi_lock;
pthread_t midi_thread;
int midi_request_pipe[2];
atomic_t butler_active;
mutable gint butler_active;
RingBuffer<MIDIRequest*> midi_requests;
int start_midi_thread ();
@ -1471,7 +1471,7 @@ class Session : public sigc::trackable, public Stateful
/* disk-streams */
DiskStreamList diskstreams;
mutable PBD::NonBlockingRWLock diskstream_lock;
mutable Glib::RWLock diskstream_lock;
uint32_t dstream_buffer_size;
void add_diskstream (DiskStream*);
int load_diskstreams (const XMLNode&);
@ -1479,7 +1479,7 @@ class Session : public sigc::trackable, public Stateful
/* routes stuff */
RouteList routes;
mutable PBD::NonBlockingRWLock route_lock;
mutable Glib::RWLock route_lock;
void add_route (Route*);
uint32_t destructive_index;
@ -1502,7 +1502,7 @@ class Session : public sigc::trackable, public Stateful
/* REGION MANAGEMENT */
mutable PBD::Lock region_lock;
mutable Glib::Mutex region_lock;
typedef map<ARDOUR::id_t,AudioRegion *> AudioRegionList;
AudioRegionList audio_regions;
@ -1515,7 +1515,7 @@ class Session : public sigc::trackable, public Stateful
/* SOURCES */
mutable PBD::Lock source_lock;
mutable Glib::Mutex source_lock;
typedef std::map<id_t, Source *> SourceList;
SourceList sources;
@ -1529,7 +1529,7 @@ class Session : public sigc::trackable, public Stateful
/* PLAYLISTS */
mutable PBD::Lock playlist_lock;
mutable Glib::Mutex playlist_lock;
typedef set<Playlist *> PlaylistList;
PlaylistList playlists;
PlaylistList unused_playlists;
@ -1547,7 +1547,7 @@ class Session : public sigc::trackable, public Stateful
/* NAMED SELECTIONS */
mutable PBD::Lock named_selection_lock;
mutable Glib::Mutex named_selection_lock;
typedef set<NamedSelection *> NamedSelectionList;
NamedSelectionList named_selections;
@ -1607,7 +1607,7 @@ class Session : public sigc::trackable, public Stateful
vector<space_and_path> session_dirs;
vector<space_and_path>::iterator last_rr_session_dir;
uint32_t _total_free_4k_blocks;
PBD::Lock space_lock;
Glib::Mutex space_lock;
static const char* sound_dir_name;
static const char* tape_dir_name;
@ -1618,15 +1618,15 @@ class Session : public sigc::trackable, public Stateful
int ensure_sound_dir (string, string&);
void refresh_disk_space ();
atomic_t _playback_load;
atomic_t _capture_load;
atomic_t _playback_load_min;
atomic_t _capture_load_min;
mutable gint _playback_load;
mutable gint _capture_load;
mutable gint _playback_load_min;
mutable gint _capture_load_min;
/* I/O Connections */
typedef list<Connection *> ConnectionList;
mutable PBD::Lock connection_lock;
mutable Glib::Mutex connection_lock;
ConnectionList _connections;
int load_connections (const XMLNode&);
@ -1685,7 +1685,7 @@ class Session : public sigc::trackable, public Stateful
Sample* click_emphasis_data;
jack_nframes_t click_length;
jack_nframes_t click_emphasis_length;
mutable PBD::NonBlockingRWLock click_lock;
mutable Glib::RWLock click_lock;
static const Sample default_click[];
static const jack_nframes_t default_click_length;

View file

@ -29,7 +29,7 @@ namespace ARDOUR {
template<class T> void
Session::foreach_connection (T *obj, void (T::*func)(Connection *))
{
LockMonitor lm (connection_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (connection_lock);
for (ConnectionList::iterator i = _connections.begin(); i != _connections.end(); i++) {
(obj->*func) (*i);
}

View file

@ -29,7 +29,7 @@ namespace ARDOUR {
template<class T> void
Session::foreach_diskstream (T *obj, void (T::*func)(DiskStream&))
{
RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (diskstream_lock);
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); i++) {
if (!(*i)->hidden()) {
(obj->*func) (**i);

View file

@ -29,7 +29,7 @@ namespace ARDOUR {
template<class T> void
Session::foreach_playlist (T *obj, void (T::*func)(Playlist *))
{
LockMonitor lm (playlist_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (playlist_lock);
for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); i++) {
if (!(*i)->hidden()) {
(obj->*func) (*i);

View file

@ -8,7 +8,7 @@ namespace ARDOUR {
template<class T> void Session::foreach_audio_region (T *obj, void (T::*func)(AudioRegion *))
{
LockMonitor lm (region_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (region_lock);
for (AudioRegionList::iterator i = audio_regions.begin(); i != audio_regions.end(); i++) {
(obj->*func) ((*i).second);
}

View file

@ -23,7 +23,8 @@
#include <iostream>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <ardour/session.h>
#include <ardour/route.h>
@ -35,7 +36,7 @@ Session::foreach_route (T *obj, void (T::*func)(Route&))
RouteList public_order;
{
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (route_lock);
public_order = routes;
}
@ -53,7 +54,7 @@ Session::foreach_route (T *obj, void (T::*func)(Route*))
RouteList public_order;
{
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (route_lock);
public_order = routes;
}
@ -72,7 +73,7 @@ Session::foreach_route (T *obj, void (T::*func)(Route&, A), A arg1)
RouteList public_order;
{
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (route_lock);
public_order = routes;
}

View file

@ -29,7 +29,7 @@ namespace ARDOUR {
template<class T> void
Session::foreach_named_selection (T& obj, void (T::*func)(NamedSelection&))
{
LockMonitor lm (named_selection_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (named_selection_lock);
for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); i++) {
(obj.*func) (**i);
}

View file

@ -25,7 +25,6 @@
#include <jack/jack.h>
#include <pthread.h>
#include <sigc++/signal.h>
#include <ardour/ardour.h>
#include <midi++/parser.h>

View file

@ -43,7 +43,7 @@ class SndFileSource : public ExternalSource {
mutable float *tmpbuf;
mutable jack_nframes_t tmpbufsize;
mutable PBD::Lock _tmpbuf_lock;
mutable Glib::Mutex _tmpbuf_lock;
void init (const string &str, bool build_peak);
};

View file

@ -25,10 +25,12 @@
#include <vector>
#include <string>
#include <time.h>
#include <ctime>
#include <sigc++/signal.h>
#include <glibmm/thread.h>
#include <ardour/ardour.h>
#include <ardour/stateful.h>
#include <pbd/xml++.h>
@ -125,7 +127,7 @@ class Source : public Stateful, public sigc::trackable
string _name;
uint32_t _use_cnt;
bool _peaks_built;
mutable PBD::Lock _lock;
mutable Glib::Mutex _lock;
jack_nframes_t _length;
bool next_peak_clear_should_notify;
string peakpath;
@ -156,7 +158,7 @@ class Source : public Stateful, public sigc::trackable
};
static vector<Source*> pending_peak_sources;
static PBD::Lock pending_peak_sources_lock;
static Glib::StaticMutex pending_peak_sources_lock;
static void queue_for_peaks (Source&);
static void clear_queue_for_peaks ();

View file

@ -25,8 +25,7 @@
#include <string>
#include <vector>
#include <cmath>
#include <pthread.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <pbd/undo.h>
#include <sigc++/signal.h>
@ -198,7 +197,7 @@ class TempoMap : public Stateful, public StateManager {
typedef vector<BBTPoint> BBTPointList;
template<class T> void apply_with_metrics (T& obj, void (T::*method)(const Metrics&)) {
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
(obj.*method)(*metrics);
}
@ -285,7 +284,7 @@ class TempoMap : public Stateful, public StateManager {
jack_nframes_t last_bbt_when;
bool last_bbt_valid;
BBT_Time last_bbt;
mutable PBD::Lock lock;
mutable Glib::Mutex lock;
void timestamp_metrics ();

View file

@ -203,7 +203,7 @@ AudioPlaylist::read (Sample *buf, Sample *mixdown_buffer, float *gain_buffer, ch
its OK to block (for short intervals).
*/
LockMonitor rm (region_lock, __LINE__, __FILE__);
Glib::Mutex::Lock rm (region_lock);
end = start + cnt - 1;
@ -504,7 +504,7 @@ AudioPlaylist::add_crossfade (Crossfade& xfade)
void AudioPlaylist::notify_crossfade_added (Crossfade *x)
{
if (atomic_read(&block_notifications)) {
if (g_atomic_int_get(&block_notifications)) {
_pending_xfade_adds.insert (_pending_xfade_adds.end(), x);
} else {
NewCrossfade (x); /* EMIT SIGNAL */

View file

@ -625,7 +625,7 @@ AudioTrack::roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nfram
jack_nframes_t transport_frame;
{
TentativeRWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
if (lm.locked()) {
// automation snapshot can also be called from the non-rt context
// and it uses the redirect list, so we take the lock out here
@ -709,7 +709,7 @@ AudioTrack::roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nfram
/* don't waste time with automation if we're recording or we've just stopped (yes it can happen) */
if (!diskstream->record_enabled() && _session.transport_rolling()) {
TentativeLockMonitor am (automation_lock, __LINE__, __FILE__);
Glib::Mutex::Lock am (automation_lock, Glib::TRY_LOCK);
if (am.locked() && gain_automation_playback()) {
apply_gain_automation = _gain_automation_curve.rt_safe_get_vector (start_frame, end_frame, _session.gain_automation_buffer(), nframes);
@ -789,7 +789,7 @@ AudioTrack::export_stuff (vector<Sample*>& buffers, char * workbuf, uint32_t nbu
vector<Sample*>::iterator bi;
Sample * b;
RWLockMonitor rlock (redirect_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock rlock (redirect_lock);
if (diskstream->playlist()->read (buffers[0], mix_buffer, gain_buffer, workbuf, start, nframes) != nframes) {
return -1;
@ -958,7 +958,7 @@ AudioTrack::freeze (InterThreadInfo& itt)
_freeze_record.have_mementos = true;
{
RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (redirect_lock);
for (RedirectList::iterator r = _redirects.begin(); r != _redirects.end(); ++r) {
@ -1015,7 +1015,7 @@ AudioTrack::unfreeze ()
} else {
RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__); // should this be a write lock? jlc
Glib::RWLock::ReaderLock lm (redirect_lock); // should this be a write lock? jlc
for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
for (vector<FreezeRecordInsertInfo*>::iterator ii = _freeze_record.insert_info.begin(); ii != _freeze_record.insert_info.end(); ++ii) {
if ((*ii)->id == (*i)->id()) {

View file

@ -22,6 +22,7 @@
#include <cerrno>
#include <vector>
#include <glibmm/timer.h>
#include <pbd/pthread_utils.h>
#include <ardour/audioengine.h>
@ -45,7 +46,6 @@ jack_nframes_t Port::long_over_length = 10;
AudioEngine::AudioEngine (string client_name)
{
pthread_cond_init (&session_removed, 0);
session = 0;
session_remove_pending = false;
_running = false;
@ -60,9 +60,11 @@ AudioEngine::AudioEngine (string client_name)
_buffer_size = 0;
_freewheeling = false;
_freewheel_thread_registered = false;
last_meter_point = 0;
meter_interval = 0;
meter_thread_id = (pthread_t) 0;
m_meter_thread = 0;
m_meter_exit = false;
start_metering_thread();
if (connect_to_jack (client_name)) {
throw NoBackendAvailable ();
@ -76,8 +78,8 @@ AudioEngine::~AudioEngine ()
jack_client_close (_jack);
}
if (meter_thread_id != (pthread_t) 0) {
pthread_cancel (meter_thread_id);
if(m_meter_thread) {
g_atomic_int_inc(&m_meter_exit);
}
}
@ -227,7 +229,7 @@ AudioEngine::_freewheel_callback (int onoff, void *arg)
int
AudioEngine::process_callback (jack_nframes_t nframes)
{
TentativeLockMonitor tm (_process_lock, __LINE__, __FILE__);
Glib::Mutex::Lock tm (_process_lock, Glib::TRY_LOCK);
jack_nframes_t next_processed_frames;
/* handle wrap around of total frames counter */
@ -246,7 +248,7 @@ AudioEngine::process_callback (jack_nframes_t nframes)
if (session_remove_pending) {
session = 0;
session_remove_pending = false;
pthread_cond_signal (&session_removed);
session_removed.signal();
_processed_frames = next_processed_frames;
return 0;
}
@ -270,13 +272,6 @@ AudioEngine::process_callback (jack_nframes_t nframes)
return 0;
}
/* manage meters */
if ((meter_interval > _buffer_size) && (last_meter_point + meter_interval < next_processed_frames)) {
IO::Meter ();
last_meter_point = next_processed_frames;
}
if (last_monitor_check + monitor_check_interval < next_processed_frames) {
for (Ports::iterator i = ports.begin(); i != ports.end(); ++i) {
@ -315,11 +310,6 @@ AudioEngine::jack_sample_rate_callback (jack_nframes_t nframes)
monitor_check_interval = nframes / 10;
last_monitor_check = 0;
meter_interval = nframes / 100;
last_meter_point = 0;
maybe_start_metering_thread ();
if (session) {
session->set_frame_rate (nframes);
}
@ -350,48 +340,25 @@ AudioEngine::jack_bufsize_callback (jack_nframes_t nframes)
session->set_block_size (_buffer_size);
}
maybe_start_metering_thread ();
return 0;
}
void
AudioEngine::maybe_start_metering_thread ()
AudioEngine::start_metering_thread ()
{
if (meter_interval == 0) {
return;
}
if (_buffer_size == 0) {
return;
}
if (meter_interval < _buffer_size) {
if (meter_thread_id != (pthread_t) 0) {
pthread_cancel (meter_thread_id);
}
pthread_create (&meter_thread_id, 0, _meter_thread, this);
if(m_meter_thread == 0) {
m_meter_thread = Glib::Thread::create (sigc::mem_fun(this, &AudioEngine::meter_thread), false);
}
}
void*
AudioEngine::_meter_thread (void *arg)
{
return static_cast<AudioEngine*>(arg)->meter_thread ();
}
void*
void
AudioEngine::meter_thread ()
{
PBD::ThreadCreated (pthread_self(), "Metering");
while (true) {
usleep (10000); /* 1/100th sec interval */
pthread_testcancel();
IO::Meter ();
while (g_atomic_int_get(&m_meter_exit) != true) {
Glib::usleep (10000); /* 1/100th sec interval */
IO::update_meters ();
}
return 0;
return;
}
void
@ -405,13 +372,13 @@ AudioEngine::set_session (Session *s)
void
AudioEngine::remove_session ()
{
LockMonitor lm (_process_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_process_lock);
if (_running) {
if (session) {
session_remove_pending = true;
pthread_cond_wait (&session_removed, _process_lock.mutex());
session_removed.wait(_process_lock);
}
} else {
@ -448,7 +415,7 @@ AudioEngine::register_audio_input_port (const string& portname)
} else {
pthread_mutex_unlock (_process_lock.mutex());
_process_lock.unlock();
throw PortRegistrationFailure();
}
@ -476,7 +443,7 @@ AudioEngine::register_audio_output_port (const string& portname)
} else {
pthread_mutex_unlock (_process_lock.mutex());
_process_lock.unlock();
throw PortRegistrationFailure ();
}
@ -633,7 +600,7 @@ AudioEngine::frames_per_cycle ()
Port *
AudioEngine::get_port_by_name (const string& portname, bool keep)
{
LockMonitor lm (_process_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_process_lock);
if (!_running) {
if (!_has_run) {
@ -966,7 +933,7 @@ AudioEngine::reconnect_to_jack ()
if (_jack) {
disconnect_from_jack ();
/* XXX give jackd a chance */
usleep (250000);
Glib::usleep (250000);
}
if (connect_to_jack (jack_client_name)) {

View file

@ -27,8 +27,9 @@
#include <sigc++/bind.h>
#include <sigc++/class_slot.h>
#include <glibmm/thread.h>
#include <pbd/basename.h>
#include <pbd/lockmonitor.h>
#include <pbd/xml++.h>
#include <ardour/audioregion.h>

View file

@ -18,7 +18,7 @@
$Id$
*/
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <ardour/diskstream.h>
#include <ardour/audioregion.h>
@ -57,7 +57,7 @@ Auditioner::Auditioner (Session& s)
IO::output_changed.connect (mem_fun (*this, &Auditioner::output_changed));
the_region = 0;
atomic_set (&_active, 0);
g_atomic_int_set (&_active, 0);
}
Auditioner::~Auditioner ()
@ -74,14 +74,14 @@ Auditioner::prepare_playlist ()
void
Auditioner::audition_current_playlist ()
{
if (atomic_read (&_active)) {
if (g_atomic_int_get (&_active)) {
/* don't go via session for this, because we are going
to remain active.
*/
cancel_audition ();
}
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
diskstream->seek (0);
length = diskstream->playlist()->get_maximum_extent();
current_frame = 0;
@ -90,20 +90,20 @@ Auditioner::audition_current_playlist ()
_panner->reset (n_outputs(), diskstream->n_channels());
atomic_set (&_active, 1);
g_atomic_int_set (&_active, 1);
}
void
Auditioner::audition_region (AudioRegion& region)
{
if (atomic_read (&_active)) {
if (g_atomic_int_get (&_active)) {
/* don't go via session for this, because we are going
to remain active.
*/
cancel_audition ();
}
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
the_region = new AudioRegion (region);
the_region->set_position (0, this);
@ -126,7 +126,7 @@ Auditioner::audition_region (AudioRegion& region)
length = the_region->length();
diskstream->seek (0);
current_frame = 0;
atomic_set (&_active, 1);
g_atomic_int_set (&_active, 1);
}
int
@ -136,7 +136,7 @@ Auditioner::play_audition (jack_nframes_t nframes)
jack_nframes_t this_nframes;
int ret;
if (atomic_read (&_active) == 0) {
if (g_atomic_int_get (&_active) == 0) {
silence (nframes, 0);
return 0;
}

View file

@ -225,7 +225,7 @@ void
AutomationList::clear ()
{
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
events.clear ();
if (!no_state) {
save_state (_("cleared"));
@ -239,14 +239,14 @@ AutomationList::clear ()
void
AutomationList::x_scale (double factor)
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
_x_scale (factor);
}
bool
AutomationList::extend_to (double when)
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
if (events.empty() || events.back()->when == when) {
return false;
}
@ -285,7 +285,7 @@ AutomationList::rt_add (double when, double value)
// cerr << "RT: alist @ " << this << " add " << value << " @ " << when << endl;
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
iterator where;
TimeComparator cmp;
@ -369,7 +369,7 @@ AutomationList::add (double when, double value, bool for_loading)
/* this is for graphical editing and loading data from storage */
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
TimeComparator cmp;
ControlEvent cp (when, 0.0f);
bool insert = true;
@ -413,7 +413,7 @@ void
AutomationList::erase (AutomationList::iterator i)
{
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
events.erase (i);
reposition_for_rt_add (0);
if (!no_state) {
@ -428,7 +428,7 @@ void
AutomationList::erase (AutomationList::iterator start, AutomationList::iterator end)
{
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
events.erase (start, end);
reposition_for_rt_add (0);
if (!no_state) {
@ -445,7 +445,7 @@ AutomationList::reset_range (double start, double endt)
bool reset = false;
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
TimeComparator cmp;
ControlEvent cp (start, 0.0f);
iterator s;
@ -481,7 +481,7 @@ AutomationList::erase_range (double start, double endt)
bool erased = false;
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
TimeComparator cmp;
ControlEvent cp (start, 0.0f);
iterator s;
@ -515,7 +515,7 @@ AutomationList::move_range (iterator start, iterator end, double xdelta, double
*/
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
while (start != end) {
(*start)->when += xdelta;
@ -542,7 +542,7 @@ AutomationList::modify (iterator iter, double when, double val)
*/
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
(*iter)->when = when;
(*iter)->value = val;
if (!no_state) {
@ -558,7 +558,7 @@ AutomationList::modify (iterator iter, double when, double val)
std::pair<AutomationList::iterator,AutomationList::iterator>
AutomationList::control_points_adjacent (double xval)
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
iterator i;
TimeComparator cmp;
ControlEvent cp (xval, 0.0f);
@ -620,7 +620,7 @@ Change
AutomationList::restore_state (StateManager::State& state)
{
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
State* lstate = dynamic_cast<State*> (&state);
events.clear ();
@ -655,7 +655,7 @@ void
AutomationList::truncate_end (double last_coordinate)
{
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
ControlEvent cp (last_coordinate, 0);
list<ControlEvent*>::reverse_iterator i;
double last_val;
@ -760,7 +760,7 @@ void
AutomationList::truncate_start (double overall_length)
{
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
AutomationList::iterator i;
double first_legal_value;
double first_legal_coordinate;
@ -998,7 +998,7 @@ AutomationList::cut (iterator start, iterator end)
AutomationList* nal = new AutomationList (default_value);
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
for (iterator x = start; x != end; ) {
iterator tmp;
@ -1032,7 +1032,7 @@ AutomationList::cut_copy_clear (double start, double end, int op)
bool changed = false;
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
if ((s = lower_bound (events.begin(), events.end(), &cp, cmp)) == events.end()) {
return nal;
@ -1094,7 +1094,7 @@ AutomationList::copy (iterator start, iterator end)
AutomationList* nal = new AutomationList (default_value);
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
for (iterator x = start; x != end; ) {
iterator tmp;
@ -1141,7 +1141,7 @@ AutomationList::paste (AutomationList& alist, double pos, float times)
}
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
iterator where;
iterator prev;
double end = 0;

View file

@ -28,7 +28,6 @@
#include "i18n.h"
using namespace ARDOUR;
using namespace PBD;
Connection::Connection (const XMLNode& node)
{
@ -58,7 +57,7 @@ void
Connection::add_connection (int port, string portname)
{
{
LockMonitor lm (port_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (port_lock);
_ports[port].push_back (portname);
}
ConnectionsChanged (port); /* EMIT SIGNAL */
@ -70,7 +69,7 @@ Connection::remove_connection (int port, string portname)
bool changed = false;
{
LockMonitor lm (port_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (port_lock);
PortList& pl = _ports[port];
PortList::iterator i = find (pl.begin(), pl.end(), portname);
@ -88,7 +87,7 @@ Connection::remove_connection (int port, string portname)
const Connection::PortList&
Connection::port_connections (int port) const
{
LockMonitor lm (port_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (port_lock);
return _ports[port];
}
@ -102,7 +101,7 @@ void
Connection::add_port ()
{
{
LockMonitor lm (port_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (port_lock);
_ports.push_back (PortList());
}
ConfigurationChanged(); /* EMIT SIGNAL */
@ -114,7 +113,7 @@ Connection::remove_port (int which_port)
bool changed = false;
{
LockMonitor lm (port_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (port_lock);
vector<PortList>::iterator i;
int n;
@ -135,7 +134,7 @@ void
Connection::clear ()
{
{
LockMonitor lm (port_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (port_lock);
_ports.clear ();
}

View file

@ -13,7 +13,6 @@
using namespace ARDOUR;
using namespace PBD;
using namespace std;
#include "i18n.h"
@ -32,7 +31,7 @@ ControlProtocolManager::ControlProtocolManager ()
ControlProtocolManager::~ControlProtocolManager()
{
LockMonitor lm (protocols_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (protocols_lock);
for (list<ControlProtocol*>::iterator i = control_protocols.begin(); i != control_protocols.end(); ++i) {
delete (*i);
@ -62,7 +61,7 @@ ControlProtocolManager::drop_session ()
_session = 0;
{
LockMonitor lm (protocols_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (protocols_lock);
for (list<ControlProtocol*>::iterator p = control_protocols.begin(); p != control_protocols.end(); ++p) {
delete *p;
}
@ -89,7 +88,7 @@ ControlProtocolManager::instantiate (ControlProtocolInfo& cpi)
return 0;
}
LockMonitor lm (protocols_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (protocols_lock);
control_protocols.push_back (cpi.protocol);
return cpi.protocol;
@ -113,7 +112,7 @@ ControlProtocolManager::teardown (ControlProtocolInfo& cpi)
cpi.descriptor->destroy (cpi.descriptor, cpi.protocol);
{
LockMonitor lm (protocols_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (protocols_lock);
list<ControlProtocol*>::iterator p = find (control_protocols.begin(), control_protocols.end(), cpi.protocol);
if (p != control_protocols.end()) {
control_protocols.erase (p);
@ -281,7 +280,7 @@ XMLNode&
ControlProtocolManager::get_state (void)
{
XMLNode* root = new XMLNode (state_node_name);
LockMonitor lm (protocols_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (protocols_lock);
for (list<ControlProtocolInfo*>::iterator i = control_protocol_info.begin(); i != control_protocol_info.end(); ++i) {
XMLNode* child = new XMLNode (X_("Protocol"));

View file

@ -66,29 +66,34 @@ CoreAudioSource::init (const string& idstr, bool build_peak)
}
/* note that we temporarily truncated _id at the colon */
FSRef ref;
err = FSPathMakeRef ((UInt8*)file.c_str(), &ref, 0);
FSRef fsr;
err = FSPathMakeRef ((UInt8*)file.c_str(), &fsr, 0);
if (err != noErr) {
cerr << "FSPathMakeRef " << err << endl;
throw failed_constructor();
}
err = ExtAudioFileOpen (&ref, &af);
err = ExtAudioFileOpen (&fsr, &af);
if (err != noErr) {
cerr << "ExtAudioFileOpen " << err << endl;
ExtAudioFileDispose (af);
throw failed_constructor();
}
AudioStreamBasicDescription file_asbd;
memset(&file_asbd, 0, sizeof(file_asbd));
size_t asbd_size = sizeof(file_asbd);
memset(&file_asbd, 0, sizeof(AudioStreamBasicDescription));
size_t asbd_size = sizeof(AudioStreamBasicDescription);
err = ExtAudioFileGetProperty(af,
kExtAudioFileProperty_FileDataFormat, &asbd_size, &file_asbd);
if (err != noErr) {
cerr << "ExtAudioFileGetProperty1 " << err << endl;
ExtAudioFileDispose (af);
throw failed_constructor();
}
n_channels = file_asbd.mChannelsPerFrame;
cerr << "number of channels: " << n_channels << endl;
if (channel >= n_channels) {
error << string_compose(_("CoreAudioSource: file only contains %1 channels; %2 is invalid as a channel number"), n_channels, channel) << endmsg;
ExtAudioFileDispose (af);
@ -96,17 +101,36 @@ CoreAudioSource::init (const string& idstr, bool build_peak)
}
int64_t ca_frames;
size_t prop_size = sizeof(ca_frames);
size_t prop_size = sizeof(int64_t);
err = ExtAudioFileGetProperty(af, kExtAudioFileProperty_FileLengthFrames, &prop_size, &ca_frames);
if (err != noErr) {
cerr << "ExtAudioFileGetProperty2 " << err << endl;
ExtAudioFileDispose (af);
throw failed_constructor();
}
_length = ca_frames;
_length = ca_frames;
_path = file;
AudioStreamBasicDescription client_asbd;
memset(&client_asbd, 0, sizeof(AudioStreamBasicDescription));
client_asbd.mSampleRate = file_asbd.mSampleRate;
client_asbd.mFormatID = kAudioFormatLinearPCM;
client_asbd.mFormatFlags = kLinearPCMFormatFlagIsFloat;
client_asbd.mBytesPerPacket = file_asbd.mChannelsPerFrame * 4;
client_asbd.mFramesPerPacket = 1;
client_asbd.mBytesPerFrame = client_asbd.mBytesPerPacket;
client_asbd.mChannelsPerFrame = file_asbd.mChannelsPerFrame;
client_asbd.mBitsPerChannel = 32;
err = ExtAudioFileSetProperty (af, kExtAudioFileProperty_ClientDataFormat, asbd_size, &client_asbd);
if (err != noErr) {
cerr << "ExtAudioFileSetProperty3 " << err << endl;
ExtAudioFileDispose (af);
throw failed_constructor ();
}
if (build_peak) {
if (initialize_peakfile (false, file)) {
error << "initialize peakfile failed" << endmsg;
@ -114,24 +138,6 @@ CoreAudioSource::init (const string& idstr, bool build_peak)
throw failed_constructor ();
}
}
AudioStreamBasicDescription client_asbd;
memset(&client_asbd, 0, sizeof(client_asbd));
client_asbd.mFormatID = kAudioFormatLinearPCM;
client_asbd.mFormatFlags = kLinearPCMFormatFlagIsFloat;
client_asbd.mSampleRate = file_asbd.mSampleRate;
err = AudioFormatGetProperty(kAudioFormatProperty_FormatInfo, 0, NULL, &asbd_size, &client_asbd);
if (err != noErr) {
ExtAudioFileDispose (af);
throw failed_constructor ();
}
err = ExtAudioFileSetProperty (af, kExtAudioFileProperty_ClientDataFormat, asbd_size, &client_asbd);
if (err != noErr) {
ExtAudioFileDispose (af);
throw failed_constructor ();
}
}
CoreAudioSource::~CoreAudioSource ()
@ -173,7 +179,7 @@ CoreAudioSource::read (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, ch
uint32_t real_cnt = cnt * n_channels;
{
LockMonitor lm (_tmpbuf_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_tmpbuf_lock);
if (tmpbufsize < real_cnt) {

View file

@ -28,7 +28,7 @@
#include <cfloat>
#include <cmath>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <sigc++/bind.h>
#include "ardour/curve.h"
@ -37,7 +37,6 @@
using namespace std;
using namespace ARDOUR;
using namespace PBD;
using namespace sigc;
Curve::Curve (double minv, double maxv, double canv, bool nostate)
@ -204,7 +203,7 @@ Curve::solve ()
bool
Curve::rt_safe_get_vector (double x0, double x1, float *vec, int32_t veclen)
{
TentativeLockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock, Glib::TRY_LOCK);
if (!lm.locked()) {
return false;
@ -217,7 +216,7 @@ Curve::rt_safe_get_vector (double x0, double x1, float *vec, int32_t veclen)
void
Curve::get_vector (double x0, double x1, float *vec, int32_t veclen)
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
_get_vector (x0, x1, vec, veclen);
}

View file

@ -268,7 +268,7 @@ jack_nframes_t
DestructiveFileSource::write (Sample* data, jack_nframes_t cnt, char * workbuf)
{
{
LockMonitor lm (_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_lock);
jack_nframes_t old_file_pos;

View file

@ -33,7 +33,7 @@
#include <pbd/error.h>
#include <pbd/basename.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <pbd/xml++.h>
#include <ardour/ardour.h>
@ -139,7 +139,7 @@ DiskStream::init (Flag f)
first_input_change = true;
_playlist = 0;
i_am_the_modifier = 0;
atomic_set (&_record_enabled, 0);
g_atomic_int_set (&_record_enabled, 0);
was_recording = false;
capture_start_frame = 0;
capture_captured = 0;
@ -213,7 +213,7 @@ DiskStream::destroy_channel (ChannelInfo &chan)
DiskStream::~DiskStream ()
{
LockMonitor lm (state_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (state_lock);
if (_playlist) {
_playlist->unref ();
@ -229,7 +229,7 @@ DiskStream::~DiskStream ()
void
DiskStream::handle_input_change (IOChange change, void *src)
{
LockMonitor lm (state_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (state_lock);
if (!(input_change_pending & change)) {
input_change_pending = IOChange (input_change_pending|change);
@ -241,7 +241,7 @@ void
DiskStream::non_realtime_input_change ()
{
{
LockMonitor lm (state_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (state_lock);
if (input_change_pending == NoChange) {
return;
@ -349,7 +349,7 @@ int
DiskStream::use_playlist (AudioPlaylist* playlist)
{
{
LockMonitor lm (state_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (state_lock);
if (playlist == _playlist) {
return 0;
@ -565,7 +565,7 @@ DiskStream::non_realtime_set_speed ()
{
if (_buffer_reallocation_required)
{
LockMonitor lm (state_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (state_lock);
allocate_temporary_buffers ();
_buffer_reallocation_required = false;
@ -753,7 +753,8 @@ DiskStream::process (jack_nframes_t transport_frame, jack_nframes_t nframes, jac
returns a non-zero value, in which case, ::commit should not be called.
*/
if (pthread_mutex_trylock (state_lock.mutex())) {
// If we can't take the state lock return.
if (!state_lock.trylock()) {
return 1;
}
@ -1002,7 +1003,7 @@ DiskStream::process (jack_nframes_t transport_frame, jack_nframes_t nframes, jac
be called. unlock the state lock.
*/
pthread_mutex_unlock (state_lock.mutex());
state_lock.unlock();
}
return ret;
@ -1011,7 +1012,7 @@ DiskStream::process (jack_nframes_t transport_frame, jack_nframes_t nframes, jac
void
DiskStream::recover ()
{
pthread_mutex_unlock (state_lock.mutex());
state_lock.unlock();
_processed = false;
}
@ -1047,7 +1048,7 @@ DiskStream::commit (jack_nframes_t nframes)
|| channels[0].capture_buf->read_space() >= disk_io_chunk_frames;
}
pthread_mutex_unlock (state_lock.mutex());
state_lock.unlock();
_processed = false;
@ -1140,7 +1141,7 @@ DiskStream::overwrite_existing_buffers ()
int
DiskStream::seek (jack_nframes_t frame, bool complete_refill)
{
LockMonitor lm (state_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (state_lock);
uint32_t n;
int ret;
ChannelList::iterator chan;
@ -1702,7 +1703,7 @@ DiskStream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture
}
/* XXX is there anything we can do if err != 0 ? */
LockMonitor lm (capture_info_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (capture_info_lock);
if (capture_info.empty()) {
return;
@ -1925,7 +1926,7 @@ DiskStream::set_record_enabled (bool yn, void* src)
if (record_enabled() != yn) {
if (yn) {
atomic_set (&_record_enabled, 1);
g_atomic_int_set (&_record_enabled, 1);
capturing_sources.clear ();
if (Config->get_use_hardware_monitoring()) {
for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
@ -1941,7 +1942,7 @@ DiskStream::set_record_enabled (bool yn, void* src)
}
} else {
atomic_set (&_record_enabled, 0);
g_atomic_int_set (&_record_enabled, 0);
if (Config->get_use_hardware_monitoring()) {
for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
if ((*chan).source) {
@ -2415,7 +2416,7 @@ DiskStream::set_loop (Location *location)
jack_nframes_t
DiskStream::get_capture_start_frame (uint32_t n)
{
LockMonitor lm (capture_info_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (capture_info_lock);
if (capture_info.size() > n) {
return capture_info[n]->start;
@ -2428,7 +2429,7 @@ DiskStream::get_capture_start_frame (uint32_t n)
jack_nframes_t
DiskStream::get_captured_frames (uint32_t n)
{
LockMonitor lm (capture_info_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (capture_info_lock);
if (capture_info.size() > n) {
return capture_info[n]->frames;

View file

@ -53,10 +53,11 @@
#include <vector>
#include <cstdio> /* for rename(2) */
#include <glibmm.h>
#include <pbd/stl_delete.h>
#include <pbd/basename.h>
#include <pbd/dirname.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <pbd/pathscanner.h>
#include <ardour/ardour.h>
@ -351,7 +352,7 @@ FileSource::set_allow_remove_if_empty (bool yn)
int
FileSource::set_name (string newname, bool destructive)
{
LockMonitor lm (_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_lock);
string oldpath = _path;
string newpath = Session::change_audio_path_by_name (oldpath, _name, newname, destructive);
@ -365,7 +366,7 @@ FileSource::set_name (string newname, bool destructive)
return -1;
}
_name = basename (newpath);
_name = Glib::path_get_basename (newpath);
_path = newpath;
return rename_peakfile (peak_path (_path));
@ -680,7 +681,7 @@ FileSource::compute_header_size ()
int
FileSource::update_header (jack_nframes_t when, struct tm& now, time_t tnow)
{
LockMonitor lm (_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_lock);
if (is_bwf) {
/* random code is 9 digits */
@ -1009,7 +1010,7 @@ FileSource::mark_for_remove ()
jack_nframes_t
FileSource::read (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const
{
LockMonitor lm (_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_lock);
return read_unlocked (dst, start, cnt, workbuf);
}
@ -1055,7 +1056,7 @@ jack_nframes_t
FileSource::write (Sample *data, jack_nframes_t cnt, char * workbuf)
{
{
LockMonitor lm (_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_lock);
jack_nframes_t oldlen;
int32_t frame_pos = _length;
@ -1287,7 +1288,7 @@ FileSource::is_empty (string path)
void
FileSource::mark_streaming_write_completed ()
{
LockMonitor lm (_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_lock);
next_peak_clear_should_notify = true;
@ -1313,13 +1314,15 @@ FileSource::move_to_trash (const string trash_dir_name)
on whichever filesystem it was already on.
*/
newpath = PBD::dirname (_path);
newpath = PBD::dirname (newpath);
// XXX Portability
newpath = Glib::path_get_dirname (_path);
newpath = Glib::path_get_dirname (newpath);
newpath += '/';
newpath += trash_dir_name;
newpath += '/';
newpath += PBD::basename (_path);
newpath += Glib::path_get_basename (_path);
if (access (newpath.c_str(), F_OK) == 0) {

View file

@ -175,7 +175,7 @@ inline static void gdither_innner_loop(const GDitherType dt,
const int clamp_l)
{
uint32_t pos, i;
u_int8_t *o8 = (u_int8_t*) y;
uint8_t *o8 = (uint8_t*) y;
int16_t *o16 = (int16_t*) y;
int32_t *o32 = (int32_t*) y;
float tmp, r, ideal;

View file

@ -47,7 +47,10 @@
#include <ardour/utils.h>
#include <ardour/session.h>
#include <ardour/control_protocol_manager.h>
#ifdef HAVE_LIBLO
#include <ardour/osc.h>
#endif
#include <ardour/mix.h>
@ -59,7 +62,10 @@
ARDOUR::Configuration* ARDOUR::Config = 0;
ARDOUR::AudioLibrary* ARDOUR::Library = 0;
#ifdef HAVE_LIBLO
ARDOUR::OSC* ARDOUR::osc = 0;
#endif
using namespace ARDOUR;
using namespace std;
@ -74,6 +80,7 @@ Change ARDOUR::PositionChanged = ARDOUR::new_change ();
Change ARDOUR::NameChanged = ARDOUR::new_change ();
Change ARDOUR::BoundsChanged = Change (0); // see init(), below
#ifdef HAVE_LIBLO
static int
setup_osc ()
{
@ -89,6 +96,7 @@ setup_osc ()
return 0;
}
}
#endif
static int
setup_midi ()
@ -198,9 +206,11 @@ ARDOUR::init (AudioEngine& engine, bool use_vst, bool try_optimization, void (*s
return -1;
}
#ifdef HAVE_LIBLO
if (setup_osc ()) {
return -1;
}
#endif
#ifdef VST_SUPPORT
if (Config->get_use_vst() && fst_init (sighandler)) {

View file

@ -30,7 +30,10 @@
#include <sndfile.h>
#include <samplerate.h>
#include <glibmm.h>
#include <pbd/basename.h>
#include <ardour/ardour.h>
#include <ardour/session.h>
#include <ardour/diskstream.h>
@ -212,7 +215,7 @@ Session::import_audiofile (import_status& status)
sources.push_back(newfiles[n]);
}
AudioRegion *r = new AudioRegion (sources, 0, newfiles[0]->length(), region_name_from_path (PBD::basename(basepath)),
AudioRegion *r = new AudioRegion (sources, 0, newfiles[0]->length(), region_name_from_path (Glib::path_get_basename (basepath)),
0, AudioRegion::Flag (AudioRegion::DefaultFlags | AudioRegion::WholeFile));
status.new_regions.push_back (r);
@ -228,7 +231,7 @@ Session::import_audiofile (import_status& status)
did not bother to create whole-file AudioRegions for them. Do it now.
*/
AudioRegion *r = new AudioRegion (*newfiles[n], 0, newfiles[n]->length(), region_name_from_path (PBD::basename (newfiles[n]->name())),
AudioRegion *r = new AudioRegion (*newfiles[n], 0, newfiles[n]->length(), region_name_from_path (Glib::path_get_basename (newfiles[n]->name())),
0, AudioRegion::Flag (AudioRegion::DefaultFlags | AudioRegion::WholeFile | AudioRegion::Import));
status.new_regions.push_back (r);
@ -285,7 +288,7 @@ Session::import_audiofile (import_status& status)
string
Session::build_tmp_convert_name(string infile)
{
string tmp_name(_path + "/." + PBD::basename (infile.c_str()) + "XXXXXX");
string tmp_name(_path + "/." + Glib::path_get_basename (infile.c_str()) + "XXXXXX");
char* tmp = new char[tmp_name.length() + 1];
tmp_name.copy(tmp, string::npos);
tmp[tmp_name.length()] = 0;

View file

@ -76,7 +76,7 @@ PluginInsert::PluginInsert (Session& s, Plugin& plug, Placement placement)
save_state (_("initial state"));
{
LockMonitor em (_session.engine().process_lock(), __LINE__, __FILE__);
Glib::Mutex::Lock em (_session.engine().process_lock());
IO::MoreOutputs (output_streams ());
}
@ -97,7 +97,7 @@ PluginInsert::PluginInsert (Session& s, const XMLNode& node)
_plugins[0]->ParameterChanged.connect (mem_fun (*this, &PluginInsert::parameter_changed));
{
LockMonitor em (_session.engine().process_lock(), __LINE__, __FILE__);
Glib::Mutex::Lock em (_session.engine().process_lock());
IO::MoreOutputs (output_streams());
}
}
@ -410,7 +410,7 @@ PluginInsert::automation_run (vector<Sample *>& bufs, uint32_t nbufs, jack_nfram
jack_nframes_t now = _session.transport_frame ();
jack_nframes_t end = now + nframes;
TentativeLockMonitor lm (_automation_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_automation_lock, Glib::TRY_LOCK);
if (!lm.locked()) {
connect_and_run (bufs, nbufs, nframes, offset, false);

View file

@ -25,7 +25,8 @@
#include <sigc++/bind.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <pbd/xml++.h>
#include <ardour/audioengine.h>
@ -70,6 +71,8 @@ sigc::signal<int> IO::PannersLegal;
sigc::signal<void,uint32_t> IO::MoreOutputs;
sigc::signal<int> IO::PortsCreated;
Glib::StaticMutex IO::m_meter_signal_lock = GLIBMM_STATIC_MUTEX_INIT;
/* this is a default mapper of MIDI control values to a gain coefficient.
others can be imagined. see IO::set_midi_to_gain_function().
*/
@ -127,12 +130,19 @@ IO::IO (Session& s, string name,
_gain_automation_state = Off;
_gain_automation_style = Absolute;
Meter.connect (mem_fun (*this, &IO::meter));
{
// IO::Meter is emitted from another thread so the
// Meter signal must be protected.
Glib::Mutex::Lock guard (m_meter_signal_lock);
m_meter_connection = Meter.connect (mem_fun (*this, &IO::meter));
}
}
IO::~IO ()
{
LockMonitor lm (io_lock, __LINE__, __FILE__);
Glib::Mutex::Lock guard (m_meter_signal_lock);
Glib::Mutex::Lock lm (io_lock);
vector<Port *>::iterator i;
for (i = _inputs.begin(); i != _inputs.end(); ++i) {
@ -142,6 +152,8 @@ IO::~IO ()
for (i = _outputs.begin(); i != _outputs.end(); ++i) {
_session.engine().unregister_port (*i);
}
m_meter_connection.disconnect();
}
void
@ -380,7 +392,7 @@ IO::deliver_output (vector<Sample *>& bufs, uint32_t nbufs, jack_nframes_t nfram
gain_t pangain = _gain;
{
TentativeLockMonitor dm (declick_lock, __LINE__, __FILE__);
Glib::Mutex::Lock dm (declick_lock, Glib::TRY_LOCK);
if (dm.locked()) {
dg = _desired_gain;
@ -427,7 +439,7 @@ IO::deliver_output_no_pan (vector<Sample *>& bufs, uint32_t nbufs, jack_nframes_
} else {
TentativeLockMonitor dm (declick_lock, __LINE__, __FILE__);
Glib::Mutex::Lock dm (declick_lock, Glib::TRY_LOCK);
if (dm.locked()) {
dg = _desired_gain;
@ -568,10 +580,10 @@ IO::disconnect_input (Port* our_port, string other_port, void* src)
}
{
LockMonitor em (_session.engine().process_lock(), __LINE__, __FILE__);
Glib::Mutex::Lock em (_session.engine().process_lock());
{
LockMonitor lm (io_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (io_lock);
/* check that our_port is really one of ours */
@ -604,10 +616,10 @@ IO::connect_input (Port* our_port, string other_port, void* src)
}
{
LockMonitor em(_session.engine().process_lock(), __LINE__, __FILE__);
Glib::Mutex::Lock em(_session.engine().process_lock());
{
LockMonitor lm (io_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (io_lock);
/* check that our_port is really one of ours */
@ -638,10 +650,10 @@ IO::disconnect_output (Port* our_port, string other_port, void* src)
}
{
LockMonitor em(_session.engine().process_lock(), __LINE__, __FILE__);
Glib::Mutex::Lock em(_session.engine().process_lock());
{
LockMonitor lm (io_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (io_lock);
if (find (_outputs.begin(), _outputs.end(), our_port) == _outputs.end()) {
return -1;
@ -671,10 +683,10 @@ IO::connect_output (Port* our_port, string other_port, void* src)
}
{
LockMonitor em(_session.engine().process_lock(), __LINE__, __FILE__);
Glib::Mutex::Lock em(_session.engine().process_lock());
{
LockMonitor lm (io_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (io_lock);
/* check that our_port is really one of ours */
@ -730,10 +742,10 @@ IO::remove_output_port (Port* port, void* src)
IOChange change (NoChange);
{
LockMonitor em(_session.engine().process_lock(), __LINE__, __FILE__);
Glib::Mutex::Lock em(_session.engine().process_lock());
{
LockMonitor lm (io_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (io_lock);
if (_noutputs - 1 == (uint32_t) _output_minimum) {
/* sorry, you can't do this */
@ -779,10 +791,10 @@ IO::add_output_port (string destination, void* src)
char buf[64];
{
LockMonitor em(_session.engine().process_lock(), __LINE__, __FILE__);
Glib::Mutex::Lock em(_session.engine().process_lock());
{
LockMonitor lm (io_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (io_lock);
if (_output_maximum >= 0 && (int) _noutputs == _output_maximum) {
return -1;
@ -830,10 +842,10 @@ IO::remove_input_port (Port* port, void* src)
IOChange change (NoChange);
{
LockMonitor em(_session.engine().process_lock(), __LINE__, __FILE__);
Glib::Mutex::Lock em(_session.engine().process_lock());
{
LockMonitor lm (io_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (io_lock);
if (((int)_ninputs - 1) < _input_minimum) {
/* sorry, you can't do this */
@ -880,10 +892,10 @@ IO::add_input_port (string source, void* src)
char buf[64];
{
LockMonitor em (_session.engine().process_lock(), __LINE__, __FILE__);
Glib::Mutex::Lock em (_session.engine().process_lock());
{
LockMonitor lm (io_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (io_lock);
if (_input_maximum >= 0 && (int) _ninputs == _input_maximum) {
return -1;
@ -931,10 +943,10 @@ int
IO::disconnect_inputs (void* src)
{
{
LockMonitor em (_session.engine().process_lock(), __LINE__, __FILE__);
Glib::Mutex::Lock em (_session.engine().process_lock());
{
LockMonitor lm (io_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (io_lock);
for (vector<Port *>::iterator i = _inputs.begin(); i != _inputs.end(); ++i) {
_session.engine().disconnect (*i);
@ -951,10 +963,10 @@ int
IO::disconnect_outputs (void* src)
{
{
LockMonitor em (_session.engine().process_lock(), __LINE__, __FILE__);
Glib::Mutex::Lock em (_session.engine().process_lock());
{
LockMonitor lm (io_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (io_lock);
for (vector<Port *>::iterator i = _outputs.begin(); i != _outputs.end(); ++i) {
_session.engine().disconnect (*i);
@ -1063,8 +1075,8 @@ IO::ensure_io (uint32_t nin, uint32_t nout, bool clear, void* src)
}
{
LockMonitor em (_session.engine().process_lock(), __LINE__, __FILE__);
LockMonitor lm (io_lock, __LINE__, __FILE__);
Glib::Mutex::Lock em (_session.engine().process_lock());
Glib::Mutex::Lock lm (io_lock);
Port* port;
@ -1212,8 +1224,8 @@ IO::ensure_inputs (uint32_t n, bool clear, bool lockit, void* src)
}
if (lockit) {
LockMonitor em (_session.engine().process_lock(), __LINE__, __FILE__);
LockMonitor im (io_lock, __LINE__, __FILE__);
Glib::Mutex::Lock em (_session.engine().process_lock());
Glib::Mutex::Lock im (io_lock);
changed = ensure_inputs_locked (n, clear, src);
} else {
changed = ensure_inputs_locked (n, clear, src);
@ -1314,8 +1326,8 @@ IO::ensure_outputs (uint32_t n, bool clear, bool lockit, void* src)
/* XXX caller should hold io_lock, but generally doesn't */
if (lockit) {
LockMonitor em (_session.engine().process_lock(), __LINE__, __FILE__);
LockMonitor im (io_lock, __LINE__, __FILE__);
Glib::Mutex::Lock em (_session.engine().process_lock());
Glib::Mutex::Lock im (io_lock);
changed = ensure_outputs_locked (n, clear, src);
} else {
changed = ensure_outputs_locked (n, clear, src);
@ -1389,7 +1401,7 @@ IO::state (bool full_state)
bool need_ins = true;
bool need_outs = true;
LocaleGuard lg (X_("POSIX"));
LockMonitor lm (io_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (io_lock);
node->add_property("name", _name);
snprintf (buf, sizeof(buf), "%" PRIu64, id());
@ -2058,7 +2070,7 @@ IO::set_output_maximum (int n)
void
IO::set_port_latency (jack_nframes_t nframes)
{
LockMonitor lm (io_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (io_lock);
for (vector<Port *>::iterator i = _outputs.begin(); i != _outputs.end(); ++i) {
(*i)->set_latency (nframes);
@ -2109,8 +2121,8 @@ IO::use_input_connection (Connection& c, void* src)
uint32_t limit;
{
LockMonitor lm (_session.engine().process_lock(), __LINE__, __FILE__);
LockMonitor lm2 (io_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_session.engine().process_lock());
Glib::Mutex::Lock lm2 (io_lock);
limit = c.nports();
@ -2187,8 +2199,8 @@ IO::use_output_connection (Connection& c, void* src)
uint32_t limit;
{
LockMonitor lm (_session.engine().process_lock(), __LINE__, __FILE__);
LockMonitor lm2 (io_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_session.engine().process_lock());
Glib::Mutex::Lock lm2 (io_lock);
limit = c.nports();
@ -2437,10 +2449,26 @@ IO::send_state_changed ()
return;
}
/**
Update the peak meters.
The meter signal lock is taken to prevent modification of the
Meter signal while updating the meters, taking the meter signal
lock prior to taking the io_lock ensures that all IO will remain
valid while metering.
*/
void
IO::update_meters()
{
Glib::Mutex::Lock guard (m_meter_signal_lock);
Meter();
}
void
IO::meter ()
{
LockMonitor lm (io_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (io_lock); // READER: meter thread.
uint32_t limit = max (_ninputs, _noutputs);
for (uint32_t n = 0; n < limit; ++n) {
@ -2602,7 +2630,7 @@ IO::load_automation (const string& path)
void
IO::clear_automation ()
{
LockMonitor lm (automation_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (automation_lock);
_gain_automation_curve.clear ();
_panner->clear_automation ();
}
@ -2613,7 +2641,7 @@ IO::set_gain_automation_state (AutoState state)
bool changed = false;
{
LockMonitor lm (automation_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (automation_lock);
if (state != _gain_automation_curve.automation_state()) {
changed = true;
@ -2638,7 +2666,7 @@ IO::set_gain_automation_style (AutoStyle style)
bool changed = false;
{
LockMonitor lm (automation_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (automation_lock);
if (style != _gain_automation_curve.automation_style()) {
changed = true;
@ -2666,7 +2694,7 @@ IO::set_gain (gain_t val, void *src)
if (val>1.99526231f) val=1.99526231f;
{
LockMonitor dm (declick_lock, __LINE__, __FILE__);
Glib::Mutex::Lock dm (declick_lock);
_desired_gain = val;
}

View file

@ -371,7 +371,7 @@ Locations::set_current (Location *loc, bool want_lock)
int ret;
if (want_lock) {
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
ret = set_current_unlocked (loc);
} else {
ret = set_current_unlocked (loc);
@ -399,7 +399,7 @@ void
Locations::clear ()
{
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
LocationList::iterator tmp;
for (LocationList::iterator i = locations.begin(); i != locations.end(); ) {
tmp = i;
@ -424,7 +424,7 @@ void
Locations::clear_markers ()
{
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
LocationList::iterator tmp;
for (LocationList::iterator i = locations.begin(); i != locations.end(); ) {
@ -448,7 +448,7 @@ void
Locations::clear_ranges ()
{
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
LocationList::iterator tmp;
for (LocationList::iterator i = locations.begin(); i != locations.end(); ) {
@ -477,7 +477,7 @@ void
Locations::add (Location *loc, bool make_current)
{
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
locations.push_back (loc);
if (make_current) {
@ -507,7 +507,7 @@ Locations::remove (Location *loc)
}
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
for (i = locations.begin(); i != locations.end(); ++i) {
if ((*i) == loc) {
@ -547,7 +547,7 @@ Locations::get_state ()
{
XMLNode *node = new XMLNode ("Locations");
LocationList::iterator iter;
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
for (iter = locations.begin(); iter != locations.end(); ++iter) {
node->add_child_nocopy ((*iter)->get_state ());
@ -570,7 +570,7 @@ Locations::set_state (const XMLNode& node)
nlist = node.children();
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
Location *loc = new Location;
@ -614,7 +614,7 @@ Locations::first_location_before (jack_nframes_t frame)
LocationList locs;
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
locs = locations;
}
@ -638,7 +638,7 @@ Locations::first_location_after (jack_nframes_t frame)
LocationList locs;
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
locs = locations;
}
@ -662,7 +662,7 @@ Locations::first_mark_before (jack_nframes_t frame)
LocationList locs;
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
locs = locations;
}
@ -699,7 +699,7 @@ Locations::first_mark_after (jack_nframes_t frame)
LocationList locs;
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
locs = locations;
}
@ -792,7 +792,7 @@ Change
Locations::restore_state (StateManager::State& state)
{
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
State* lstate = dynamic_cast<State*> (&state);
locations = lstate->locations;
@ -817,7 +817,7 @@ uint32_t
Locations::num_range_markers () const
{
uint32_t cnt = 0;
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
for (LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
if ((*i)->is_range_marker()) {
++cnt;

View file

@ -28,9 +28,10 @@
#include <unistd.h>
#include <float.h>
#include <glibmm.h>
#include <pbd/error.h>
#include <pbd/failed_constructor.h>
#include <pbd/basename.h>
#include <pbd/xml++.h>
#include <ardour/session.h>
@ -1369,7 +1370,7 @@ Panner::state (bool full)
if (full) {
if (save () == 0) {
root->add_property (X_("automation"), PBD::basename (automation_path));
root->add_property (X_("automation"), Glib::path_get_basename (automation_path));
}
}

View file

@ -225,8 +225,8 @@ Playlist::copy_regions (RegionList& newlist) const
void
Playlist::init (bool hide)
{
atomic_set (&block_notifications, 0);
atomic_set (&ignore_state_changes, 0);
g_atomic_int_set (&block_notifications, 0);
g_atomic_int_set (&ignore_state_changes, 0);
pending_modified = false;
pending_length = false;
_refcnt = 0;
@ -292,13 +292,13 @@ void
Playlist::freeze ()
{
delay_notifications ();
atomic_inc (&ignore_state_changes);
g_atomic_int_inc (&ignore_state_changes);
}
void
Playlist::thaw ()
{
atomic_dec (&ignore_state_changes);
g_atomic_int_dec_and_test (&ignore_state_changes);
release_notifications ();
}
@ -306,14 +306,14 @@ Playlist::thaw ()
void
Playlist::delay_notifications ()
{
atomic_inc (&block_notifications);
g_atomic_int_inc (&block_notifications);
freeze_length = _get_maximum_extent();
}
void
Playlist::release_notifications ()
{
if (atomic_dec_and_test(&block_notifications)) {
if (g_atomic_int_dec_and_test (&block_notifications)) {
flush_notifications ();
}
}

View file

@ -126,7 +126,7 @@ Redirect::load_automation (string path)
return 1;
}
LockMonitor lm (_automation_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_automation_lock);
set<uint32_t> tosave;
parameter_automation.clear ();
@ -159,7 +159,7 @@ Redirect::load_automation (string path)
int
Redirect::save_automation (string path)
{
LockMonitor lm (_automation_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_automation_lock);
string fullpath;
if (parameter_automation.empty()) {
@ -268,7 +268,7 @@ Redirect::state (bool full_state)
void
Redirect::what_has_automation (set<uint32_t>& s) const
{
LockMonitor lm (_automation_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_automation_lock);
map<uint32_t,AutomationList*>::const_iterator li;
for (li = parameter_automation.begin(); li != parameter_automation.end(); ++li) {
@ -279,7 +279,7 @@ Redirect::what_has_automation (set<uint32_t>& s) const
void
Redirect::what_has_visible_automation (set<uint32_t>& s) const
{
LockMonitor lm (_automation_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_automation_lock);
set<uint32_t>::const_iterator li;
for (li = visible_parameter_automation.begin(); li != visible_parameter_automation.end(); ++li) {

View file

@ -26,7 +26,7 @@
#include <sigc++/bind.h>
#include <sigc++/class_slot.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <pbd/xml++.h>
#include <ardour/region.h>
@ -178,7 +178,7 @@ Region::restore_and_return_flags (RegionState& state)
Change what_changed = Change (0);
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
if (_start != state._start) {
what_changed = Change (what_changed|StartChanged);
@ -947,7 +947,7 @@ Region::thaw (const string& why)
Change what_changed = Change (0);
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
if (_frozen && --_frozen > 0) {
return;
@ -978,7 +978,7 @@ void
Region::send_change (Change what_changed)
{
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
if (_frozen) {
pending_changed = Change (pending_changed|what_changed);
return;

View file

@ -235,7 +235,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
declick = _pending_declick;
{
TentativeLockMonitor cm (control_outs_lock, __LINE__, __FILE__);
Glib::Mutex::Lock cm (control_outs_lock, Glib::TRY_LOCK);
if (cm.locked()) {
co = _control_outs;
@ -245,7 +245,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
}
{
TentativeLockMonitor dm (declick_lock, __LINE__, __FILE__);
Glib::Mutex::Lock dm (declick_lock, Glib::TRY_LOCK);
if (dm.locked()) {
dmg = desired_mute_gain;
@ -330,7 +330,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
-------------------------------------------------------------------------------------------------- */
if (with_redirects) {
TentativeRWLockMonitor rm (redirect_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
if (rm.locked()) {
if (mute_gain > 0 || !_mute_affects_pre_fader) {
for (i = _redirects.begin(); i != _redirects.end(); ++i) {
@ -499,7 +499,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
if (post_fader_work) {
TentativeRWLockMonitor rm (redirect_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
if (rm.locked()) {
if (mute_gain > 0 || !_mute_affects_post_fader) {
for (i = _redirects.begin(); i != _redirects.end(); ++i) {
@ -723,7 +723,7 @@ Route::set_solo (bool yn, void *src)
void
Route::set_solo_mute (bool yn)
{
LockMonitor lm (declick_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (declick_lock);
/* Called by Session in response to another Route being soloed.
*/
@ -757,7 +757,7 @@ Route::set_mute (bool yn, void *src)
_midi_mute_control.send_feedback (_muted);
}
LockMonitor lm (declick_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (declick_lock);
desired_mute_gain = (yn?0.0f:1.0f);
}
}
@ -772,7 +772,7 @@ Route::add_redirect (Redirect *redirect, void *src, uint32_t* err_streams)
}
{
RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__);
Glib::RWLock::WriterLock lm (redirect_lock);
PluginInsert* pi;
PortInsert* porti;
@ -845,7 +845,7 @@ Route::add_redirects (const RedirectList& others, void *src, uint32_t* err_strea
}
{
RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__);
Glib::RWLock::WriterLock lm (redirect_lock);
RedirectList::iterator existing_end = _redirects.end();
--existing_end;
@ -904,7 +904,7 @@ Route::clear_redirects (void *src)
}
{
RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__);
Glib::RWLock::WriterLock lm (redirect_lock);
for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
delete *i;
@ -934,7 +934,7 @@ Route::remove_redirect (Redirect *redirect, void *src, uint32_t* err_streams)
redirect_max_outs = 0;
{
RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__);
Glib::RWLock::WriterLock lm (redirect_lock);
RedirectList::iterator i;
bool removed = false;
@ -1013,7 +1013,7 @@ Route::remove_redirect (Redirect *redirect, void *src, uint32_t* err_streams)
int
Route::reset_plugin_counts (uint32_t* lpc)
{
RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__);
Glib::RWLock::WriterLock lm (redirect_lock);
return _reset_plugin_counts (lpc);
}
@ -1183,7 +1183,7 @@ Route::copy_redirects (const Route& other, Placement placement, uint32_t* err_st
RedirectList to_be_deleted;
{
RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__);
Glib::RWLock::WriterLock lm (redirect_lock);
RedirectList::iterator tmp;
RedirectList the_copy;
@ -1262,7 +1262,7 @@ Route::copy_redirects (const Route& other, Placement placement, uint32_t* err_st
void
Route::all_redirects_flip ()
{
RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (redirect_lock);
if (_redirects.empty()) {
return;
@ -1278,7 +1278,7 @@ Route::all_redirects_flip ()
void
Route::all_redirects_active (bool state)
{
RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (redirect_lock);
if (_redirects.empty()) {
return;
@ -1300,7 +1300,7 @@ Route::sort_redirects (uint32_t* err_streams)
{
{
RedirectSorter comparator;
RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__);
Glib::RWLock::WriterLock lm (redirect_lock);
uint32_t old_rmo = redirect_max_outs;
/* the sweet power of C++ ... */
@ -1779,7 +1779,7 @@ Route::silence (jack_nframes_t nframes, jack_nframes_t offset)
}
{
TentativeRWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
if (lm.locked()) {
for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
@ -1804,7 +1804,7 @@ Route::silence (jack_nframes_t nframes, jack_nframes_t offset)
int
Route::set_control_outs (const vector<string>& ports)
{
LockMonitor lm (control_outs_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (control_outs_lock);
vector<string>::const_iterator i;
if (_control_outs) {
@ -2007,7 +2007,7 @@ Route::transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_re
jack_nframes_t now = _session.transport_frame();
{
RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (redirect_lock);
if (!did_locate) {
automation_snapshot (now);
@ -2126,7 +2126,7 @@ Route::roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t
bool can_record, bool rec_monitors_input)
{
{
TentativeRWLockMonitor lm(redirect_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
if (lm.locked()) {
// automation snapshot can also be called from the non-rt context
// and it uses the redirect list, so we take the lock out here
@ -2150,7 +2150,7 @@ Route::roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t
apply_gain_automation = false;
{
TentativeLockMonitor am (automation_lock, __LINE__, __FILE__);
Glib::Mutex::Lock am (automation_lock, Glib::TRY_LOCK);
if (am.locked() && _session.transport_rolling()) {
@ -2242,7 +2242,7 @@ Route::send_all_midi_feedback ()
if (_session.get_midi_feedback()) {
{
RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (redirect_lock);
for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
(*i)->send_all_midi_feedback ();
}
@ -2262,7 +2262,7 @@ Route::write_midi_feedback (MIDI::byte* buf, int32_t& bufsize)
buf = _midi_mute_control.write_feedback (buf, bufsize, _muted);
{
RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (redirect_lock);
for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
buf = (*i)->write_midi_feedback (buf, bufsize);
}
@ -2278,7 +2278,7 @@ Route::flush_redirects ()
this is called from the RT audio thread.
*/
RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (redirect_lock);
for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
(*i)->deactivate ();

View file

@ -32,12 +32,13 @@
#include <sigc++/bind.h>
#include <sigc++/retype.h>
#include <glibmm.h>
#include <pbd/error.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <pbd/pathscanner.h>
#include <pbd/stl_delete.h>
#include <pbd/basename.h>
#include <pbd/dirname.h>
#include <ardour/audioengine.h>
#include <ardour/configuration.h>
@ -64,7 +65,10 @@
#include <ardour/crossfade.h>
#include <ardour/playlist.h>
#include <ardour/click.h>
#ifdef HAVE_LIBLO
#include <ardour/osc.h>
#endif
#include "i18n.h"
@ -550,7 +554,7 @@ Session::set_worst_io_latencies (bool take_lock)
}
if (take_lock) {
route_lock.read_lock ();
route_lock.reader_lock ();
}
for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
@ -559,7 +563,7 @@ Session::set_worst_io_latencies (bool take_lock)
}
if (take_lock) {
route_lock.unlock ();
route_lock.reader_unlock ();
}
}
@ -794,9 +798,11 @@ Session::when_engine_running ()
_engine.set_session (this);
#ifdef HAVE_LIBLO
/* and to OSC */
osc->set_session (*this);
#endif
_state_of_the_state = Clean;
@ -954,7 +960,7 @@ Session::set_auto_input (bool yn)
a non-tentative rwlock here, because the action must occur.
The rarity and short potential lock duration makes this "OK"
*/
RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock dsm (diskstream_lock);
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
if ((*i)->record_enabled ()) {
//cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
@ -972,7 +978,7 @@ void
Session::reset_input_monitor_state ()
{
if (transport_rolling()) {
RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock dsm (diskstream_lock);
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
if ((*i)->record_enabled ()) {
//cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
@ -980,7 +986,7 @@ Session::reset_input_monitor_state ()
}
}
} else {
RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock dsm (diskstream_lock);
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
if ((*i)->record_enabled ()) {
//cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
@ -1247,8 +1253,8 @@ void
Session::enable_record ()
{
/* XXX really atomic compare+swap here */
if (atomic_read (&_record_status) != Recording) {
atomic_set (&_record_status, Recording);
if (g_atomic_int_get (&_record_status) != Recording) {
g_atomic_int_set (&_record_status, Recording);
_last_record_location = _transport_frame;
send_mmc_in_another_thread (MIDI::MachineControl::cmdRecordStrobe);
@ -1257,7 +1263,7 @@ Session::enable_record ()
a non-tentative rwlock here, because the action must occur.
The rarity and short potential lock duration makes this "OK"
*/
RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock dsm (diskstream_lock);
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
if ((*i)->record_enabled ()) {
@ -1275,13 +1281,13 @@ Session::disable_record (bool rt_context, bool force)
{
RecordState rs;
if ((rs = (RecordState) atomic_read (&_record_status)) != Disabled) {
if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
if (!Config->get_latched_record_enable () || force) {
atomic_set (&_record_status, Disabled);
g_atomic_int_set (&_record_status, Disabled);
} else {
if (rs == Recording) {
atomic_set (&_record_status, Enabled);
g_atomic_int_set (&_record_status, Enabled);
}
}
@ -1292,7 +1298,7 @@ Session::disable_record (bool rt_context, bool force)
a non-tentative rwlock here, because the action must occur.
The rarity and short potential lock duration makes this "OK"
*/
RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock dsm (diskstream_lock);
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
if ((*i)->record_enabled ()) {
@ -1312,14 +1318,14 @@ Session::disable_record (bool rt_context, bool force)
void
Session::step_back_from_record ()
{
atomic_set (&_record_status, Enabled);
g_atomic_int_set (&_record_status, Enabled);
if (Config->get_use_hardware_monitoring()) {
/* Even though this can be called from RT context we are using
a non-tentative rwlock here, because the action must occur.
The rarity and short potential lock duration makes this "OK"
*/
RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock dsm (diskstream_lock);
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
if (auto_input && (*i)->record_enabled ()) {
@ -1333,7 +1339,7 @@ Session::step_back_from_record ()
void
Session::maybe_enable_record ()
{
atomic_set (&_record_status, Enabled);
g_atomic_int_set (&_record_status, Enabled);
/* XXX this save should really happen in another thread. its needed so that
pending capture state can be recovered if we crash.
@ -1441,8 +1447,8 @@ Session::set_block_size (jack_nframes_t nframes)
*/
{
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (route_lock);
Glib::RWLock::ReaderLock dsm (diskstream_lock);
vector<Sample*>::iterator i;
uint32_t np;
@ -1519,7 +1525,7 @@ Session::set_default_fade (float steepness, float fade_msecs)
{
// jlc, WTF is this!
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (route_lock);
AudioRegion::set_default_fade (steepness, fade_frames);
}
@ -1670,7 +1676,7 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod
/* count existing audio tracks */
{
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (route_lock);
for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
if (dynamic_cast<AudioTrack*>(*i) != 0) {
if (!(*i)->hidden()) {
@ -1786,7 +1792,7 @@ Session::new_audio_route (int input_channels, int output_channels)
/* count existing audio busses */
{
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (route_lock);
for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
if (dynamic_cast<AudioTrack*>(*i) == 0) {
if (!(*i)->hidden()) {
@ -1869,7 +1875,7 @@ void
Session::add_route (Route* route)
{
{
RWLockMonitor lm (route_lock, true, __LINE__, __FILE__);
Glib::RWLock::WriterLock lm (route_lock);
routes.push_front (route);
resort_routes(0);
}
@ -1900,7 +1906,7 @@ Session::add_diskstream (DiskStream* dstream)
dstream->do_refill(0, 0, 0);
{
RWLockMonitor lm (diskstream_lock, true, __LINE__, __FILE__);
Glib::RWLock::WriterLock lm (diskstream_lock);
diskstreams.push_back (dstream);
}
@ -1928,7 +1934,7 @@ void
Session::remove_route (Route& route)
{
{
RWLockMonitor lm (route_lock, true, __LINE__, __FILE__);
Glib::RWLock::WriterLock lm (route_lock);
routes.remove (&route);
/* deleting the master out seems like a dumb
@ -1956,7 +1962,7 @@ Session::remove_route (Route& route)
}
{
RWLockMonitor lm (diskstream_lock, true, __LINE__, __FILE__);
Glib::RWLock::WriterLock lm (diskstream_lock);
AudioTrack* at;
@ -1992,7 +1998,7 @@ Session::route_solo_changed (void* src, Route* route)
return;
}
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (route_lock);
bool is_track;
is_track = (dynamic_cast<AudioTrack*>(route) != 0);
@ -2191,14 +2197,14 @@ Session::catch_up_on_solo ()
basis, but needs the global overview that only the session
has.
*/
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (route_lock);
update_route_solo_state();
}
Route *
Session::route_by_name (string name)
{
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (route_lock);
for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
if ((*i)->name() == name) {
@ -2212,7 +2218,7 @@ Session::route_by_name (string name)
Route *
Session::route_by_remote_id (uint32_t id)
{
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (route_lock);
for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
if ((*i)->remote_control_id() == id) {
@ -2262,7 +2268,7 @@ Session::get_maximum_extent () const
DiskStream *
Session::diskstream_by_name (string name)
{
RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (diskstream_lock);
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
if ((*i)->name() == name) {
@ -2276,7 +2282,7 @@ Session::diskstream_by_name (string name)
DiskStream *
Session::diskstream_by_id (id_t id)
{
RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (diskstream_lock);
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
if ((*i)->id() == id) {
@ -2348,7 +2354,7 @@ Session::region_name (string& result, string base, bool newlevel) const
if (base == "") {
LockMonitor lm (region_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (region_lock);
snprintf (buf, sizeof (buf), "%d", (int)audio_regions.size() + 1);
@ -2376,7 +2382,7 @@ Session::region_name (string& result, string base, bool newlevel) const
bool name_taken = true;
{
LockMonitor lm (region_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (region_lock);
for (int n = 1; n < 5000; ++n) {
@ -2415,7 +2421,7 @@ Session::add_region (Region* region)
bool added = false;
{
LockMonitor lm (region_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (region_lock);
if ((ar = dynamic_cast<AudioRegion*> (region)) != 0) {
@ -2492,7 +2498,7 @@ Session::remove_region (Region* region)
bool removed = false;
{
LockMonitor lm (region_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (region_lock);
if ((ar = dynamic_cast<AudioRegion*> (region)) != 0) {
if ((i = audio_regions.find (region->id())) != audio_regions.end()) {
@ -2523,7 +2529,7 @@ Session::find_whole_file_parent (AudioRegion& child)
{
AudioRegionList::iterator i;
AudioRegion* region;
LockMonitor lm (region_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (region_lock);
for (i = audio_regions.begin(); i != audio_regions.end(); ++i) {
@ -2599,7 +2605,7 @@ Session::remove_last_capture ()
{
list<Region*> r;
RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (diskstream_lock);
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
list<Region*>& l = (*i)->last_capture_regions();
@ -2629,7 +2635,7 @@ Session::add_source (Source* source)
pair<SourceList::key_type, SourceList::mapped_type> entry;
{
LockMonitor lm (source_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (source_lock);
entry.first = source->id();
entry.second = source;
sources.insert (entry);
@ -2647,7 +2653,7 @@ Session::remove_source (Source* source)
SourceList::iterator i;
{
LockMonitor lm (source_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (source_lock);
if ((i = sources.find (source->id())) != sources.end()) {
sources.erase (i);
@ -2669,7 +2675,7 @@ Session::remove_source (Source* source)
Source *
Session::get_source (ARDOUR::id_t id)
{
LockMonitor lm (source_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (source_lock);
SourceList::iterator i;
Source* source = 0;
@ -2687,8 +2693,8 @@ Session::peak_path_from_audio_path (string audio_path)
string res;
res = PBD::dirname (audio_path);
res = PBD::dirname (res);
res = Glib::path_get_dirname (audio_path);
res = Glib::path_get_dirname (res);
res += '/';
res += peak_dir_name;
res += '/';
@ -2702,7 +2708,7 @@ string
Session::change_audio_path_by_name (string path, string oldname, string newname, bool destructive)
{
string look_for;
string old_basename = basename_nosuffix (oldname);
string old_basename = PBD::basename_nosuffix (oldname);
string new_legalized = legalize_for_path (newname);
/* note: we know (or assume) the old path is already valid */
@ -2915,7 +2921,7 @@ Session::get_playlist (string name)
Playlist *
Session::playlist_by_name (string name)
{
LockMonitor lm (playlist_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (playlist_lock);
for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) {
if ((*i)->name() == name) {
return* i;
@ -2937,7 +2943,7 @@ Session::add_playlist (Playlist* playlist)
}
{
LockMonitor lm (playlist_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (playlist_lock);
if (find (playlists.begin(), playlists.end(), playlist) == playlists.end()) {
playlists.insert (playlists.begin(), playlist);
// playlist->ref();
@ -2957,7 +2963,7 @@ Session::track_playlist (Playlist* pl, bool inuse)
PlaylistList::iterator x;
{
LockMonitor lm (playlist_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (playlist_lock);
if (!inuse) {
//cerr << "shifting playlist to unused: " << pl->name() << endl;
@ -2989,7 +2995,7 @@ Session::remove_playlist (Playlist* playlist)
}
{
LockMonitor lm (playlist_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (playlist_lock);
// cerr << "removing playlist: " << playlist->name() << endl;
PlaylistList::iterator i;
@ -3105,7 +3111,7 @@ void
Session::set_all_solo (bool yn)
{
{
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (route_lock);
for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
if (!(*i)->hidden()) {
@ -3121,7 +3127,7 @@ void
Session::set_all_mute (bool yn)
{
{
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (route_lock);
for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
if (!(*i)->hidden()) {
@ -3136,7 +3142,7 @@ Session::set_all_mute (bool yn)
uint32_t
Session::n_diskstreams () const
{
RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (diskstream_lock);
uint32_t n = 0;
for (DiskStreamList::const_iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
@ -3150,7 +3156,7 @@ Session::n_diskstreams () const
void
Session::foreach_diskstream (void (DiskStream::*func)(void))
{
RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (diskstream_lock);
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
if (!(*i)->hidden()) {
((*i)->*func)();
@ -3169,8 +3175,8 @@ Session::graph_reordered ()
return;
}
RWLockMonitor lm1 (route_lock, true, __LINE__, __FILE__);
RWLockMonitor lm2 (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::WriterLock lm1 (route_lock);
Glib::RWLock::ReaderLock lm2 (diskstream_lock);
resort_routes (0);
@ -3198,7 +3204,7 @@ Session::record_enable_all ()
void
Session::record_enable_change_all (bool yn)
{
RWLockMonitor lm1 (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm1 (route_lock);
for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
AudioTrack* at;
@ -3283,7 +3289,7 @@ void
Session::add_connection (ARDOUR::Connection* connection)
{
{
LockMonitor (connection_lock, __LINE__, __FILE__);
Glib::Mutex::Lock guard (connection_lock);
_connections.push_back (connection);
}
@ -3298,7 +3304,7 @@ Session::remove_connection (ARDOUR::Connection* connection)
bool removed = false;
{
LockMonitor (connection_lock, __LINE__, __FILE__);
Glib::Mutex::Lock guard (connection_lock);
ConnectionList::iterator i = find (_connections.begin(), _connections.end(), connection);
if (i != _connections.end()) {
@ -3317,7 +3323,7 @@ Session::remove_connection (ARDOUR::Connection* connection)
ARDOUR::Connection *
Session::connection_by_name (string name) const
{
LockMonitor lm (connection_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (connection_lock);
for (ConnectionList::const_iterator i = _connections.begin(); i != _connections.end(); ++i) {
if ((*i)->name() == name) {
@ -3334,7 +3340,7 @@ Session::set_edit_mode (EditMode mode)
_edit_mode = mode;
{
LockMonitor lm (playlist_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (playlist_lock);
for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) {
(*i)->set_edit_mode (mode);
@ -3409,7 +3415,7 @@ Session::next_insert_name ()
NamedSelection *
Session::named_selection_by_name (string name)
{
LockMonitor lm (named_selection_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (named_selection_lock);
for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
if ((*i)->name == name) {
return* i;
@ -3422,7 +3428,7 @@ void
Session::add_named_selection (NamedSelection* named_selection)
{
{
LockMonitor lm (named_selection_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (named_selection_lock);
named_selections.insert (named_selections.begin(), named_selection);
}
@ -3437,7 +3443,7 @@ Session::remove_named_selection (NamedSelection* named_selection)
bool removed = false;
{
LockMonitor lm (named_selection_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (named_selection_lock);
NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
@ -3459,7 +3465,7 @@ Session::reset_native_file_format ()
{
// jlc - WHY take routelock?
//RWLockMonitor lm1 (route_lock, true, __LINE__, __FILE__);
RWLockMonitor lm2 (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm2 (diskstream_lock);
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
(*i)->reset_write_sources (false);
@ -3469,7 +3475,7 @@ Session::reset_native_file_format ()
bool
Session::route_name_unique (string n) const
{
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (route_lock);
for (RouteList::const_iterator i = routes.begin(); i != routes.end(); ++i) {
if ((*i)->name() == n) {
@ -3489,7 +3495,7 @@ Session::remove_file_source (FileSource& fs)
uint32_t
Session::n_playlists () const
{
LockMonitor lm (playlist_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (playlist_lock);
return playlists.size();
}
@ -3538,7 +3544,7 @@ Session::add_instant_xml (XMLNode& node, const std::string& dir)
int
Session::freeze (InterThreadInfo& itt)
{
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (route_lock);
for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
@ -3573,7 +3579,7 @@ Session::write_one_track (AudioTrack& track, jack_nframes_t start, jack_nframes_
char * workbuf = 0;
const jack_nframes_t chunk_size = (256 * 1024)/4;
atomic_set (&processing_prohibited, 1);
g_atomic_int_set (&processing_prohibited, 1);
/* call tree *MUST* hold route_lock */
@ -3694,7 +3700,7 @@ Session::write_one_track (AudioTrack& track, jack_nframes_t start, jack_nframes_
delete [] workbuf;
}
atomic_set (&processing_prohibited, 0);
g_atomic_int_set (&processing_prohibited, 0);
itt.done = true;
@ -3714,7 +3720,7 @@ uint32_t
Session::ntracks () const
{
uint32_t n = 0;
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (route_lock);
for (RouteList::const_iterator i = routes.begin(); i != routes.end(); ++i) {
if (dynamic_cast<AudioTrack*> (*i)) {
@ -3729,7 +3735,7 @@ uint32_t
Session::nbusses () const
{
uint32_t n = 0;
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (route_lock);
for (RouteList::const_iterator i = routes.begin(); i != routes.end(); ++i) {
if (dynamic_cast<AudioTrack*> (*i) == 0) {

View file

@ -26,8 +26,9 @@
#include <fcntl.h>
#include <poll.h>
#include <glibmm/thread.h>
#include <pbd/error.h>
#include <pbd/lockmonitor.h>
#include <pbd/pthread_utils.h>
#include <ardour/configuration.h>
@ -73,8 +74,6 @@ Session::start_butler_thread ()
Crossfade::set_buffer_size (dstream_buffer_size);
pthread_cond_init (&butler_paused, 0);
butler_should_run = false;
if (pipe (butler_request_pipe)) {
@ -114,7 +113,7 @@ Session::terminate_butler_thread ()
void
Session::schedule_butler_transport_work ()
{
atomic_inc (&butler_should_do_transport_work);
g_atomic_int_inc (&butler_should_do_transport_work);
summon_butler ();
}
@ -135,19 +134,19 @@ Session::summon_butler ()
void
Session::stop_butler ()
{
LockMonitor lm (butler_request_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (butler_request_lock);
char c = ButlerRequest::Pause;
::write (butler_request_pipe[1], &c, 1);
pthread_cond_wait (&butler_paused, butler_request_lock.mutex());
butler_paused.wait(butler_request_lock);
}
void
Session::wait_till_butler_finished ()
{
LockMonitor lm (butler_request_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (butler_request_lock);
char c = ButlerRequest::Wake;
::write (butler_request_pipe[1], &c, 1);
pthread_cond_wait (&butler_paused, butler_request_lock.mutex());
butler_paused.wait(butler_request_lock);
}
void *
@ -158,7 +157,7 @@ Session::_butler_thread_work (void* arg)
return 0;
}
#define transport_work_requested() atomic_read(&butler_should_do_transport_work)
#define transport_work_requested() g_atomic_int_get(&butler_should_do_transport_work)
void *
Session::butler_thread_work ()
@ -256,7 +255,7 @@ Session::butler_thread_work ()
gettimeofday (&begin, 0);
RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock dsm (diskstream_lock);
for (i = diskstreams.begin(); !transport_work_requested() && butler_should_run && i != diskstreams.end(); ++i) {
@ -355,7 +354,7 @@ Session::butler_thread_work ()
{
LockMonitor lm (butler_request_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (butler_request_lock);
if (butler_should_run && (disk_work_outstanding || transport_work_requested())) {
// for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
@ -365,7 +364,7 @@ Session::butler_thread_work ()
continue;
}
pthread_cond_signal (&butler_paused);
butler_paused.signal();
}
}
@ -398,7 +397,7 @@ Session::overwrite_some_buffers (DiskStream* ds)
} else {
RWLockMonitor dm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock dm (diskstream_lock);
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
(*i)->set_pending_overwrite (true);
}
@ -429,36 +428,36 @@ Session::write_data_rate () const
uint32_t
Session::playback_load ()
{
return (uint32_t) atomic_read (&_playback_load);
return (uint32_t) g_atomic_int_get (&_playback_load);
}
uint32_t
Session::capture_load ()
{
return (uint32_t) atomic_read (&_capture_load);
return (uint32_t) g_atomic_int_get (&_capture_load);
}
uint32_t
Session::playback_load_min ()
{
return (uint32_t) atomic_read (&_playback_load_min);
return (uint32_t) g_atomic_int_get (&_playback_load_min);
}
uint32_t
Session::capture_load_min ()
{
return (uint32_t) atomic_read (&_capture_load_min);
return (uint32_t) g_atomic_int_get (&_capture_load_min);
}
void
Session::reset_capture_load_min ()
{
atomic_set (&_capture_load_min, 100);
g_atomic_int_set (&_capture_load_min, 100);
}
void
Session::reset_playback_load_min ()
{
atomic_set (&_playback_load_min, 100);
g_atomic_int_set (&_playback_load_min, 100);
}

View file

@ -47,7 +47,7 @@ Session::click (jack_nframes_t start, jack_nframes_t nframes, jack_nframes_t off
return;
}
TentativeRWLockMonitor clickm (click_lock, true, __LINE__, __FILE__);
Glib::RWLock::WriterLock clickm (click_lock, Glib::TRY_LOCK);
if (!clickm.locked() || _transport_speed != 1.0 || !_clicking || click_data == 0) {
_click_io->silence (nframes, offset);
@ -209,7 +209,7 @@ Session::setup_click_sounds (int which)
void
Session::clear_clicks ()
{
RWLockMonitor lm (click_lock, true, __LINE__, __FILE__);
Glib::RWLock::WriterLock lm (click_lock);
for (Clicks::iterator i = clicks.begin(); i != clicks.end(); ++i) {
delete *i;

View file

@ -24,7 +24,7 @@
#include <ardour/timestamps.h>
#include <pbd/error.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <ardour/ardour.h>
#include <ardour/session.h>

View file

@ -37,7 +37,7 @@
#include <sigc++/bind.h>
#include <pbd/error.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <ardour/gdither.h>
#include <ardour/timestamps.h>
@ -485,7 +485,7 @@ Session::prepare_to_export (AudioExportSpecification& spec)
/* take everyone out of awrite to avoid disasters */
{
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (route_lock);
for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
(*i)->protect_automation ();
}
@ -494,7 +494,7 @@ Session::prepare_to_export (AudioExportSpecification& spec)
/* get everyone to the right position */
{
RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (diskstream_lock);
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
if ((*i)-> seek (spec.start_frame, true)) {
error << string_compose (_("%1: cannot seek to %2 for export"),
@ -524,7 +524,7 @@ Session::prepare_to_export (AudioExportSpecification& spec)
set_transport_speed (1.0, false);
butler_transport_work ();
atomic_set (&butler_should_do_transport_work, 0);
g_atomic_int_set (&butler_should_do_transport_work, 0);
post_transport ();
/* we are ready to go ... */

View file

@ -28,8 +28,10 @@
#include <midi++/types.h>
#include <midi++/port.h>
#include <midi++/manager.h>
#include <glibmm/thread.h>
#include <pbd/error.h>
#include <pbd/lockmonitor.h>
#include <pbd/pthread_utils.h>
#include <ardour/configuration.h>

View file

@ -30,7 +30,7 @@
#include <midi++/port.h>
#include <midi++/manager.h>
#include <pbd/error.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <pbd/pthread_utils.h>
#include <ardour/configuration.h>
@ -110,7 +110,7 @@ Session::set_midi_control (bool yn)
poke_midi_thread ();
if (_midi_port) {
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock guard (route_lock);
for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
(*i)->reset_midi_control (_midi_port, midi_control);
}
@ -601,7 +601,7 @@ Session::mmc_record_strobe (MIDI::MachineControl &mmc)
*/
save_state ("", true);
atomic_set (&_record_status, Enabled);
g_atomic_int_set (&_record_status, Enabled);
RecordStateChanged (); /* EMIT SIGNAL */
request_transport_speed (1.0);
@ -783,7 +783,7 @@ Session::mmc_record_enable (MIDI::MachineControl &mmc, size_t trk, bool enabled)
if (mmc_control) {
RouteList::iterator i;
RWLockMonitor (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock guard (route_lock);
for (i = routes.begin(); i != routes.end(); ++i) {
AudioTrack *at;
@ -908,7 +908,7 @@ Session::send_full_time_code ()
msg[8] = smpte.frames;
{
LockMonitor lm (midi_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (midi_lock);
if (_mtc_port->midimsg (msg, sizeof (msg))) {
error << _("Session: could not send full MIDI time code") << endmsg;
@ -940,7 +940,7 @@ Session::send_midi_time_code ()
// Send quarter frames up to current time
{
LockMonitor lm (midi_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (midi_lock);
switch(next_quarter_frame_to_send) {
case 0:
@ -1075,7 +1075,7 @@ Session::deliver_mmc (MIDI::MachineControl::Command cmd, jack_nframes_t where)
mmc_buffer[nbytes++] = 0xf7; // terminate SysEx/MMC message
LockMonitor lm (midi_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (midi_lock);
if (_mmc_port->write (mmc_buffer, nbytes) != nbytes) {
error << string_compose(_("MMC: cannot send command %1%2%3"), &hex, cmd, &dec) << endmsg;

View file

@ -23,14 +23,13 @@
#include <algorithm>
#include <unistd.h>
#include <ardour/timestamps.h>
#include <pbd/error.h>
#include <pbd/atomic.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <ardour/ardour.h>
#include <ardour/session.h>
#include <ardour/timestamps.h>
#include <ardour/diskstream.h>
#include <ardour/audioengine.h>
#include <ardour/slave.h>
@ -54,7 +53,7 @@ Session::process (jack_nframes_t nframes)
}
if (non_realtime_work_pending()) {
if (atomic_read (&butler_should_do_transport_work) == 0) {
if (g_atomic_int_get (&butler_should_do_transport_work) == 0) {
post_transport ();
}
}
@ -85,7 +84,7 @@ Session::no_roll (jack_nframes_t nframes, jack_nframes_t offset)
this is really bad ...
*/
if (atomic_read (&processing_prohibited)) {
if (g_atomic_int_get (&processing_prohibited)) {
for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
(*i)->silence (nframes, offset);
}
@ -222,15 +221,15 @@ Session::commit_diskstreams (jack_nframes_t nframes, bool &needs_butler)
cworst = min (cworst, (*i)->capture_buffer_load());
}
uint32_t pmin = atomic_read (&_playback_load);
uint32_t pminold = atomic_read (&_playback_load_min);
uint32_t cmin = atomic_read (&_capture_load);
uint32_t cminold = atomic_read (&_capture_load_min);
uint32_t pmin = g_atomic_int_get (&_playback_load);
uint32_t pminold = g_atomic_int_get (&_playback_load_min);
uint32_t cmin = g_atomic_int_get (&_capture_load);
uint32_t cminold = g_atomic_int_get (&_capture_load_min);
atomic_set (&_playback_load, (uint32_t) floor (pworst * 100.0f));
atomic_set (&_capture_load, (uint32_t) floor (cworst * 100.0f));
atomic_set (&_playback_load_min, min (pmin, pminold));
atomic_set (&_capture_load_min, min (cmin, cminold));
g_atomic_int_set (&_playback_load, (uint32_t) floor (pworst * 100.0f));
g_atomic_int_set (&_capture_load, (uint32_t) floor (cworst * 100.0f));
g_atomic_int_set (&_playback_load_min, min (pmin, pminold));
g_atomic_int_set (&_capture_load_min, min (cmin, cminold));
if (actively_recording()) {
set_dirty();
@ -280,8 +279,8 @@ Session::process_with_events (jack_nframes_t nframes)
end_frame = _transport_frame + nframes;
{
TentativeRWLockMonitor rm (route_lock, false, __LINE__, __FILE__);
TentativeRWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock rm (route_lock, Glib::TRY_LOCK);
Glib::RWLock::ReaderLock dsm (diskstream_lock, Glib::TRY_LOCK);
Event* this_event;
Events::iterator the_next_one;
@ -557,7 +556,7 @@ Session::follow_slave (jack_nframes_t nframes, jack_nframes_t offset)
if (slave_state == Waiting) {
// cerr << "waiting at " << slave_transport_frame << endl;
TentativeRWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock dsm (diskstream_lock, Glib::TRY_LOCK);
if (dsm.locked() && slave_transport_frame >= slave_wait_end) {
// cerr << "\tstart at " << _transport_frame << endl;
@ -679,7 +678,7 @@ Session::follow_slave (jack_nframes_t nframes, jack_nframes_t offset)
bool need_butler;
TentativeRWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock dsm (diskstream_lock, Glib::TRY_LOCK);
if (!dsm.locked()) {
goto noroll;
}
@ -730,8 +729,8 @@ Session::process_without_events (jack_nframes_t nframes)
long frames_moved;
{
TentativeRWLockMonitor rm (route_lock, false, __LINE__, __FILE__);
TentativeRWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock rm (route_lock, Glib::TRY_LOCK);
Glib::RWLock::ReaderLock dsm (diskstream_lock, Glib::TRY_LOCK);
if (!rm.locked() || !dsm.locked() || (post_transport_work & (PostTransportLocate|PostTransportStop))) {
no_roll (nframes, 0);
@ -802,7 +801,7 @@ Session::process_without_events (jack_nframes_t nframes)
void
Session::process_audition (jack_nframes_t nframes)
{
TentativeRWLockMonitor rm (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock rm (route_lock, Glib::TRY_LOCK);
Event* ev;
if (rm.locked()) {

View file

@ -44,14 +44,15 @@
#include <sys/param.h>
#endif
#include <glibmm.h>
#include <midi++/mmc.h>
#include <midi++/port.h>
#include <pbd/error.h>
#include <pbd/dirname.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <pbd/pathscanner.h>
#include <pbd/pthread_utils.h>
#include <pbd/basename.h>
#include <pbd/strsplit.h>
#include <ardour/audioengine.h>
@ -118,7 +119,7 @@ Session::first_stage_init (string fullpath, string snapshot_name)
_tempo_map = new TempoMap (_current_frame_rate);
_tempo_map->StateChanged.connect (mem_fun (*this, &Session::tempo_map_changed));
atomic_set (&processing_prohibited, 0);
g_atomic_int_set (&processing_prohibited, 0);
send_cnt = 0;
insert_cnt = 0;
_transport_speed = 0;
@ -129,7 +130,7 @@ Session::first_stage_init (string fullpath, string snapshot_name)
end_location = new Location (0, 0, _("end"), Location::Flags ((Location::IsMark|Location::IsEnd)));
start_location = new Location (0, 0, _("start"), Location::Flags ((Location::IsMark|Location::IsStart)));
_end_location_is_free = true;
atomic_set (&_record_status, Disabled);
g_atomic_int_set (&_record_status, Disabled);
auto_play = false;
punch_in = false;
punch_out = false;
@ -170,12 +171,12 @@ Session::first_stage_init (string fullpath, string snapshot_name)
midi_control = true;
mmc = 0;
post_transport_work = PostTransportWork (0);
atomic_set (&butler_should_do_transport_work, 0);
atomic_set (&butler_active, 0);
atomic_set (&_playback_load, 100);
atomic_set (&_capture_load, 100);
atomic_set (&_playback_load_min, 100);
atomic_set (&_capture_load_min, 100);
g_atomic_int_set (&butler_should_do_transport_work, 0);
g_atomic_int_set (&butler_active, 0);
g_atomic_int_set (&_playback_load, 100);
g_atomic_int_set (&_capture_load, 100);
g_atomic_int_set (&_playback_load_min, 100);
g_atomic_int_set (&_capture_load_min, 100);
pending_audition_region = 0;
_edit_mode = Slide;
pending_edit_mode = _edit_mode;
@ -1334,7 +1335,7 @@ Session::state(bool full_state)
child = node->add_child ("Sources");
if (full_state) {
LockMonitor sl (source_lock, __LINE__, __FILE__);
Glib::Mutex::Lock sl (source_lock);
for (SourceList::iterator siter = sources.begin(); siter != sources.end(); ++siter) {
@ -1363,7 +1364,7 @@ Session::state(bool full_state)
child = node->add_child ("Regions");
if (full_state) {
LockMonitor rl (region_lock, __LINE__, __FILE__);
Glib::Mutex::Lock rl (region_lock);
for (AudioRegionList::const_iterator i = audio_regions.begin(); i != audio_regions.end(); ++i) {
@ -1378,7 +1379,7 @@ Session::state(bool full_state)
child = node->add_child ("DiskStreams");
{
RWLockMonitor dl (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock dl (diskstream_lock);
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
if (!(*i)->hidden()) {
child->add_child_nocopy ((*i)->get_state());
@ -1390,7 +1391,7 @@ Session::state(bool full_state)
child = node->add_child ("Connections");
{
LockMonitor lm (connection_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (connection_lock);
for (ConnectionList::iterator i = _connections.begin(); i != _connections.end(); ++i) {
if (!(*i)->system_dependent()) {
child->add_child_nocopy ((*i)->get_state());
@ -1400,7 +1401,7 @@ Session::state(bool full_state)
child = node->add_child ("Routes");
{
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (route_lock);
RoutePublicOrderSorter cmp;
RouteList public_order(routes);
@ -1803,7 +1804,7 @@ Session::get_sources_as_xml ()
{
XMLNode* node = new XMLNode (X_("Sources"));
LockMonitor lm (source_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (source_lock);
for (SourceList::iterator i = sources.begin(); i != sources.end(); ++i) {
node->add_child_nocopy ((*i).second->get_state());
@ -1958,7 +1959,7 @@ Session::refresh_disk_space ()
#if HAVE_SYS_VFS_H
struct statfs statfsbuf;
vector<space_and_path>::iterator i;
LockMonitor lm (space_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (space_lock);
double scale;
/* get freespace on every FS that is part of the session path */
@ -2399,7 +2400,7 @@ Session::load_route_groups (const XMLNode& node, bool edit)
void
Session::swap_configuration(Configuration** new_config)
{
RWLockMonitor lm (route_lock, true, __LINE__, __FILE__); // jlc - WHY?
Glib::RWLock::WriterLock lm (route_lock); // jlc - WHY?
Configuration* tmp = *new_config;
*new_config = Config;
Config = tmp;
@ -2409,7 +2410,7 @@ Session::swap_configuration(Configuration** new_config)
void
Session::copy_configuration(Configuration* new_config)
{
RWLockMonitor lm (route_lock, true, __LINE__, __FILE__);
Glib::RWLock::WriterLock lm (route_lock);
new_config = new Configuration(*Config);
}
@ -2588,7 +2589,7 @@ Session::GlobalRouteBooleanState
Session::get_global_route_boolean (bool (Route::*method)(void) const)
{
GlobalRouteBooleanState s;
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (route_lock);
for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
if (!(*i)->hidden()) {
@ -2608,7 +2609,7 @@ Session::GlobalRouteMeterState
Session::get_global_route_metering ()
{
GlobalRouteMeterState s;
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (route_lock);
for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
if (!(*i)->hidden()) {
@ -3065,13 +3066,13 @@ Session::cleanup_sources (Session::cleanup_report& rep)
on whichever filesystem it was already on.
*/
newpath = PBD::dirname (*x);
newpath = PBD::dirname (newpath);
newpath = Glib::path_get_dirname (*x);
newpath = Glib::path_get_dirname (newpath);
newpath += '/';
newpath += dead_sound_dir_name;
newpath += '/';
newpath += PBD::basename ((*x));
newpath += Glib::path_get_basename ((*x));
if (access (newpath.c_str(), F_OK) == 0) {

View file

@ -27,7 +27,7 @@
#include <pbd/undo.h>
#include <pbd/error.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <pbd/pthread_utils.h>
#include <midi++/mmc.h>
@ -190,8 +190,8 @@ Session::realtime_stop (bool abort)
void
Session::butler_transport_work ()
{
RWLockMonitor rm (route_lock, false, __LINE__, __FILE__);
RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock rm (route_lock);
Glib::RWLock::ReaderLock dsm (diskstream_lock);
if (post_transport_work & PostTransportCurveRealloc) {
for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
@ -240,13 +240,13 @@ Session::butler_transport_work ()
non_realtime_set_audition ();
}
atomic_dec (&butler_should_do_transport_work);
g_atomic_int_dec_and_test (&butler_should_do_transport_work);
}
void
Session::non_realtime_set_speed ()
{
RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (diskstream_lock);
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
(*i)->non_realtime_set_speed ();
@ -256,7 +256,7 @@ Session::non_realtime_set_speed ()
void
Session::non_realtime_overwrite ()
{
RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (diskstream_lock);
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
if ((*i)->pending_overwrite) {
@ -395,9 +395,9 @@ Session::non_realtime_stop (bool abort)
*/
if (!Config->get_latched_record_enable()) {
atomic_set (&_record_status, Disabled);
g_atomic_int_set (&_record_status, Disabled);
} else {
atomic_set (&_record_status, Enabled);
g_atomic_int_set (&_record_status, Enabled);
}
RecordStateChanged (); /* emit signal */
}
@ -625,7 +625,7 @@ Session::locate (jack_nframes_t target_frame, bool with_roll, bool with_flush, b
/* this is functionally what clear_clicks() does but with a tentative lock */
TentativeRWLockMonitor clickm (click_lock, true, __LINE__, __FILE__);
Glib::RWLock::WriterLock clickm (click_lock, Glib::TRY_LOCK);
if (clickm.locked()) {
@ -644,7 +644,7 @@ Session::locate (jack_nframes_t target_frame, bool with_roll, bool with_flush, b
a non-tentative rwlock here, because the action must occur.
The rarity and short potential lock duration makes this "OK"
*/
RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock dsm (diskstream_lock);
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
if ((*i)->record_enabled ()) {
//cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl;
@ -659,7 +659,7 @@ Session::locate (jack_nframes_t target_frame, bool with_roll, bool with_flush, b
a non-tentative rwlock here, because the action must occur.
The rarity and short potential lock duration makes this "OK"
*/
RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock dsm (diskstream_lock);
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
if ((*i)->record_enabled ()) {
//cerr << "switching to input" << __FILE__ << __LINE__ << endl << endl;
@ -703,7 +703,7 @@ Session::set_transport_speed (float speed, bool abort)
a non-tentative rwlock here, because the action must occur.
The rarity and short potential lock duration makes this "OK"
*/
RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock dsm (diskstream_lock);
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
if ((*i)->record_enabled ()) {
//cerr << "switching to input" << __FILE__ << __LINE__ << endl << endl;
@ -729,7 +729,7 @@ Session::set_transport_speed (float speed, bool abort)
a non-tentative rwlock here, because the action must occur.
The rarity and short potential lock duration makes this "OK"
*/
RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock dsm (diskstream_lock);
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
if (auto_input && (*i)->record_enabled ()) {
//cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl;
@ -1156,7 +1156,7 @@ Session::engine_halted ()
the picture.
*/
atomic_set (&butler_should_do_transport_work, 0);
g_atomic_int_set (&butler_should_do_transport_work, 0);
post_transport_work = PostTransportWork (0);
stop_butler ();
@ -1192,8 +1192,8 @@ Session::update_latency_compensation (bool with_stop, bool abort)
return;
}
RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
RWLockMonitor lm2 (diskstream_lock, false, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm (route_lock);
Glib::RWLock::ReaderLock lm2 (diskstream_lock);
_worst_track_latency = 0;
for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {

View file

@ -138,7 +138,7 @@ SndFileSource::read (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char
real_cnt = cnt * _info.channels;
{
LockMonitor lm (_tmpbuf_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_tmpbuf_lock);
if (tmpbufsize < real_cnt) {

View file

@ -29,7 +29,7 @@
#include <iomanip>
#include <algorithm>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <pbd/xml++.h>
#include <pbd/pthread_utils.h>
@ -41,13 +41,12 @@ using std::min;
using std::max;
using namespace ARDOUR;
using namespace PBD;
sigc::signal<void,Source *> Source::SourceCreated;
pthread_t Source::peak_thread;
bool Source::have_peak_thread = false;
vector<Source*> Source::pending_peak_sources;
PBD::Lock Source::pending_peak_sources_lock;
Glib::StaticMutex Source::pending_peak_sources_lock = GLIBMM_STATIC_MUTEX_INIT;
int Source::peak_request_pipe[2];
bool Source::_build_missing_peakfiles = false;
@ -142,19 +141,19 @@ Source::peak_thread_work (void* arg)
PBD::ThreadCreated (pthread_self(), X_("Peak"));
struct pollfd pfd[1];
LockMonitor lm (pending_peak_sources_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (pending_peak_sources_lock);
while (true) {
pfd[0].fd = peak_request_pipe[0];
pfd[0].events = POLLIN|POLLERR|POLLHUP;
pthread_mutex_unlock (pending_peak_sources_lock.mutex());
pending_peak_sources_lock.unlock();
if (poll (pfd, 1, -1) < 0) {
if (errno == EINTR) {
pthread_mutex_lock (pending_peak_sources_lock.mutex());
pending_peak_sources_lock.lock();
continue;
}
@ -204,16 +203,16 @@ Source::peak_thread_work (void* arg)
}
}
pthread_mutex_lock (pending_peak_sources_lock.mutex());
pending_peak_sources_lock.lock();
while (!pending_peak_sources.empty()) {
Source* s = pending_peak_sources.front();
pending_peak_sources.erase (pending_peak_sources.begin());
pthread_mutex_unlock (pending_peak_sources_lock.mutex());
pending_peak_sources_lock.unlock();
s->build_peaks();
pthread_mutex_lock (pending_peak_sources_lock.mutex());
pending_peak_sources_lock.lock();
}
}
@ -272,7 +271,7 @@ Source::queue_for_peaks (Source& source)
{
if (have_peak_thread) {
LockMonitor lm (pending_peak_sources_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (pending_peak_sources_lock);
source.next_peak_clear_should_notify = true;
@ -291,7 +290,7 @@ void Source::clear_queue_for_peaks ()
{
/* this is done to cancel a group of running peak builds */
if (have_peak_thread) {
LockMonitor lm (pending_peak_sources_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (pending_peak_sources_lock);
pending_peak_sources.clear ();
}
}
@ -301,7 +300,7 @@ bool
Source::peaks_ready (sigc::slot<void> the_slot, sigc::connection& conn) const
{
bool ret;
LockMonitor lm (_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_lock);
/* check to see if the peak data is ready. if not
connect the slot while still holding the lock.
@ -388,7 +387,7 @@ Source::initialize_peakfile (bool newfile, string audio_path)
int
Source::read_peaks (PeakData *peaks, jack_nframes_t npeaks, jack_nframes_t start, jack_nframes_t cnt, double samples_per_visual_peak) const
{
LockMonitor lm (_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_lock);
double scale;
double expected_peaks;
PeakData::PeakDatum xmax;
@ -699,7 +698,7 @@ Source::build_peaks ()
list<PeakBuildRecord*> copy;
{
LockMonitor lm (_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_lock);
copy = pending_peak_builds;
pending_peak_builds.clear ();
}
@ -719,7 +718,7 @@ Source::build_peaks ()
}
{
LockMonitor lm (_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_lock);
if (status == 0) {
_peaks_built = true;
@ -830,7 +829,7 @@ Source::do_build_peak (jack_nframes_t first_frame, jack_nframes_t cnt)
void
Source::build_peaks_from_scratch ()
{
LockMonitor lp (_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lp (_lock);
next_peak_clear_should_notify = true;
pending_peak_builds.push_back (new PeakBuildRecord (0, _length));
@ -883,7 +882,7 @@ Source::available_peaks (double zoom_factor) const
}
{
LockMonitor lm (_lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (_lock);
end = lseek (peakfile, 0, SEEK_END);
}

View file

@ -25,7 +25,7 @@
#include <sigc++/bind.h>
#include <pbd/lockmonitor.h>
#include <glibmm/thread.h>
#include <pbd/xml++.h>
#include <ardour/tempo.h>
#include <ardour/utils.h>
@ -240,7 +240,7 @@ TempoMap::move_metric_section (MetricSection& section, const BBT_Time& when)
return 1;
}
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
MetricSectionSorter cmp;
BBT_Time corrected (when);
@ -283,7 +283,7 @@ TempoMap::remove_tempo (const TempoSection& tempo)
bool removed = false;
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
Metrics::iterator i;
for (i = metrics->begin(); i != metrics->end(); ++i) {
@ -310,7 +310,7 @@ TempoMap::remove_meter (const MeterSection& tempo)
bool removed = false;
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
Metrics::iterator i;
for (i = metrics->begin(); i != metrics->end(); ++i) {
@ -361,7 +361,7 @@ void
TempoMap::add_tempo (const Tempo& tempo, BBT_Time where)
{
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
/* new tempos always start on a beat */
@ -381,7 +381,7 @@ TempoMap::replace_tempo (TempoSection& existing, const Tempo& replacement)
bool replaced = false;
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
Metrics::iterator i;
for (i = metrics->begin(); i != metrics->end(); ++i) {
@ -411,7 +411,7 @@ void
TempoMap::add_meter (const Meter& meter, BBT_Time where)
{
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
/* a new meter always starts a new bar on the first beat. so
round the start time appropriately. remember that
@ -443,7 +443,7 @@ TempoMap::replace_meter (MeterSection& existing, const Meter& replacement)
bool replaced = false;
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
Metrics::iterator i;
for (i = metrics->begin(); i != metrics->end(); ++i) {
@ -611,7 +611,7 @@ TempoMap::metric_at (BBT_Time bbt) const
void
TempoMap::bbt_time (jack_nframes_t frame, BBT_Time& bbt) const
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
bbt_time_unlocked (frame, bbt);
}
@ -759,7 +759,7 @@ TempoMap::bbt_duration_at (jack_nframes_t pos, const BBT_Time& bbt, int dir) con
bbt_time(pos,when);
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
frames = bbt_duration_at_unlocked (when, bbt,dir);
}
@ -896,7 +896,7 @@ TempoMap::bbt_duration_at_unlocked (const BBT_Time& when, const BBT_Time& bbt, i
jack_nframes_t
TempoMap::round_to_bar (jack_nframes_t fr, int dir)
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
return round_to_type (fr, dir, Bar);
}
@ -904,7 +904,7 @@ TempoMap::round_to_bar (jack_nframes_t fr, int dir)
jack_nframes_t
TempoMap::round_to_beat (jack_nframes_t fr, int dir)
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
return round_to_type (fr, dir, Beat);
}
@ -912,7 +912,7 @@ jack_nframes_t
TempoMap::round_to_beat_subdivision (jack_nframes_t fr, int sub_num)
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
TempoMap::BBTPointList::iterator i;
TempoMap::BBTPointList *more_zoomed_bbt_points;
jack_nframes_t frame_one_beats_worth;
@ -1185,7 +1185,7 @@ TempoMap::meter_at (jack_nframes_t frame)
XMLNode&
TempoMap::get_state ()
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
Metrics::const_iterator i;
XMLNode *root = new XMLNode ("TempoMap");
@ -1200,7 +1200,7 @@ int
TempoMap::set_state (const XMLNode& node)
{
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
XMLNodeList nlist;
XMLNodeConstIterator niter;
@ -1292,7 +1292,7 @@ TempoMap::get_memento () const
Change
TempoMap::restore_state (StateManager::State& state)
{
LockMonitor lm (lock, __LINE__, __FILE__);
Glib::Mutex::Lock lm (lock);
TempoMapState* tmstate = dynamic_cast<TempoMapState*> (&state);

View file

@ -25,6 +25,7 @@
#include <gtkmm2ext/fastmeter.h>
#include <gtkmm2ext/utils.h>
#include <gtkmm/style.h>
#include <string.h>
using namespace Gtk;
using namespace Gdk;
@ -32,15 +33,15 @@ using namespace Glib;
using namespace Gtkmm2ext;
using namespace std;
string FastMeter::v_image_path;
string FastMeter::h_image_path;
RefPtr<Pixbuf> FastMeter::v_pixbuf;
gint FastMeter::v_pixheight = 0;
gint FastMeter::v_pixwidth = 0;
RefPtr<Pixbuf> FastMeter::h_pixbuf;
gint FastMeter::h_pixheight = 0;
gint FastMeter::h_pixwidth = 0;
int FastMeter::min_v_pixbuf_size = 50;
int FastMeter::max_v_pixbuf_size = 1024;
Glib::RefPtr<Gdk::Pixbuf>* FastMeter::v_pixbuf_cache = 0;
int FastMeter::min_h_pixbuf_size = 50;
int FastMeter::max_h_pixbuf_size = 1024;
Glib::RefPtr<Gdk::Pixbuf>* FastMeter::h_pixbuf_cache = 0;
FastMeter::FastMeter (long hold, unsigned long dimen, Orientation o)
{
@ -56,46 +57,184 @@ FastMeter::FastMeter (long hold, unsigned long dimen, Orientation o)
pixrect.x = 0;
pixrect.y = 0;
if (!v_image_path.empty() && v_pixbuf == 0) {
v_pixbuf = Pixbuf::create_from_file (v_image_path);
v_pixheight = v_pixbuf->get_height();
v_pixwidth = v_pixbuf->get_width();
}
if (!h_image_path.empty() && h_pixbuf == 0) {
h_pixbuf = Pixbuf::create_from_file (h_image_path);
h_pixheight = h_pixbuf->get_height();
h_pixwidth = h_pixbuf->get_width();
}
if (orientation == Vertical) {
pixrect.width = min (v_pixwidth, (gint) dimen);
pixrect.height = v_pixheight;
pixbuf = request_vertical_meter(250);
} else {
pixrect.width = h_pixwidth;
pixrect.height = min (h_pixheight, (gint) dimen);
pixbuf = request_horizontal_meter(186);
}
pixheight = pixbuf->get_height();
pixwidth = pixbuf->get_width();
if (orientation == Vertical) {
pixrect.width = min (pixwidth, (gint) dimen);
pixrect.height = pixheight;
} else {
pixrect.width = pixwidth;
pixrect.height = min (pixheight, (gint) dimen);
}
request_width = pixrect.width;
request_height= pixrect.height;
}
Glib::RefPtr<Gdk::Pixbuf> FastMeter::request_vertical_meter(int length)
{
if (length < min_v_pixbuf_size)
length = min_v_pixbuf_size;
if (length > max_v_pixbuf_size)
length = max_v_pixbuf_size;
int index = length - 1;
if (v_pixbuf_cache == 0) {
v_pixbuf_cache = (Glib::RefPtr<Gdk::Pixbuf>*) malloc(sizeof(Glib::RefPtr<Gdk::Pixbuf>) * max_v_pixbuf_size);
memset(v_pixbuf_cache,0,sizeof(Glib::RefPtr<Gdk::Pixbuf>) * max_v_pixbuf_size);
}
Glib::RefPtr<Gdk::Pixbuf> ret = v_pixbuf_cache[index];
if (ret)
return ret;
guint8* data;
int width = 5;
int height = length;
data = (guint8*) malloc(width*height * 3);
guint8 r,g,b;
r=0;
g=255;
b=0;
// fake log calculation copied from log_meter.h
// actual calculation:
// log_meter(0.0f) =
// def = (0.0f + 20.0f) * 2.5f + 50f
// return def / 115.0f
int knee = (int)floor((float)height * 100.0f / 115.0f);
int y;
for (y = 0; y < knee / 2; y++) {
r = (guint8)floor(255.0 * (float)y/(float)(knee / 2));
for (int x = 0; x < width; x++) {
data[ (x+(height-y-1)*width) * 3 + 0 ] = r;
data[ (x+(height-y-1)*width) * 3 + 1 ] = g;
data[ (x+(height-y-1)*width) * 3 + 2 ] = b;
}
}
for (; y < knee; y++) {
g = 255 - (guint8)floor(170.0 * (float)(y - knee/ 2)/(float)(knee / 2));
for (int x = 0; x < width; x++) {
data[ (x+(height-y-1)*width) * 3 + 0 ] = r;
data[ (x+(height-y-1)*width) * 3 + 1 ] = g;
data[ (x+(height-y-1)*width) * 3 + 2 ] = b;
}
}
r=255;
g=0;
b=0;
for (; y < height; y++) {
for (int x = 0; x < width; x++) {
data[ (x+(height-y-1)*width) * 3 + 0 ] = r;
data[ (x+(height-y-1)*width) * 3 + 1 ] = g;
data[ (x+(height-y-1)*width) * 3 + 2 ] = b;
}
}
ret = Pixbuf::create_from_data(data, COLORSPACE_RGB, false, 8, width, height, width * 3);
v_pixbuf_cache[index] = ret;
return ret;
}
Glib::RefPtr<Gdk::Pixbuf> FastMeter::request_horizontal_meter(int length)
{
if (length < min_h_pixbuf_size)
length = min_h_pixbuf_size;
if (length > max_h_pixbuf_size)
length = max_h_pixbuf_size;
int index = length - 1;
if (h_pixbuf_cache == 0) {
h_pixbuf_cache = (Glib::RefPtr<Gdk::Pixbuf>*) malloc(sizeof(Glib::RefPtr<Gdk::Pixbuf>) * max_h_pixbuf_size);
memset(h_pixbuf_cache,0,sizeof(Glib::RefPtr<Gdk::Pixbuf>) * max_h_pixbuf_size);
}
Glib::RefPtr<Gdk::Pixbuf> ret = h_pixbuf_cache[index];
if (ret)
return ret;
guint8* data;
int width = length;
int height = 5;
data = (guint8*) malloc(width*height * 3);
guint8 r,g,b;
r=0;
g=255;
b=0;
// fake log calculation copied from log_meter.h
// actual calculation:
// log_meter(0.0f) =
// def = (0.0f + 20.0f) * 2.5f + 50f
// return def / 115.0f
int knee = (int)floor((float)width * 100.0f / 115.0f);
int x;
for (x = 0; x < knee / 2; x++) {
r = (guint8)floor(255.0 * (float)x/(float)(knee / 2));
for (int y = 0; y < height; y++) {
data[ (x+(height-y-1)*width) * 3 + 0 ] = r;
data[ (x+(height-y-1)*width) * 3 + 1 ] = g;
data[ (x+(height-y-1)*width) * 3 + 2 ] = b;
}
}
for (; x < knee; x++) {
g = 255 - (guint8)floor(170.0 * (float)(x - knee/ 2)/(float)(knee / 2));
for (int y = 0; y < height; y++) {
data[ (x+(height-y-1)*width) * 3 + 0 ] = r;
data[ (x+(height-y-1)*width) * 3 + 1 ] = g;
data[ (x+(height-y-1)*width) * 3 + 2 ] = b;
}
}
r=255;
g=0;
b=0;
for (; x < width; x++) {
for (int y = 0; y < height; y++) {
data[ (x+(height-y-1)*width) * 3 + 0 ] = r;
data[ (x+(height-y-1)*width) * 3 + 1 ] = g;
data[ (x+(height-y-1)*width) * 3 + 2 ] = b;
}
}
ret = Pixbuf::create_from_data(data, COLORSPACE_RGB, false, 8, width, height, width * 3);
h_pixbuf_cache[index] = ret;
return ret;
}
FastMeter::~FastMeter ()
{
}
void
FastMeter::set_vertical_xpm (std::string path)
{
v_image_path = path;
}
void
FastMeter::set_horizontal_xpm (std::string path)
{
h_image_path = path;
}
void
FastMeter::set_hold_count (long val)
{
@ -113,8 +252,63 @@ FastMeter::set_hold_count (long val)
void
FastMeter::on_size_request (GtkRequisition* req)
{
req->width = request_width;
if (orientation == Vertical) {
req->height = request_height;
req->height = max(req->height, min_v_pixbuf_size);
req->height = min(req->height, max_v_pixbuf_size);
req->width = 5;
} else {
req->width = request_width;
req->width = max(req->width, min_h_pixbuf_size);
req->width = min(req->width, max_h_pixbuf_size);
req->height = 5;
}
}
void
FastMeter::on_size_allocate (Gtk::Allocation &alloc)
{
if (orientation == Vertical) {
if (alloc.get_width() != 5) {
alloc.set_width(5);
}
int h = alloc.get_height();
h = max(h, min_v_pixbuf_size);
h = min(h, max_v_pixbuf_size);
if ( h != alloc.get_height())
alloc.set_height(h);
if (pixheight != h) {
pixbuf = request_vertical_meter(h);
}
} else {
if (alloc.get_height() != 5) {
alloc.set_height(5);
}
int w = alloc.get_width();
w = max(w, min_h_pixbuf_size);
w = min(w, max_h_pixbuf_size);
if ( w != alloc.get_width())
alloc.set_width(w);
if (pixwidth != w) {
pixbuf = request_horizontal_meter(w);
}
}
pixheight = pixbuf->get_height();
pixwidth = pixbuf->get_width();
DrawingArea::on_size_allocate(alloc);
}
bool
@ -134,13 +328,13 @@ FastMeter::vertical_expose (GdkEventExpose* ev)
GdkRectangle intersection;
GdkRectangle background;
top_of_meter = (gint) floor (v_pixheight * current_level);
top_of_meter = (gint) floor (pixheight * current_level);
pixrect.height = top_of_meter;
background.x = 0;
background.y = 0;
background.width = pixrect.width;
background.height = v_pixheight - top_of_meter;
background.height = pixheight - top_of_meter;
if (gdk_rectangle_intersect (&background, &ev->area, &intersection)) {
get_window()->draw_rectangle (get_style()->get_black_gc(), true,
@ -149,62 +343,71 @@ FastMeter::vertical_expose (GdkEventExpose* ev)
}
if (gdk_rectangle_intersect (&pixrect, &ev->area, &intersection)) {
/* draw the part of the meter image that we need. the area we draw is bounded "in reverse" (top->bottom)
*/
get_window()->draw_pixbuf(get_style()->get_fg_gc(get_state()), v_pixbuf,
intersection.x, v_pixheight - top_of_meter,
intersection.x, v_pixheight - top_of_meter,
// draw the part of the meter image that we need. the area we draw is bounded "in reverse" (top->bottom)
get_window()->draw_pixbuf(get_style()->get_fg_gc(get_state()), pixbuf,
intersection.x, pixheight - top_of_meter,
intersection.x, pixheight - top_of_meter,
intersection.width, intersection.height,
Gdk::RGB_DITHER_NONE, 0, 0);
}
/* draw peak bar */
// draw peak bar
if (hold_state && intersection.width > 0) {
gint y = pixheight - (gint) floor (pixheight * current_peak);
if (hold_state) {
get_window()->draw_pixbuf (get_style()->get_fg_gc(get_state()), v_pixbuf,
intersection.x, v_pixheight - (gint) floor (v_pixheight * current_peak),
intersection.x, v_pixheight - (gint) floor (v_pixheight * current_peak),
get_window()->draw_pixbuf (get_style()->get_fg_gc(get_state()), pixbuf,
intersection.x, y,
intersection.x, y,
intersection.width, 3,
Gdk::RGB_DITHER_NONE, 0, 0);
}
return true;
return TRUE;
}
bool
FastMeter::horizontal_expose (GdkEventExpose* ev)
{
GdkRectangle intersection;
gint right_of_meter;
GdkRectangle intersection;
GdkRectangle background;
right_of_meter = (gint) floor (h_pixwidth * current_level);
right_of_meter = (gint) floor (pixwidth * current_level);
pixrect.width = right_of_meter;
background.x = 0;
background.y = 0;
background.width = pixwidth - right_of_meter;
background.height = pixrect.height;
if (gdk_rectangle_intersect (&background, &ev->area, &intersection)) {
get_window()->draw_rectangle (get_style()->get_black_gc(), true,
intersection.x + right_of_meter, intersection.y,
intersection.width, intersection.height);
}
if (gdk_rectangle_intersect (&pixrect, &ev->area, &intersection)) {
/* draw the part of the meter image that we need.
*/
get_window()->draw_pixbuf (get_style()->get_fg_gc(get_state()), h_pixbuf,
// draw the part of the meter image that we need. the area we draw is bounded "in reverse" (top->bottom)
get_window()->draw_pixbuf(get_style()->get_fg_gc(get_state()), pixbuf,
intersection.x, intersection.y,
intersection.x, intersection.y,
intersection.width, intersection.height,
Gdk::RGB_DITHER_NONE, 0, 0);
}
/* draw peak bar */
// draw peak bar
// XXX: peaks don't work properly
/*
if (hold_state && intersection.height > 0) {
gint x = (gint) floor(pixwidth * current_peak);
if (hold_state) {
get_window()->draw_pixbuf (get_style()->get_fg_gc(get_state()), h_pixbuf,
right_of_meter, intersection.y,
right_of_meter, intersection.y,
get_window()->draw_pixbuf (get_style()->get_fg_gc(get_state()), pixbuf,
x, intersection.y,
x, intersection.y,
3, intersection.height,
Gdk::RGB_DITHER_NONE, 0, 0);
}
*/
return true;
}

View file

@ -46,23 +46,16 @@ class FastMeter : public Gtk::DrawingArea {
long hold_count() { return hold_cnt; }
void set_hold_count (long);
static void set_horizontal_xpm (std::string);
static void set_vertical_xpm (std::string);
protected:
bool on_expose_event (GdkEventExpose*);
void on_size_request (GtkRequisition*);
void on_size_allocate (Gtk::Allocation&);
private:
static std::string h_image_path;
static std::string v_image_path;
static Glib::RefPtr<Gdk::Pixbuf> h_pixbuf;
static gint h_pixheight;
static gint h_pixwidth;
static Glib::RefPtr<Gdk::Pixbuf> v_pixbuf;
static gint v_pixheight;
static gint v_pixwidth;
Glib::RefPtr<Gdk::Pixbuf> pixbuf;
gint pixheight;
gint pixwidth;
Orientation orientation;
GdkRectangle pixrect;
@ -76,6 +69,18 @@ class FastMeter : public Gtk::DrawingArea {
bool vertical_expose (GdkEventExpose*);
bool horizontal_expose (GdkEventExpose*);
static Glib::RefPtr<Gdk::Pixbuf> request_vertical_meter(int);
static Glib::RefPtr<Gdk::Pixbuf> *v_pixbuf_cache;
static int min_v_pixbuf_size;
static int max_v_pixbuf_size;
static Glib::RefPtr<Gdk::Pixbuf> request_horizontal_meter(int);
static Glib::RefPtr<Gdk::Pixbuf> *h_pixbuf_cache;
static int min_h_pixbuf_size;
static int max_h_pixbuf_size;
};

View file

@ -36,11 +36,10 @@
#include <gdkmm/color.h>
#include <pbd/abstract_ui.h>
#include <pbd/ringbufferNPT.h>
#include <pbd/atomic.h>
#include <pbd/pool.h>
#include <pbd/error.h>
#include <pbd/receiver.h>
#include <pbd/lockmonitor.h>
using std::string;
using std::queue;

14
libs/libsndfile/AUTHORS Normal file
View file

@ -0,0 +1,14 @@
The main author of libsndfile is Erik de Castro Lopo <erikd@mega-nerd.com>.
The code in the src/GSM610 directory was written by Jutta Degener
<jutta@cs.tu-berlin.de> and Carsten Bormann <cabo@cs.tu-berlin.de>.
They should not be contacted in relation to libsndfile or the GSM 6.10 code
that is part of libsndfile. Their original code can be found at:
http://kbs.cs.tu-berlin.de/~jutta/toast.html
Code in the src/G72x directory was released by Sun Microsystems, Inc. to the
public domain. Minor modifications were required to integrate these files
into libsndfile. The changes are listed in src/G72x/ChangeLog.

6107
libs/libsndfile/ChangeLog Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,113 @@
#!/bin/sh
# Copyright (C) 2006 Erik de Castro Lopo <erikd@mega-nerd.com>
#
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
# * Neither the author nor the names of any contributors may be used
# to endorse or promote products derived from this software without
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
set -e
if [ $# -lt 1 ] || [ $# -gt 2 ]; then
echo "Usage : Mingw-make-dist.sh <source tarball>."
exit 1
fi
TARGZ=$1
if [ ! -f $TARGZ ]; then
echo "Can't find source tarball."
fi
TARGZ=$1
if [ ! -f $TARGZ.asc ]; then
echo "Can't find source tarball signature."
fi
UNAME=`uname -s`
if [ x$UNAME != "xMINGW32_NT-5.1" ]; then
echo "Not able to build Win32 binaries on this platform."
fi
echo "Building MinGW binary/source zip file."
VERSION=`pwd | sed -e "s#.*/##" | sed -e s/libsndfile-//`
BUILD=`echo $VERSION | sed -e "s/\./_/g"`
INSTALL="libsndfile-$BUILD"
ZIPNAME="$INSTALL.zip"
if [ -z "$BUILD" ]; then
echo "Bad BUILD variable : '$BUILD'"
exit 1
fi
if [ ! -d $INSTALL/ ]; then
mkdir $INSTALL
fi
if [ ! -f config.status ]; then
./configure --prefix=`pwd`/$INSTALL/
else
teststr=`grep "with options" config.status | grep -- --prefix=`
if [ -z "$teststr" ]; then
# --disable-static doesn't work.
./configure --prefix=`pwd`/$INSTALL/
fi
fi
if [ ! -f src/.libs/libsndfile-1.dll ]; then
make all check
fi
if [ ! -f $INSTALL/bin/libsndfile-1.dll ]; then
make install
rm -f $INSTALL/bin/sndfile-regtest.exe
strip $INSTALL/bin/*.*
mv $INSTALL/bin/*.* $INSTALL/include/*.* $INSTALL/
rmdir $INSTALL/bin
rm -rf $INSTALL/lib
rmdir $INSTALL/include
cp src/libsndfile.def $INSTALL/
cp Win32/README-precompiled-dll.txt $INSTALL/
fi
if [ ! -f $INSTALL/libsndfile-$VERSION.tar.gz ]; then
cp $TARGZ $INSTALL/
if [ -f $TARGZ.asc ]; then
cp $TARGZ.asc $INSTALL/
fi
fi
if [ ! -f $ZIPNAME ]; then
zip -r $ZIPNAME $INSTALL/
fi
# Do not edit or modify anything in this comment block.
# The following line is a file identity tag for the GNU Arch
# revision control system.
#
# arch-tag: 3f82cd8a-f800-48d7-9646-2cdcf03c81a0

126
libs/libsndfile/NEWS Normal file
View file

@ -0,0 +1,126 @@
Version 1.0.16 (2006-04-30)
* Add support for Broadcast (BEXT) chunks in WAV files.
* Implement new commands SFC_GET_SIGNAL_MAX and SFC_GET_MAX_ALL_CHANNELS.
* Add support for RIFX (big endian WAV variant).
* Fix configure script bugs.
* Fix bug in INST and MARK chunk writing for AIFF files.
Version 1.0.15 (2006-03-16)
* Fix some ia64 issues.
* Fix precompiled DLL.
* Minor bug fixes.
Version 1.0.14 (2006-02-19)
* Really fix MinGW compile problems.
* Minor bug fixes.
Version 1.0.13 (2006-01-21)
* Fix for MinGW compiler problems.
* Allow readin/write of instrument chunks from WAV and AIFF files.
* Compile problem fix for Solaris compiler.
* Minor cleanups and bug fixes.
Version 1.0.12 (2005-09-30)
* Add support for FLAC and Apple's Core Audio Format (CAF).
* Add virtual I/O interface (still needs docs).
* Cygwin and other Win32 fixes.
* Minor bug fixes and cleanups.
Version 1.0.11 (2004-11-15)
* Add support for SD2 files.
* Add read support for loop info in WAV and AIFF files.
* Add more tests.
* Improve type safety.
* Minor optimisations and bug fixes.
Version 1.0.10 (2004-06-15)
* Fix AIFF read/write mode bugs.
* Add support for compiling Win32 DLLS using MinGW.
* Fix problems resulting in failed compiles with gcc-2.95.
* Improve test suite.
* Minor bug fixes.
Version 1.0.9 (2004-03-30)
* Add handling of AVR (Audio Visual Research) files.
* Improve handling of WAVEFORMATEXTENSIBLE WAV files.
* Fix for using pipes on Win32.
Version 1.0.8 (2004-03-14)
* Correct peak chunk handing for files with > 16 tracks.
* Fix for WAV files with huge number of CUE chunks.
Version 1.0.7 (2004-02-25)
* Fix clip mode detection on ia64, MIPS and other CPUs.
* Fix two MacOSX build problems.
Version 1.0.6 (2004-02-08)
* Added support for native Win32 file access API (Ross Bencina).
* New mode to add clippling then a converting from float/double to integer
would otherwise wrap around.
* Fixed a bug in reading/writing files > 2Gig on Linux, Solaris and others.
* Many minor bug fixes.
* Other random fixes for Win32.
Version 1.0.5 (2003-05-03)
* Added support for HTK files.
* Added new function sf_open_fd() to allow for secure opening of temporary
files as well as reading/writing sound files embedded within larger
container files.
* Added string support for AIFF files.
* Minor bug fixes and code cleanups.
Version 1.0.4 (2003-02-02)
* Added suport of PVF and XI files.
* Added functionality for setting and retreiving strings from sound files.
* Minor code cleanups and bug fixes.
Version 1.0.3 (2002-12-09)
* Minor bug fixes.
Version 1.0.2 (2002-11-24)
* Added support for VOX ADPCM.
* Improved error reporting.
* Added version scripting on Linux and Solaris.
* Minor bug fixes.
Version 1.0.1 (2002-09-14)
* Added MAT and MAT5 file formats.
* Minor bug fixes.
Version 1.0.0 (2002-08-16)
* Final release for 1.0.0.
Version 1.0.0rc6 (2002-08-14)
* Release candidate 6 for the 1.0.0 series.
* MacOS9 fixes.
Version 1.0.0rc5 (2002-08-10)
* Release candidate 5 for the 1.0.0 series.
* Changed the definition of sf_count_t which was causing problems when
libsndfile was compiled with other libraries (ie WxWindows).
* Minor bug fixes.
* Documentation cleanup.
Version 1.0.0rc4 (2002-08-03)
* Release candidate 4 for the 1.0.0 series.
* Minor bug fixes.
* Fix broken Win32 "make check".
Version 1.0.0rc3 (2002-08-02)
* Release candidate 3 for the 1.0.0 series.
* Fix bug where libsndfile was reading beyond the end of the data chunk.
* Added on-the-fly header updates on write.
* Fix a couple of documentation issues.
Version 1.0.0rc2 (2002-06-24)
* Release candidate 2 for the 1.0.0 series.
* Fix compile problem for Win32.
Version 1.0.0rc1 (2002-06-24)
* Release candidate 1 for the 1.0.0 series.
Version 0.0.28 (2002-04-27)
* Last offical release of 0.0.X series of the library.
Version 0.0.8 (1999-02-16)
* First offical release.

71
libs/libsndfile/README Normal file
View file

@ -0,0 +1,71 @@
This is libsndfile, 1.0.16
libsndfile is a library of C routines for reading and writing
files containing sampled audio data.
The src/ directory contains the source code for library itself.
The doc/ directory contains the libsndfile documentation.
The examples/ directory contains examples of how to write code using
libsndfile. 'wav32_aiff24' converts a WAV file containing 32 bit floating
point data into a 24 bit PCM AIFF file. 'sndfile2oct' dumps the audio
data of a file in a human readable format. 'sfconvert' is the beginnings
of a audio file format conversion utility. 'make_sine' generates a WAV
file containing one cycle of a sine wave with 4096 sample points in
32 bit floating point format. 'sfinfo' opens a sound file and prints
out information about that file.
The tests/ directory contains programs which link against libsndfile
and test its functionality.
The Win32/ directory contains files and documentation to allow libsndfile
to compile under Win32 with the Microsoft Visual C++ compiler.
The src/GSM610 directory contains code written by Jutta Degener and Carsten
Bormann. Their original code can be found at :
http://kbs.cs.tu-berlin.de/~jutta/toast.html
The src/G72x directory contains code written and released by Sun Microsystems
under a suitably free license.
Win32
-----
There are detailed instructions for building libsndfile on Win32 in the file
doc/win32.html
MacOSX
------
Building on MacOSX should be the same as building it on any other Unix.
OTHER PLATFORMS
---------------
To compile libsndfile on platforms which have a Bourne Shell compatible
shell, an ANSI C compiler and a make utility should require no more that
the following three commands :
./configure
make
make install
For platforms without the required shell, it is usually sufficient to
create an approriate config.h file in the src/ directory with correct
values for the following #defines (this would work for AmigaOS) :
#define HAVE_ENDIAN_H 0
#define GUESS_BIG_ENDIAN 1
#define GUESS_LITTLE_ENDIAN 0
#define FORCE_BROKEN_FLOAT 0
CONTACTS
--------
libsndfile was written by Erik de Castro Lopo (erikd AT mega-nerd DOT com).
The libsndfile home page is at :
http://www.mega-nerd.com/libsndfile/

View file

@ -0,0 +1,43 @@
# -*- python -*-
import os
import os.path
import glob
sndfile_files = glob.glob('src/*.c') + glob.glob('src/GSM610/*.c') + glob.glob('src/G72x/*.c')
Import('env install_prefix')
sndfile = env.Copy()
domain = 'libsndfile'
sndfile.Append(CCFLAGS = "-DPACKAGE=\\\"" + domain + "\\\"")
sndfile.Append(CCFLAGS = "-DVERSION=\\\"ardour-special\\\"")
# mingw may need this
#sndfile.Append(CCFLAGS="-no-undefined")
sndfile.Append(PACKAGE = domain)
sndfile.Append(POTFILE = domain + '.pot')
conf = Configure(sndfile)
if conf.CheckCHeader('/System/Library/Frameworks/CoreServices.framework/Headers/CoreServices.h'):
sndfile.Append(LINKFLAGS = "-framework CoreServices")
sndfile = conf.Finish()
libsndfile = sndfile.SharedLibrary('sndfile', sndfile_files)
sndfile_h = sndfile.Command('src/sndfile.h', ['src/sndfile.h.in'], 'cd libs/libsndfile && ./configure && cd -', ENV=os.environ)
Default([sndfile_h,libsndfile])
env.Alias('install', env.Install(os.path.join(install_prefix, 'lib/ardour2'), libsndfile))
env.Alias('tarball', env.Distribute (env['DISTTREE'],
[ 'NEWS', 'README', 'AUTHORS', 'ChangeLog',
'configure', 'SConscript',] +
sndfile_files +
glob.glob('src/*.h') +
[ 'src/sndfile.h.in', 'src/config.h.in', 'src/Symbols.linux', 'src/Symbols.darwin', 'src/libsndfile.def', 'src/cygsndfile.def' ]
))

View file

@ -0,0 +1,579 @@
dnl By default, many hosts won't let programs access large files;
dnl one must use special compiler options to get large-file access to work.
dnl For more details about this brain damage please see:
dnl http://www.sas.com/standards/large.file/x_open.20Mar96.html
dnl Written by Paul Eggert <eggert@twinsun.com>.
dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE.
dnl AC_SYS_EXTRA_LARGEFILE_FLAGS(FLAGSNAME)
AC_DEFUN([AC_SYS_EXTRA_LARGEFILE_FLAGS],
[AC_CACHE_CHECK([for $1 value to request large file support],
ac_cv_sys_largefile_$1,
[ac_cv_sys_largefile_$1=`($GETCONF LFS_$1) 2>/dev/null` || {
ac_cv_sys_largefile_$1=no
ifelse($1, CFLAGS,
[case "$host_os" in
# IRIX 6.2 and later require cc -n32.
changequote(, )dnl
irix6.[2-9]* | irix6.1[0-9]* | irix[7-9].* | irix[1-9][0-9]*)
changequote([, ])dnl
if test "$GCC" != yes; then
ac_cv_sys_largefile_CFLAGS=-n32
fi
ac_save_CC="$CC"
CC="$CC $ac_cv_sys_largefile_CFLAGS"
AC_TRY_LINK(, , , ac_cv_sys_largefile_CFLAGS=no)
CC="$ac_save_CC"
esac])
}])])
dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE.
dnl AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(VAR, VAL)
AC_DEFUN([AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND],
[case $2 in
no) ;;
?*)
case "[$]$1" in
'') $1=$2 ;;
*) $1=[$]$1' '$2 ;;
esac ;;
esac])
dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE.
dnl AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(C-MACRO, CACHE-VAR, COMMENT, CODE-TO-SET-DEFAULT)
AC_DEFUN([AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE],
[AC_CACHE_CHECK([for $1], $2,
[$2=no
changequote(, )dnl
$4
for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do
case "$ac_flag" in
-D$1)
$2=1 ;;
-D$1=*)
$2=`expr " $ac_flag" : '[^=]*=\(.*\)'` ;;
esac
done
changequote([, ])dnl
])
if test "[$]$2" != no; then
AC_DEFINE_UNQUOTED([$1], [$]$2, [$3])
fi])
AC_DEFUN([AC_SYS_EXTRA_LARGEFILE],
[AC_REQUIRE([AC_CANONICAL_HOST])
AC_ARG_ENABLE(largefile,
[ --disable-largefile omit support for large files])
if test "$enable_largefile" != no; then
AC_CHECK_TOOL(GETCONF, getconf)
AC_SYS_EXTRA_LARGEFILE_FLAGS(CFLAGS)
AC_SYS_EXTRA_LARGEFILE_FLAGS(LDFLAGS)
AC_SYS_EXTRA_LARGEFILE_FLAGS(LIBS)
for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do
case "$ac_flag" in
no) ;;
-D_FILE_OFFSET_BITS=*) ;;
-D_LARGEFILE_SOURCE | -D_LARGEFILE_SOURCE=*) ;;
-D_LARGE_FILES | -D_LARGE_FILES=*) ;;
-D?* | -I?*)
AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(CPPFLAGS, "$ac_flag") ;;
*)
AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(CFLAGS, "$ac_flag") ;;
esac
done
AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(LDFLAGS, "$ac_cv_sys_largefile_LDFLAGS")
AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(LIBS, "$ac_cv_sys_largefile_LIBS")
AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_FILE_OFFSET_BITS,
ac_cv_sys_file_offset_bits,
[Number of bits in a file offset, on hosts where this is settable.])
[case "$host_os" in
# HP-UX 10.20 and later
hpux10.[2-9][0-9]* | hpux1[1-9]* | hpux[2-9][0-9]*)
ac_cv_sys_file_offset_bits=64 ;;
esac]
AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_LARGEFILE_SOURCE,
ac_cv_sys_largefile_source,
[Define to make fseeko etc. visible, on some hosts.],
[case "$host_os" in
# HP-UX 10.20 and later
hpux10.[2-9][0-9]* | hpux1[1-9]* | hpux[2-9][0-9]*)
ac_cv_sys_largefile_source=1 ;;
esac])
AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_LARGE_FILES,
ac_cv_sys_large_files,
[Define for large files, on AIX-style hosts.],
[case "$host_os" in
# AIX 4.2 and later
aix4.[2-9]* | aix4.1[0-9]* | aix[5-9].* | aix[1-9][0-9]*)
ac_cv_sys_large_files=1 ;;
esac])
fi
])
dnl @synopsis AC_C_FIND_ENDIAN
dnl
dnl Determine endian-ness of target processor.
dnl @version 1.1 Mar 03 2002
dnl @author Erik de Castro Lopo <erikd AT mega-nerd DOT com>
dnl
dnl Majority written from scratch to replace the standard autoconf macro
dnl AC_C_BIGENDIAN. Only part remaining from the original it the invocation
dnl of the AC_TRY_RUN macro.
dnl
dnl Permission to use, copy, modify, distribute, and sell this file for any
dnl purpose is hereby granted without fee, provided that the above copyright
dnl and this permission notice appear in all copies. No representations are
dnl made about the suitability of this software for any purpose. It is
dnl provided "as is" without express or implied warranty.
dnl Find endian-ness in the following way:
dnl 1) Look in <endian.h>.
dnl 2) If 1) fails, look in <sys/types.h> and <sys/param.h>.
dnl 3) If 1) and 2) fails and not cross compiling run a test program.
dnl 4) If 1) and 2) fails and cross compiling then guess based on target.
AC_DEFUN([AC_C_FIND_ENDIAN],
[AC_CACHE_CHECK(processor byte ordering,
ac_cv_c_byte_order,
# Initialize to unknown
ac_cv_c_byte_order=unknown
if test x$ac_cv_header_endian_h = xyes ; then
# First try <endian.h> which should set BYTE_ORDER.
[AC_TRY_LINK([
#include <endian.h>
#if BYTE_ORDER != LITTLE_ENDIAN
not big endian
#endif
], return 0 ;,
ac_cv_c_byte_order=little
)]
[AC_TRY_LINK([
#include <endian.h>
#if BYTE_ORDER != BIG_ENDIAN
not big endian
#endif
], return 0 ;,
ac_cv_c_byte_order=big
)]
fi
if test $ac_cv_c_byte_order = unknown ; then
[AC_TRY_LINK([
#include <sys/types.h>
#include <sys/param.h>
#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
bogus endian macros
#endif
], return 0 ;,
[AC_TRY_LINK([
#include <sys/types.h>
#include <sys/param.h>
#if BYTE_ORDER != LITTLE_ENDIAN
not big endian
#endif
], return 0 ;,
ac_cv_c_byte_order=little
)]
[AC_TRY_LINK([
#include <sys/types.h>
#include <sys/param.h>
#if BYTE_ORDER != LITTLE_ENDIAN
not big endian
#endif
], return 0 ;,
ac_cv_c_byte_order=little
)]
)]
fi
if test $ac_cv_c_byte_order = unknown ; then
if test $cross_compiling = yes ; then
# This is the last resort. Try to guess the target processor endian-ness
# by looking at the target CPU type.
[
case "$target_cpu" in
alpha* | i?86* | mipsel* | ia64*)
ac_cv_c_big_endian=0
ac_cv_c_little_endian=1
;;
m68* | mips* | powerpc* | hppa* | sparc*)
ac_cv_c_big_endian=1
ac_cv_c_little_endian=0
;;
esac
]
else
AC_TRY_RUN(
[[
int main (void)
{ /* Are we little or big endian? From Harbison&Steele. */
union
{ long l ;
char c [sizeof (long)] ;
} u ;
u.l = 1 ;
return (u.c [sizeof (long) - 1] == 1);
}
]], , ac_cv_c_byte_order=big,
ac_cv_c_byte_order=unknown
)
AC_TRY_RUN(
[[int main (void)
{ /* Are we little or big endian? From Harbison&Steele. */
union
{ long l ;
char c [sizeof (long)] ;
} u ;
u.l = 1 ;
return (u.c [0] == 1);
}]], , ac_cv_c_byte_order=little,
ac_cv_c_byte_order=unknown
)
fi
fi
)
]
if test $ac_cv_c_byte_order = big ; then
ac_cv_c_big_endian=1
ac_cv_c_little_endian=0
elif test $ac_cv_c_byte_order = little ; then
ac_cv_c_big_endian=0
ac_cv_c_little_endian=1
else
ac_cv_c_big_endian=0
ac_cv_c_little_endian=0
AC_MSG_WARN([[*****************************************************************]])
AC_MSG_WARN([[*** Not able to determine endian-ness of target processor. ]])
AC_MSG_WARN([[*** The constants CPU_IS_BIG_ENDIAN and CPU_IS_LITTLE_ENDIAN in ]])
AC_MSG_WARN([[*** src/config.h may need to be hand editied. ]])
AC_MSG_WARN([[*****************************************************************]])
fi
)# AC_C_FIND_ENDIAN
dnl @synopsis AC_C99_FLEXIBLE_ARRAY
dnl
dnl Dose the compiler support the 1999 ISO C Standard "stuct hack".
dnl @version 1.1 Mar 15 2004
dnl @author Erik de Castro Lopo <erikd AT mega-nerd DOT com>
dnl
dnl Permission to use, copy, modify, distribute, and sell this file for any
dnl purpose is hereby granted without fee, provided that the above copyright
dnl and this permission notice appear in all copies. No representations are
dnl made about the suitability of this software for any purpose. It is
dnl provided "as is" without express or implied warranty.
AC_DEFUN([AC_C99_FLEXIBLE_ARRAY],
[AC_CACHE_CHECK(C99 struct flexible array support,
ac_cv_c99_flexible_array,
# Initialize to unknown
ac_cv_c99_flexible_array=no
AC_TRY_LINK([[
#include <stdlib.h>
typedef struct {
int k;
char buffer [] ;
} MY_STRUCT ;
]],
[ MY_STRUCT *p = calloc (1, sizeof (MY_STRUCT) + 42); ],
ac_cv_c99_flexible_array=yes,
ac_cv_c99_flexible_array=no
))]
) # AC_C99_FLEXIBLE_ARRAY
dnl @synopsis AC_C99_FUNC_LRINT
dnl
dnl Check whether C99's lrint function is available.
dnl @version 1.3 Feb 12 2002
dnl @author Erik de Castro Lopo <erikd AT mega-nerd DOT com>
dnl
dnl Permission to use, copy, modify, distribute, and sell this file for any
dnl purpose is hereby granted without fee, provided that the above copyright
dnl and this permission notice appear in all copies. No representations are
dnl made about the suitability of this software for any purpose. It is
dnl provided "as is" without express or implied warranty.
dnl
AC_DEFUN([AC_C99_FUNC_LRINT],
[AC_CACHE_CHECK(for lrint,
ac_cv_c99_lrint,
[
lrint_save_CFLAGS=$CFLAGS
CFLAGS="-O2 -lm"
AC_TRY_LINK([
#define _ISOC9X_SOURCE 1
#define _ISOC99_SOURCE 1
#define __USE_ISOC99 1
#define __USE_ISOC9X 1
#include <math.h>
], if (!lrint(3.14159)) lrint(2.7183);, ac_cv_c99_lrint=yes, ac_cv_c99_lrint=no)
CFLAGS=$lrint_save_CFLAGS
])
if test "$ac_cv_c99_lrint" = yes; then
AC_DEFINE(HAVE_LRINT, 1,
[Define if you have C99's lrint function.])
fi
])# AC_C99_FUNC_LRINT
dnl @synopsis AC_C99_FUNC_LRINTF
dnl
dnl Check whether C99's lrintf function is available.
dnl @version 1.3 Feb 12 2002
dnl @author Erik de Castro Lopo <erikd AT mega-nerd DOT com>
dnl
dnl Permission to use, copy, modify, distribute, and sell this file for any
dnl purpose is hereby granted without fee, provided that the above copyright
dnl and this permission notice appear in all copies. No representations are
dnl made about the suitability of this software for any purpose. It is
dnl provided "as is" without express or implied warranty.
dnl
AC_DEFUN([AC_C99_FUNC_LRINTF],
[AC_CACHE_CHECK(for lrintf,
ac_cv_c99_lrintf,
[
lrintf_save_CFLAGS=$CFLAGS
CFLAGS="-O2 -lm"
AC_TRY_LINK([
#define _ISOC9X_SOURCE 1
#define _ISOC99_SOURCE 1
#define __USE_ISOC99 1
#define __USE_ISOC9X 1
#include <math.h>
], if (!lrintf(3.14159)) lrintf(2.7183);, ac_cv_c99_lrintf=yes, ac_cv_c99_lrintf=no)
CFLAGS=$lrintf_save_CFLAGS
])
if test "$ac_cv_c99_lrintf" = yes; then
AC_DEFINE(HAVE_LRINTF, 1,
[Define if you have C99's lrintf function.])
fi
])# AC_C99_FUNC_LRINTF
dnl @synopsis AC_C99_FUNC_LLRINT
dnl
dnl Check whether C99's llrint function is available.
dnl @version 1.1 Sep 30 2002
dnl @author Erik de Castro Lopo <erikd AT mega-nerd DOT com>
dnl
dnl Permission to use, copy, modify, distribute, and sell this file for any
dnl purpose is hereby granted without fee, provided that the above copyright
dnl and this permission notice appear in all copies. No representations are
dnl made about the suitability of this software for any purpose. It is
dnl provided "as is" without express or implied warranty.
dnl
AC_DEFUN([AC_C99_FUNC_LLRINT],
[AC_CACHE_CHECK(for llrint,
ac_cv_c99_llrint,
[
llrint_save_CFLAGS=$CFLAGS
CFLAGS="-O2 -lm"
AC_TRY_LINK([
#define _ISOC9X_SOURCE 1
#define _ISOC99_SOURCE 1
#define __USE_ISOC99 1
#define __USE_ISOC9X 1
#include <math.h>
#include <stdint.h>
], int64_t x ; x = llrint(3.14159) ;, ac_cv_c99_llrint=yes, ac_cv_c99_llrint=no)
CFLAGS=$llrint_save_CFLAGS
])
if test "$ac_cv_c99_llrint" = yes; then
AC_DEFINE(HAVE_LLRINT, 1,
[Define if you have C99's llrint function.])
fi
])# AC_C99_FUNC_LLRINT
dnl @synopsis AC_C_CLIP_MODE
dnl
dnl Determine the clipping mode when converting float to int.
dnl @version 1.0 May 17 2003
dnl @author Erik de Castro Lopo <erikd AT mega-nerd DOT com>
dnl
dnl Permission to use, copy, modify, distribute, and sell this file for any
dnl purpose is hereby granted without fee, provided that the above copyright
dnl and this permission notice appear in all copies. No representations are
dnl made about the suitability of this software for any purpose. It is
dnl provided "as is" without express or implied warranty.
dnl Find the clipping mode in the following way:
dnl 1) If we are not cross compiling test it.
dnl 2) IF we are cross compiling, assume that clipping isn't done correctly.
AC_DEFUN([AC_C_CLIP_MODE],
[AC_CACHE_CHECK(processor clipping capabilities,
ac_cv_c_clip_type,
# Initialize to unknown
ac_cv_c_clip_positive=unknown
ac_cv_c_clip_negative=unknown
if test $ac_cv_c_clip_positive = unknown ; then
AC_TRY_RUN(
[[
#define _ISOC9X_SOURCE 1
#define _ISOC99_SOURCE 1
#define __USE_ISOC99 1
#define __USE_ISOC9X 1
#include <math.h>
int main (void)
{ double fval ;
int k, ival ;
fval = 1.0 * 0x7FFFFFFF ;
for (k = 0 ; k < 100 ; k++)
{ ival = (lrint (fval)) >> 24 ;
if (ival != 127)
return 1 ;
fval *= 1.2499999 ;
} ;
return 0 ;
}
]],
ac_cv_c_clip_positive=yes,
ac_cv_c_clip_positive=no,
ac_cv_c_clip_positive=unknown
)
AC_TRY_RUN(
[[
#define _ISOC9X_SOURCE 1
#define _ISOC99_SOURCE 1
#define __USE_ISOC99 1
#define __USE_ISOC9X 1
#include <math.h>
int main (void)
{ double fval ;
int k, ival ;
fval = -8.0 * 0x10000000 ;
for (k = 0 ; k < 100 ; k++)
{ ival = (lrint (fval)) >> 24 ;
if (ival != -128)
return 1 ;
fval *= 1.2499999 ;
} ;
return 0 ;
}
]],
ac_cv_c_clip_negative=yes,
ac_cv_c_clip_negative=no,
ac_cv_c_clip_negative=unknown
)
fi
if test $ac_cv_c_clip_positive = yes ; then
ac_cv_c_clip_positive=1
else
ac_cv_c_clip_positive=0
fi
if test $ac_cv_c_clip_negative = yes ; then
ac_cv_c_clip_negative=1
else
ac_cv_c_clip_negative=0
fi
[[
case "$ac_cv_c_clip_positive$ac_cv_c_clip_negative" in
"00")
ac_cv_c_clip_type="none"
;;
"10")
ac_cv_c_clip_type="positive"
;;
"01")
ac_cv_c_clip_type="negative"
;;
"11")
ac_cv_c_clip_type="both"
;;
esac
]]
)
]
)# AC_C_CLIP_MODE
dnl @synopsis AC_ADD_CFLAGS
dnl
dnl Add the given option to CFLAGS, if it doesn't break the compiler
AC_DEFUN([AC_ADD_CFLAGS],
[AC_MSG_CHECKING([if $CC accepts $1])
ac_add_cflags__old_cflags="$CFLAGS"
CFLAGS="$CFLAGS $1"
AC_TRY_LINK([#include <stdio.h>],
[printf("Hello, World!\n"); return 0;],
AC_MSG_RESULT([yes]),
AC_MSG_RESULT([no])
CFLAGS="$ac_add_cflags__old_cflags")
])
ifelse(dnl
Do not edit or modify anything in this comment block.
The arch-tag line is a file identity tag for the GNU Arch
revision control system.
arch-tag: bc38294d-bb5c-42ad-90b9-779def5eaab7
)dnl

72
libs/libsndfile/aclocal.m4 vendored Normal file
View file

@ -0,0 +1,72 @@
# generated automatically by aclocal 1.9.2 -*- Autoconf -*-
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
# Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
dnl PKG_CHECK_MODULES(GSTUFF, gtk+-2.0 >= 1.3 glib = 1.3.4, action-if, action-not)
dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page
dnl also defines GSTUFF_PKG_ERRORS on error
AC_DEFUN([PKG_CHECK_MODULES], [
succeeded=no
if test -z "$PKG_CONFIG"; then
AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
fi
if test "$PKG_CONFIG" = "no" ; then
echo "*** The pkg-config script could not be found. Make sure it is"
echo "*** in your path, or set the PKG_CONFIG environment variable"
echo "*** to the full path to pkg-config."
echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config."
else
PKG_CONFIG_MIN_VERSION=0.9.0
if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then
AC_MSG_CHECKING(for $2)
if $PKG_CONFIG --exists "$2" ; then
AC_MSG_RESULT(yes)
succeeded=yes
AC_MSG_CHECKING($1_CFLAGS)
$1_CFLAGS=`$PKG_CONFIG --cflags "$2"`
AC_MSG_RESULT($$1_CFLAGS)
AC_MSG_CHECKING($1_LIBS)
$1_LIBS=`$PKG_CONFIG --libs "$2"`
AC_MSG_RESULT($$1_LIBS)
else
$1_CFLAGS=""
$1_LIBS=""
## If we have a custom action on failure, don't print errors, but
## do set a variable so people can do so.
$1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
ifelse([$4], ,echo $$1_PKG_ERRORS,)
fi
AC_SUBST($1_CFLAGS)
AC_SUBST($1_LIBS)
else
echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer."
echo "*** See http://www.freedesktop.org/software/pkgconfig"
fi
fi
if test $succeeded = yes; then
ifelse([$3], , :, [$3])
else
ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4])
fi
])
m4_include([acinclude.m4])

107
libs/libsndfile/compile Executable file
View file

@ -0,0 +1,107 @@
#! /bin/sh
# Wrapper for compilers which do not understand `-c -o'.
# Copyright 1999, 2000 Free Software Foundation, Inc.
# Written by Tom Tromey <tromey@cygnus.com>.
#
# 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, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# Usage:
# compile PROGRAM [ARGS]...
# `-o FOO.o' is removed from the args passed to the actual compile.
# Usage statement added by Billy Biggs <vektor@dumbterm.net>.
if [ -z $1 ]; then
echo "Wrapper for compilers which do not understand '-c -o'."
echo "usage: compile PROGRAM [ARGS]..."
echo "'-o FOO.o' is removed from the args passed to the actual compile."
exit 1
fi
prog=$1
shift
ofile=
cfile=
args=
while test $# -gt 0; do
case "$1" in
-o)
# configure might choose to run compile as `compile cc -o foo foo.c'.
# So we do something ugly here.
ofile=$2
shift
case "$ofile" in
*.o | *.obj)
;;
*)
args="$args -o $ofile"
ofile=
;;
esac
;;
*.c)
cfile=$1
args="$args $1"
;;
*)
args="$args $1"
;;
esac
shift
done
if test -z "$ofile" || test -z "$cfile"; then
# If no `-o' option was seen then we might have been invoked from a
# pattern rule where we don't need one. That is ok -- this is a
# normal compilation that the losing compiler can handle. If no
# `.c' file was seen then we are probably linking. That is also
# ok.
exec "$prog" $args
fi
# Name of file we expect compiler to create.
cofile=`echo $cfile | sed -e 's|^.*/||' -e 's/\.c$/.o/'`
# Create the lock directory.
# Note: use `[/.-]' here to ensure that we don't use the same name
# that we are using for the .o file. Also, base the name on the expected
# object file name, since that is what matters with a parallel build.
lockdir=`echo $cofile | sed -e 's|[/.-]|_|g'`.d
while true; do
if mkdir $lockdir > /dev/null 2>&1; then
break
fi
sleep 1
done
# FIXME: race condition here if user kills between mkdir and trap.
trap "rmdir $lockdir; exit 1" 1 2 15
# Run the compile.
"$prog" $args
status=$?
if test -f "$cofile"; then
mv "$cofile" "$ofile"
fi
rmdir $lockdir
exit $status

1497
libs/libsndfile/config.guess vendored Executable file

File diff suppressed because it is too large Load diff

Some files were not shown because too many files have changed in this diff Show more