aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/com.canonical.indicator.datetime.gschema.xml12
-rw-r--r--include/datetime/settings-shared.h10
-rw-r--r--include/datetime/settings.h2
-rw-r--r--src/exporter.cpp26
-rw-r--r--src/settings-live.cpp6
-rw-r--r--src/snap.cpp29
-rw-r--r--tests/manual-test-snap.cpp22
-rw-r--r--tests/test-exporter.cpp4
-rw-r--r--tests/test-settings.cpp26
9 files changed, 46 insertions, 91 deletions
diff --git a/data/com.canonical.indicator.datetime.gschema.xml b/data/com.canonical.indicator.datetime.gschema.xml
index 3e0082d..17a38ed 100644
--- a/data/com.canonical.indicator.datetime.gschema.xml
+++ b/data/com.canonical.indicator.datetime.gschema.xml
@@ -5,13 +5,6 @@
<value nick="24-hour" value="2" />
<value nick="custom" value="3" />
</enum>
- <enum id="alarm-volume-enum">
- <value nick="very-quiet" value="0" />
- <value nick="quiet" value="1" />
- <value nick="normal" value="2" />
- <value nick="loud" value="3" />
- <value nick="very-loud" value="4" />
- </enum>
<schema id="com.canonical.indicator.datetime" path="/com/canonical/indicator/datetime/" gettext-domain="indicator-datetime">
<key name="show-clock" type="b">
<default>true</default>
@@ -137,8 +130,9 @@
If an alarm doesn't specify its own sound file, this file will be used as the fallback sound.
</description>
</key>
- <key name="alarm-default-volume" enum="alarm-volume-enum">
- <default>'normal'</default>
+ <key name="alarm-default-volume" type="i">
+ <range min="1" max="100"/>
+ <default>50</default>
<summary>The alarm's default volume level.</summary>
<description>
The volume at which alarms will be played.
diff --git a/include/datetime/settings-shared.h b/include/datetime/settings-shared.h
index bfddd88..23d2e1c 100644
--- a/include/datetime/settings-shared.h
+++ b/include/datetime/settings-shared.h
@@ -30,16 +30,6 @@ typedef enum
}
TimeFormatMode;
-typedef enum
-{
- ALARM_VOLUME_VERY_QUIET,
- ALARM_VOLUME_QUIET,
- ALARM_VOLUME_NORMAL,
- ALARM_VOLUME_LOUD,
- ALARM_VOLUME_VERY_LOUD
-}
-AlarmVolume;
-
#define SETTINGS_INTERFACE "com.canonical.indicator.datetime"
#define SETTINGS_SHOW_CLOCK_S "show-clock"
#define SETTINGS_TIME_FORMAT_S "time-format"
diff --git a/include/datetime/settings.h b/include/datetime/settings.h
index a941f05..26d4ed0 100644
--- a/include/datetime/settings.h
+++ b/include/datetime/settings.h
@@ -57,7 +57,7 @@ public:
core::Property<TimeFormatMode> time_format_mode;
core::Property<std::string> timezone_name;
core::Property<std::string> alarm_sound;
- core::Property<AlarmVolume> alarm_volume;
+ core::Property<int> alarm_volume;
core::Property<int> alarm_duration;
};
diff --git a/src/exporter.cpp b/src/exporter.cpp
index 3ba95bf..a5a059d 100644
--- a/src/exporter.cpp
+++ b/src/exporter.cpp
@@ -137,34 +137,10 @@ private:
}
- static void
- on_gobject_notify_volume(GObject* o, GParamSpec* pspec, gpointer p)
- {
- int val = 0;
- g_object_get (o, pspec->name, &val, nullptr);
- static_cast<core::Property<AlarmVolume>*>(p)->set(AlarmVolume(val));
- }
- void bind_volume_property(gpointer o, const char* propname, core::Property<AlarmVolume>& p)
- {
- // initialize the GObject property from the Settings
- g_object_set(o, propname, (int)p.get(), nullptr);
-
- // when the GObject changes, update the Settings
- const std::string notify_propname = std::string("notify::") + propname;
- g_signal_connect(o, notify_propname.c_str(),
- G_CALLBACK(on_gobject_notify_volume), &p);
-
- // when the Settings changes, update the GObject
- p.changed().connect([o, propname](AlarmVolume i){
- g_object_set(o, propname, (int)i, nullptr);
- });
- }
-
-
void alarm_properties_init()
{
bind_int_property(m_alarm_props, "duration", m_settings->alarm_duration);
- bind_volume_property(m_alarm_props, "default-volume", m_settings->alarm_volume);
+ bind_int_property(m_alarm_props, "default-volume", m_settings->alarm_volume);
bind_string_property(m_alarm_props, "default-sound", m_settings->alarm_sound);
}
diff --git a/src/settings-live.cpp b/src/settings-live.cpp
index e34ace1..369d2d6 100644
--- a/src/settings-live.cpp
+++ b/src/settings-live.cpp
@@ -123,8 +123,8 @@ LiveSettings::LiveSettings():
g_settings_set_string(m_settings, SETTINGS_ALARM_SOUND_S, value.c_str());
});
- alarm_volume.changed().connect([this](AlarmVolume value){
- g_settings_set_enum(m_settings, SETTINGS_ALARM_VOLUME_S, gint(value));
+ alarm_volume.changed().connect([this](int value){
+ g_settings_set_int(m_settings, SETTINGS_ALARM_VOLUME_S, value);
});
alarm_duration.changed().connect([this](int value){
@@ -229,7 +229,7 @@ void LiveSettings::update_alarm_sound()
void LiveSettings::update_alarm_volume()
{
- alarm_volume.set((AlarmVolume)g_settings_get_enum(m_settings, SETTINGS_ALARM_VOLUME_S));
+ alarm_volume.set(g_settings_get_int(m_settings, SETTINGS_ALARM_VOLUME_S));
}
void LiveSettings::update_alarm_duration()
diff --git a/src/snap.cpp b/src/snap.cpp
index 4a19d6e..40fd541 100644
--- a/src/snap.cpp
+++ b/src/snap.cpp
@@ -54,7 +54,7 @@ public:
Sound(const std::shared_ptr<Clock>& clock,
const std::string& filename,
- AlarmVolume volume,
+ int volume,
int duration_minutes,
bool loop):
m_clock(clock),
@@ -132,18 +132,17 @@ private:
g_clear_pointer(&props, ca_proplist_destroy);
}
- static float get_gain_level(const AlarmVolume volume)
+ static float get_gain_level(int volume)
{
- /* These values aren't set in stone --
- arrived at from from manual tests on Nexus 4 */
- switch (volume)
- {
- case ALARM_VOLUME_VERY_QUIET: return -8;
- case ALARM_VOLUME_QUIET: return -4;
- case ALARM_VOLUME_LOUD: return 4;
- case ALARM_VOLUME_VERY_LOUD: return 8;
- default: return 0;
- }
+ const int clamped_volume = CLAMP(volume, 1, 100);
+
+ /* This range isn't set in stone --
+ arrived at from manual tests on Nextus 4 */
+ constexpr float gain_low = -10;
+ constexpr float gain_high = 10;
+
+ constexpr float gain_range = gain_high - gain_low;
+ return gain_low + (gain_range * (clamped_volume / 100.0f));
}
static void on_done_playing(ca_context*, uint32_t, int rv, void* gself)
@@ -182,7 +181,7 @@ private:
const std::shared_ptr<Clock> m_clock;
const std::string m_filename;
- const AlarmVolume m_volume;
+ const int m_volume;
const bool m_loop;
const int32_t m_canberra_id;
const DateTime m_loop_end_time;
@@ -195,7 +194,7 @@ class SoundBuilder
public:
void set_clock(const std::shared_ptr<Clock>& c) {m_clock = c;}
void set_filename(const std::string& s) {m_filename = s;}
- void set_volume(const AlarmVolume v) {m_volume = v;}
+ void set_volume(const int v) {m_volume = v;}
void set_duration_minutes(int i) {m_duration_minutes=i;}
void set_looping(bool b) {m_looping=b;}
@@ -210,7 +209,7 @@ public:
private:
std::shared_ptr<Clock> m_clock;
std::string m_filename;
- AlarmVolume m_volume = ALARM_VOLUME_NORMAL;
+ int m_volume = 50;
int m_duration_minutes = 30;
bool m_looping = true;
};
diff --git a/tests/manual-test-snap.cpp b/tests/manual-test-snap.cpp
index 90dbe08..cc24a67 100644
--- a/tests/manual-test-snap.cpp
+++ b/tests/manual-test-snap.cpp
@@ -41,10 +41,29 @@ namespace
g_main_loop_quit(static_cast<GMainLoop*>(gloop));
return G_SOURCE_REMOVE;
};
+
+ int volume = 50;
+
+ GOptionEntry entries[] =
+ {
+ { "volume", 'v', 0, G_OPTION_ARG_INT, &volume, "Volume level [1..100]", "volume" },
+ { NULL }
+ };
}
-int main()
+int main(int argc, const char* argv[])
{
+ GError* error = nullptr;
+ GOptionContext* context = g_option_context_new(nullptr);
+ g_option_context_add_main_entries(context, entries, nullptr);
+ if (!g_option_context_parse(context, &argc, (gchar***)&argv, &error))
+ {
+ g_print("option parsing failed: %s\n", error->message);
+ exit(1);
+ }
+ g_option_context_free(context);
+ volume = CLAMP(volume, 1, 100);
+
Appointment a;
a.color = "green";
a.summary = "Alarm";
@@ -74,6 +93,7 @@ int main()
g_debug("SCHEMA_DIR is %s", SCHEMA_DIR);
auto settings = std::make_shared<LiveSettings>();
+ settings->alarm_volume.set(volume);
auto timezones = std::make_shared<LiveTimezones>(settings, TIMEZONE_FILE);
auto clock = std::make_shared<LiveClock>(timezones);
Snap snap (clock, settings);
diff --git a/tests/test-exporter.cpp b/tests/test-exporter.cpp
index 3f502cf..e947740 100644
--- a/tests/test-exporter.cpp
+++ b/tests/test-exporter.cpp
@@ -183,7 +183,7 @@ TEST_F(ExporterFixture, AlarmProperties)
**** Try changing the Settings -- do the DBus properties change to match it?
***/
- auto expected_volume = ALARM_VOLUME_VERY_LOUD;
+ auto expected_volume = 1;
int expected_duration = 60;
const char * expected_sound = "/tmp/foo.wav";
settings->alarm_volume.set(expected_volume);
@@ -210,7 +210,7 @@ TEST_F(ExporterFixture, AlarmProperties)
**** Try chaning the DBus properties -- do the Settings change to match it?
***/
- expected_volume = ALARM_VOLUME_VERY_QUIET;
+ expected_volume = 100;
expected_duration = 30;
expected_sound = "/tmp/bar.wav";
g_object_set(proxy, SOUND_PROP, expected_sound,
diff --git a/tests/test-settings.cpp b/tests/test-settings.cpp
index 2b500b2..e4aeef7 100644
--- a/tests/test-settings.cpp
+++ b/tests/test-settings.cpp
@@ -151,6 +151,7 @@ TEST_F(SettingsFixture, BoolProperties)
TEST_F(SettingsFixture, IntProperties)
{
TestIntProperty(m_settings->alarm_duration, SETTINGS_ALARM_DURATION_S);
+ TestIntProperty(m_settings->alarm_volume, SETTINGS_ALARM_VOLUME_S);
}
TEST_F(SettingsFixture, StringProperties)
@@ -181,31 +182,6 @@ TEST_F(SettingsFixture, TimeFormatMode)
}
}
-TEST_F(SettingsFixture, AlarmVolume)
-{
- const auto key = SETTINGS_ALARM_VOLUME_S;
- const AlarmVolume volumes[] = { ALARM_VOLUME_VERY_QUIET,
- ALARM_VOLUME_QUIET,
- ALARM_VOLUME_NORMAL,
- ALARM_VOLUME_LOUD,
- ALARM_VOLUME_VERY_LOUD };
-
- for(const auto& val : volumes)
- {
- g_settings_set_enum(m_gsettings, key, val);
- EXPECT_EQ(val, m_settings->alarm_volume.get());
- EXPECT_EQ(val, g_settings_get_enum(m_gsettings, key));
- }
-
- for(const auto& val : volumes)
- {
- m_settings->alarm_volume.set(val);
- EXPECT_EQ(val, m_settings->alarm_volume.get());
- EXPECT_EQ(val, g_settings_get_enum(m_gsettings, key));
- }
-}
-
-
namespace
{
std::vector<std::string> strv_to_vector(const gchar** strv)