X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fscale.cc;h=02c1dc5f8e2daca09b480ac977049c66e70d68e3;hb=97a0169312a260933246ab224e4f8b0969871dd5;hp=3dff7b4b3320c6a2a654663b5f26ed047ab38c1f;hpb=99b6f3aa3558b01c9d4158b19a1f1794c534f89c;p=lilypond.git diff --git a/lily/scale.cc b/lily/scale.cc index 3dff7b4b33..02c1dc5f8e 100644 --- a/lily/scale.cc +++ b/lily/scale.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2014 Han-Wen Nienhuys + Copyright (C) 2006--2015 Han-Wen Nienhuys 2007--2008 Rune Zedeler 2008 Joe Neeman @@ -20,8 +20,8 @@ */ #include "scale.hh" +#include "protected-scm.hh" -#include "ly-smobs.icc" /* todo: put string <-> pitch here too. @@ -54,25 +54,25 @@ LY_DEFINE (ly_make_scale, "ly:make-scale", SCM_ASSERT_TYPE (type_ok, steps, SCM_ARG1, __FUNCTION__, "vector of rational"); - Scale *s = new Scale (tones); + return (new Scale (tones))->unprotect (); +} - SCM retval = s->self_scm (); - s->unprotect (); +Scale *default_global_scale = 0; +Protected_scm default_global_scale_scm (SCM_BOOL_F); - return retval; -} +// TODO: This is somewhat fishy: pitches protect their scale via a +// mark_smob hook. But since pitches are of Simple_smob variety, they +// are unknown to GUILE unless a smobbed_copy has been created. So +// changing the default scale might cause some existing pitches to +// lose their scale's protection. LY_DEFINE (ly_default_scale, "ly:default-scale", 0, 0, 0, (), "Get the global default scale.") { - return default_global_scale - ? default_global_scale->self_scm () - : SCM_BOOL_F; + return default_global_scale_scm; } -Scale *default_global_scale = 0; - LY_DEFINE (ly_set_default_scale, "ly:set-default-scale", 1, 0, 0, (SCM scale), "Set the global default scale. This determines the tuning of" @@ -84,11 +84,8 @@ LY_DEFINE (ly_set_default_scale, "ly:set-default-scale", { LY_ASSERT_SMOB (Scale, scale, 1); - Scale *s = Scale::unsmob (scale); - if (default_global_scale) - default_global_scale->unprotect (); - default_global_scale = s; - s->protect (); + default_global_scale_scm = scale; + default_global_scale = unsmob (scale); return SCM_UNSPECIFIED; } @@ -134,20 +131,7 @@ Scale::normalize_step (int step) const return ret; } -int -Scale::print_smob (SCM /* x */, - SCM port, - scm_print_state *) -{ - scm_puts ("#", port); - return 1; -} -SCM -Scale::mark_smob (SCM) -{ - return SCM_UNSPECIFIED; -} Scale::Scale (vector const &tones) { @@ -157,6 +141,7 @@ Scale::Scale (vector const &tones) } Scale::Scale (Scale const &src) + : Smob () { step_tones_ = src.step_tones_; smobify_self (); @@ -165,6 +150,3 @@ Scale::Scale (Scale const &src) Scale::~Scale () { } - -IMPLEMENT_SMOBS (Scale); -IMPLEMENT_DEFAULT_EQUAL_P (Scale);