/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 2006--2012 Han-Wen Nienhuys <hanwen@lilypond.org>
+ Copyright (C) 2006--2015 Han-Wen Nienhuys <hanwen@lilypond.org>
2007--2008 Rune Zedeler
2008 Joe Neeman <joeneeman@gmail.com>
*/
#include "scale.hh"
+#include "protected-scm.hh"
-#include "ly-smobs.icc"
/*
todo: put string <-> pitch here too.
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"
+ "Set the global default scale. This determines the tuning of"
" pitches with no accidentals or key signatures. The first"
- " pitch is C. Alterations are calculated relative to this"
+ " pitch is C. Alterations are calculated relative to this"
" scale. The number of pitches in this scale determines the"
" number of scale steps that make up an octave. Usually the"
" 7-note major 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> (scale);
return SCM_UNSPECIFIED;
}
return ret;
}
-int
-Scale::print_smob (SCM /* x */,
- SCM port,
- scm_print_state *)
-{
- scm_puts ("#<Scale>", port);
- return 1;
-}
-SCM
-Scale::mark_smob (SCM)
-{
- return SCM_UNSPECIFIED;
-}
Scale::Scale (vector<Rational> const &tones)
{
}
Scale::Scale (Scale const &src)
+ : Smob<Scale> ()
{
step_tones_ = src.step_tones_;
smobify_self ();
Scale::~Scale ()
{
}
-
-IMPLEMENT_SMOBS (Scale);
-IMPLEMENT_DEFAULT_EQUAL_P (Scale);