mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-23 23:42:32 +00:00
mixer_gui_qt: write config instead of using report
* Also change the way how mute is handled. Only send the changed signal if the user has clicked on the mute checkbox * Always check channels_rom is valid * Add <default> handling * Increase verbosity Fixes #1795.
This commit is contained in:
parent
08ae942d72
commit
72823eeddb
@ -44,6 +44,8 @@ struct Report_thread : Genode::Thread<THREAD_STACK_SIZE>
|
|||||||
void _handle_channels(unsigned)
|
void _handle_channels(unsigned)
|
||||||
{
|
{
|
||||||
channels_rom.update();
|
channels_rom.update();
|
||||||
|
|
||||||
|
if (channels_rom.is_valid())
|
||||||
_report(channels_rom.local_addr<char>(), channels_rom.size());
|
_report(channels_rom.local_addr<char>(), channels_rom.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include <base/printf.h>
|
#include <base/printf.h>
|
||||||
#include <mixer/channel.h>
|
#include <mixer/channel.h>
|
||||||
#include <os/attached_rom_dataspace.h>
|
#include <os/attached_rom_dataspace.h>
|
||||||
|
#include <os/config.h>
|
||||||
#include <os/reporter.h>
|
#include <os/reporter.h>
|
||||||
#include <rom_session/connection.h>
|
#include <rom_session/connection.h>
|
||||||
|
|
||||||
@ -109,7 +110,7 @@ class Channel_widget : public Compound_widget<QFrame, QVBoxLayout>,
|
|||||||
|
|
||||||
connect(&_slider, SIGNAL(sliderReleased()),
|
connect(&_slider, SIGNAL(sliderReleased()),
|
||||||
this, SIGNAL(channel_changed()));
|
this, SIGNAL(channel_changed()));
|
||||||
connect(&_muted_checkbox, SIGNAL(stateChanged(int)),
|
connect(&_muted_checkbox, SIGNAL(clicked(bool)),
|
||||||
this, SIGNAL(channel_changed()));
|
this, SIGNAL(channel_changed()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -308,15 +309,39 @@ static Client_widget_registry *client_registry()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static Genode::Reporter config_reporter { "mixer.config" };
|
static char const * const config_file = "/config/mixer.config";
|
||||||
|
|
||||||
|
|
||||||
|
static int write_config(char const *file, char const *data, size_t length)
|
||||||
|
{
|
||||||
|
if (length == 0) return 0;
|
||||||
|
|
||||||
|
QFile mixer_file(file);
|
||||||
|
if (!mixer_file.open(QIODevice::WriteOnly)) {
|
||||||
|
PERR("could not open '%s'", file);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
mixer_file.write(data, length);
|
||||||
|
mixer_file.close();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Main_window::_update_config()
|
void Main_window::_update_config()
|
||||||
{
|
{
|
||||||
config_reporter.enabled(true);
|
char xml_data[2048];
|
||||||
|
size_t xml_used = 0;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Genode::Reporter::Xml_generator xml(config_reporter, [&] {
|
Genode::Xml_generator xml(xml_data, sizeof(xml_data), "config", [&] {
|
||||||
|
|
||||||
|
xml.node("default", [&] {
|
||||||
|
xml.attribute("out_volume", _default_out_volume);
|
||||||
|
xml.attribute("volume", _default_volume);
|
||||||
|
xml.attribute("muted", _default_muted);
|
||||||
|
});
|
||||||
|
|
||||||
xml.node("channel_list", [&] {
|
xml.node("channel_list", [&] {
|
||||||
for (Client_widget const *c = client_registry()->first(); c; c = c->next()) {
|
for (Client_widget const *c = client_registry()->first(); c; c = c->next()) {
|
||||||
@ -340,11 +365,20 @@ void Main_window::_update_config()
|
|||||||
xml.attribute("volume", combined ? vol : w->volume());
|
xml.attribute("volume", combined ? vol : w->volume());
|
||||||
xml.attribute("muted", combined ? muted : w->muted());
|
xml.attribute("muted", combined ? muted : w->muted());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (_verbose)
|
||||||
|
PLOG("label: '%s' volume: %d muted: %d", c->label().string(),
|
||||||
|
combined ? vol : w->volume(),
|
||||||
|
combined ? muted : w->muted());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
} catch (...) { PWRN("could not report channels"); }
|
xml_used = xml.used();
|
||||||
|
|
||||||
|
} catch (...) { PWRN("could generate 'mixer.config'"); }
|
||||||
|
|
||||||
|
write_config(config_file, xml_data, xml_used);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -401,9 +435,27 @@ void Main_window::report_changed(void *l, void const *p)
|
|||||||
|
|
||||||
|
|
||||||
Main_window::Main_window()
|
Main_window::Main_window()
|
||||||
|
:
|
||||||
|
_default_out_volume(0),
|
||||||
|
_default_volume(0),
|
||||||
|
_default_muted(true)
|
||||||
{
|
{
|
||||||
connect(client_registry(), SIGNAL(registry_changed()),
|
connect(client_registry(), SIGNAL(registry_changed()),
|
||||||
this, SLOT(_update_config()));
|
this, SLOT(_update_config()));
|
||||||
|
|
||||||
|
using namespace Genode;
|
||||||
|
|
||||||
|
try {
|
||||||
|
Xml_node config_node = config()->xml_node();
|
||||||
|
_verbose = config_node.attribute("verbose").has_value("yes");
|
||||||
|
} catch (...) { _verbose = false; }
|
||||||
|
|
||||||
|
try {
|
||||||
|
Xml_node node = config()->xml_node().sub_node("default");
|
||||||
|
_default_out_volume = node.attribute_value<long>("out_volume", 0);
|
||||||
|
_default_volume = node.attribute_value<long>("volume", 0);
|
||||||
|
_default_muted = node.attribute_value<long>("muted", 1);
|
||||||
|
} catch (...) { PWRN("no <default> node found, fallback is 'muted=1'"); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -50,6 +50,12 @@ class Main_window : public Compound_widget<QWidget, QHBoxLayout>
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
int _default_out_volume;
|
||||||
|
int _default_volume;
|
||||||
|
bool _default_muted;
|
||||||
|
|
||||||
|
bool _verbose;
|
||||||
|
|
||||||
void _update_clients(Genode::Xml_node &);
|
void _update_clients(Genode::Xml_node &);
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
|
@ -8,4 +8,4 @@ include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_final.inc
|
|||||||
|
|
||||||
main_window.o: main_window.moc
|
main_window.o: main_window.moc
|
||||||
|
|
||||||
LIBS += qoost
|
LIBS += config qoost
|
||||||
|
Loading…
Reference in New Issue
Block a user