qt_avplay: remove use of deprecated APIs

Fixes #149
This commit is contained in:
Christian Prochaska
2019-03-12 14:36:01 +01:00
committed by Norman Feske
parent 7ea7cb2bd2
commit 69612da4ba
7 changed files with 236 additions and 358 deletions

View File

@@ -5,7 +5,7 @@
*/
/*
* Copyright (C) 2012-2017 Genode Labs GmbH
* Copyright (C) 2012-2019 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
@@ -29,9 +29,9 @@
#include <os/slave.h>
/* local includes */
#include "framebuffer_service_factory.h"
#include "nitpicker_session_component.h"
typedef Genode::Local_service<Input::Session_component> Input_service;
typedef Genode::Local_service<Nitpicker::Session_component> Nitpicker_service;
class Avplay_slave : public QObject
{
@@ -39,20 +39,24 @@ class Avplay_slave : public QObject
private:
class Policy
:
private Genode::Static_parent_services<Genode::Cpu_session,
Genode::Log_session,
Genode::Pd_session,
Genode::Rom_session,
Timer::Session,
Audio_out::Session>,
public Genode::Slave::Policy
struct Policy_base
{
Genode::Static_parent_services<Genode::Cpu_session,
Genode::Log_session,
Genode::Pd_session,
Genode::Rom_session,
Timer::Session,
Audio_out::Session>
_parent_services;
Policy_base(Genode::Env &env) : _parent_services(env) { }
};
class Policy : Policy_base, public Genode::Slave::Policy
{
private:
Input_service &_input_service;
Framebuffer_service_factory &_framebuffer_service_factory;
Nitpicker_service &_nitpicker_service;
const char *_mediafile;
int _sdl_audio_volume;
@@ -111,40 +115,47 @@ class Avplay_slave : public QObject
}
static Genode::Cap_quota _caps() { return { 150 }; }
static Genode::Ram_quota _ram_quota() { return { 32*1024*1024 }; }
static Genode::Ram_quota _ram_quota() { return { 64*1024*1024 }; }
static Name _name() { return "avplay"; }
Genode::Service &_matching_service(Genode::Service::Name const &name)
{
if (name == "Nitpicker")
return _nitpicker_service;
throw Genode::Service_denied();
}
public:
Policy(Genode::Rpc_entrypoint &entrypoint,
Genode::Region_map &rm,
Genode::Pd_session &ref_pd,
Genode::Pd_session_capability ref_pd_cap,
Input_service &input_service,
Framebuffer_service_factory &framebuffer_service_factory,
Policy(Genode::Env &env,
Genode::Entrypoint &entrypoint,
Nitpicker_service &nitpicker_service,
char const *mediafile)
:
Genode::Slave::Policy(_name(), _name(), *this, entrypoint,
rm, ref_pd, ref_pd_cap, _caps(),
Policy_base(env),
Genode::Slave::Policy(env, _name(), _name(),
Policy_base::_parent_services,
entrypoint.rpc_ep(), _caps(),
_ram_quota()),
_input_service(input_service),
_framebuffer_service_factory(framebuffer_service_factory),
_nitpicker_service(nitpicker_service),
_mediafile(mediafile),
_sdl_audio_volume(100)
{
configure(_config());
}
Genode::Service &resolve_session_request(Genode::Service::Name const &service_name,
Genode::Session_state::Args const &args) override
Route resolve_session_request(Genode::Service::Name const &name,
Genode::Session_label const &label) override
{
if (service_name == "Input")
return _input_service;
try {
return Route { .service = _matching_service(name),
.label = label,
.diag = Genode::Session::Diag() };
}
catch (Genode::Service_denied) { }
if (service_name == "Framebuffer")
return _framebuffer_service_factory.create(args);
return Genode::Slave::Policy::resolve_session_request(service_name, args);
return Genode::Slave::Policy::resolve_session_request(name, label);
}
void volume_changed(int value)
@@ -155,27 +166,21 @@ class Avplay_slave : public QObject
};
Genode::size_t const _ep_stack_size = 4*1024*sizeof(Genode::addr_t);
Genode::Rpc_entrypoint _ep;
Policy _policy;
Genode::Child _child;
Policy _policy;
Genode::Child _child;
public:
/**
* Constructor
*/
Avplay_slave(Genode::Region_map &rm,
Genode::Pd_session &ref_pd,
Genode::Pd_session_capability ref_pd_cap,
Input_service &input_service,
Framebuffer_service_factory &framebuffer_service_factory,
Avplay_slave(Genode::Env &env,
Genode::Entrypoint &ep,
Nitpicker_service &nitpicker_service,
char const *mediafile)
:
_ep(&ref_pd, _ep_stack_size, "avplay_ep"),
_policy(_ep, rm, ref_pd, ref_pd_cap, input_service,
framebuffer_service_factory, mediafile),
_child(rm, _ep, _policy)
_policy(env, ep, nitpicker_service, mediafile),
_child(env.rm(), ep.rpc_ep(), _policy)
{ }
public Q_SLOTS:

View File

@@ -1,99 +0,0 @@
/*
* \brief Filter framebuffer policy
* \author Christian Prochaska
* \date 2012-04-11
*/
/*
* Copyright (C) 2012-2017 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef _FILTER_FRAMEBUFFER_SLAVE_H_
#define _FILTER_FRAMEBUFFER_SLAVE_H_
/* Genode includes */
#include <base/service.h>
#include <os/static_parent_services.h>
#include <os/slave.h>
#include <timer_session/timer_session.h>
/* local includes */
#include "framebuffer_service_factory.h"
class Filter_framebuffer_slave
{
private:
class Policy
:
private Genode::Static_parent_services<Genode::Cpu_session,
Genode::Log_session,
Genode::Pd_session,
Genode::Rom_session,
Timer::Session>,
public Genode::Slave::Policy
{
private:
Framebuffer_service_factory &_framebuffer_service_factory;
public:
Policy(Genode::Rpc_entrypoint &entrypoint,
Genode::Region_map &rm,
Genode::Pd_session &ref_pd,
Genode::Pd_session_capability ref_pd_cap,
Name const &name,
size_t caps,
size_t ram_quota,
Framebuffer_service_factory &framebuffer_service_factory)
:
Genode::Slave::Policy(name, name, *this, entrypoint, rm,
ref_pd, ref_pd_cap,
Genode::Cap_quota{caps},
Genode::Ram_quota{ram_quota}),
_framebuffer_service_factory(framebuffer_service_factory)
{ }
Genode::Service &resolve_session_request(Genode::Service::Name const &service_name,
Genode::Session_state::Args const &args) override
{
if (service_name == "Framebuffer")
return _framebuffer_service_factory.create(args);
return Genode::Slave::Policy::resolve_session_request(service_name, args);
}
};
Genode::size_t const _ep_stack_size = 2*1024*sizeof(Genode::addr_t);
Genode::Rpc_entrypoint _ep;
Policy _policy;
Genode::Child _child;
public:
/**
* Constructor
*/
Filter_framebuffer_slave(Genode::Region_map &rm,
Genode::Pd_session &ref_pd,
Genode::Pd_session_capability ref_pd_cap,
Genode::Slave::Policy::Name const &name,
size_t caps,
size_t ram_quota,
Framebuffer_service_factory &framebuffer_service_factory)
:
_ep(&ref_pd, _ep_stack_size, "filter_framebuffer_ep"),
_policy(_ep, rm, ref_pd, ref_pd_cap, name, caps, ram_quota,
framebuffer_service_factory),
_child(rm, _ep, _policy)
{ }
Genode::Slave::Policy &policy() { return _policy; }
};
#endif /* _FILTER_FRAMEBUFFER_SLAVE_H_ */

View File

@@ -1,141 +0,0 @@
/*
* \brief Framebuffer service factory
* \author Christian Prochaska
* \date 2016-11-24
*/
/*
* Copyright (C) 2016-2017 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef _FRAMEBUFFER_SERVICE_FACTORY_H_
#define _FRAMEBUFFER_SERVICE_FACTORY_H_
/* Genode includes */
#include <base/service.h>
#include <os/slave.h>
#include <framebuffer_session/connection.h>
#include <os/single_session_service.h>
#include <nitpicker_session/connection.h>
/* Qt includes */
#include <qnitpickerplatformwindow.h>
#include <qnitpickerviewwidget/qnitpickerviewwidget.h>
struct Framebuffer_service_factory
{
virtual Genode::Service &create(Genode::Session_state::Args const &args) = 0;
typedef Genode::Single_session_service<Framebuffer::Session> Session_service;
};
class Nitpicker_framebuffer_service_factory : public Framebuffer_service_factory
{
private:
Nitpicker::Connection _nitpicker;
Session_service _service;
QNitpickerViewWidget &_nitpicker_view_widget;
int _max_width;
int _max_height;
int _limited_size(int requested_size, int max_size)
{
if (requested_size == 0)
return max_size;
else
return (max_size > 0) ? Genode::min(requested_size, max_size) : requested_size;
}
static inline long _session_arg(Genode::Session_state::Args const &args, const char *key)
{
return Genode::Arg_string::find_arg(args.string(), key).long_value(0);
}
public:
Nitpicker_framebuffer_service_factory(Genode::Env &env,
QNitpickerViewWidget &nitpicker_view_widget,
int max_width = 0,
int max_height = 0)
: _nitpicker(env),
_service(_nitpicker.framebuffer_session()),
_nitpicker_view_widget(nitpicker_view_widget),
_max_width(max_width), _max_height(max_height)
{ }
Genode::Service &create(Genode::Session_state::Args const &args)
{
Framebuffer::Mode const
mode(_limited_size(_session_arg(args, "fb_width"), _max_width),
_limited_size(_session_arg(args, "fb_height"), _max_height),
_nitpicker.mode().format());
_nitpicker.buffer(mode, false);
QNitpickerPlatformWindow *platform_window =
dynamic_cast<QNitpickerPlatformWindow*>(_nitpicker_view_widget
.window()->windowHandle()->handle());
Nitpicker::Session::View_handle parent_view_handle =
_nitpicker.view_handle(platform_window->view_cap());
Nitpicker::Session::View_handle nitpicker_view_handle =
_nitpicker.create_view(parent_view_handle);
_nitpicker.release_view_handle(parent_view_handle);
Framebuffer::Session_client framebuffer(_nitpicker.framebuffer_session());
Framebuffer::Mode framebuffer_mode = framebuffer.mode();
_nitpicker_view_widget.setNitpickerView(&_nitpicker,
nitpicker_view_handle,
0, 0,
framebuffer_mode.width(),
framebuffer_mode.height());
return _service.service();
}
};
class Filter_framebuffer_service_factory : public Framebuffer_service_factory
{
private:
typedef Genode::Slave::Connection<Framebuffer::Connection> Framebuffer_connection;
Genode::Slave::Policy &_policy;
Framebuffer_connection *_slave_connection { nullptr };
Session_service *_service { nullptr };
public:
Filter_framebuffer_service_factory(Genode::Slave::Policy &policy)
: _policy(policy)
{ }
~Filter_framebuffer_service_factory()
{
delete _service;
delete _slave_connection;
}
Genode::Service &create(Genode::Session_state::Args const &args)
{
_slave_connection = new Framebuffer_connection(_policy, args);
_service = new Session_service(*_slave_connection);
return _service->service();
}
};
#endif /* _FRAMEBUFFER_SERVICE_FACTORY_H_ */

View File

@@ -5,93 +5,43 @@
*/
/*
* Copyright (C) 2012-2017 Genode Labs GmbH
* Copyright (C) 2012-2019 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
/* qt_avplay includes */
#include "filter_framebuffer_slave.h"
#include "main_window.h"
using namespace Genode;
struct Framebuffer_filter
{
enum { MAX_FILTER_NAME_SIZE = 32 };
char name[MAX_FILTER_NAME_SIZE];
size_t caps;
Genode::Number_of_bytes ram_quota;
Filter_framebuffer_slave *slave;
};
Main_window::Main_window(Genode::Env &env)
:
_env(env),
_mediafile_name(env),
_control_bar(_input_session_component)
_control_bar(_nitpicker_session_component.input_component())
{
_input_session_component.event_queue().enabled(true);
_ep.manage(&_input_session_component);
/* add widgets to layout */
_layout->addWidget(_avplay_widget);
_layout->addWidget(_control_bar);
/*
* The main window must be visible before avplay or a framebuffer filter
* requests the framebuffer session which goes to Nitpicker, because the
* parent view of the new Nitpicker view is part of the
* QNitpickerPlatformWindow object, which is created when the main window
* becomes visible.
* The main window must be visible before avplay requests the Nitpicker
* session, because the parent view of the new Nitpicker view is part of
* the QNitpickerPlatformWindow object, which is created when the main
* window becomes visible.
*/
show();
/* find out which filtering framebuffer services to start and sort them in reverse order */
static QList<Framebuffer_filter*> framebuffer_filters;
try {
Genode::Attached_rom_dataspace config(_env, "config");
Xml_node node = config.xml().sub_node("framebuffer_filter");
for (; ; node = node.next("framebuffer_filter")) {
Framebuffer_filter *framebuffer_filter = new Framebuffer_filter;
node.attribute("name").value(framebuffer_filter->name, sizeof(framebuffer_filter->name));
node.attribute("caps").value(&framebuffer_filter->caps);
node.attribute("ram_quota").value(&framebuffer_filter->ram_quota);
qDebug() << "filter:" << framebuffer_filter->name << "," << framebuffer_filter->ram_quota;
framebuffer_filters.prepend(framebuffer_filter);
}
} catch (Xml_node::Nonexistent_sub_node) { }
Framebuffer_service_factory *framebuffer_service_factory =
&_nitpicker_framebuffer_service_factory;
/* start the filtering framebuffer services */
Q_FOREACH(Framebuffer_filter *framebuffer_filter, framebuffer_filters) {
framebuffer_filter->slave = new Filter_framebuffer_slave(_env.rm(),
_env.pd(),
_env.pd_session_cap(),
framebuffer_filter->name,
framebuffer_filter->caps,
framebuffer_filter->ram_quota,
*framebuffer_service_factory);
framebuffer_service_factory =
new Filter_framebuffer_service_factory(framebuffer_filter->slave->policy());
}
/* start avplay */
Avplay_slave *avplay_slave = new Avplay_slave(_env.rm(),
_env.pd(), _env.pd_session_cap(),
_input_service,
*framebuffer_service_factory,
Avplay_slave *avplay_slave = new Avplay_slave(_env, _ep,
_nitpicker_service,
_mediafile_name.buf);
connect(_control_bar, SIGNAL(volume_changed(int)), avplay_slave, SLOT(volume_changed(int)));

View File

@@ -5,7 +5,7 @@
*/
/*
* Copyright (C) 2012-2017 Genode Labs GmbH
* Copyright (C) 2012-2019 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
@@ -32,7 +32,8 @@
/* local includes */
#include "avplay_slave.h"
#include "control_bar.h"
#include "framebuffer_service_factory.h"
#include "nitpicker_session_component.h"
class Main_window : public Compound_widget<QWidget, QVBoxLayout>
{
@@ -59,23 +60,25 @@ class Main_window : public Compound_widget<QWidget, QVBoxLayout>
}
};
Genode::Env &_env;
Genode::Env &_env;
Mediafile_name _mediafile_name;
Genode::size_t const _ep_stack_size { 16 * 1024 };
Genode::Entrypoint _ep { _env, _ep_stack_size,
"avplay_ep",
Genode::Affinity::Location() };
QMember<QNitpickerViewWidget> _avplay_widget;
QMember<Control_bar> _control_bar;
Mediafile_name _mediafile_name;
Genode::size_t const _ep_stack_size { 2*sizeof(Genode::addr_t)*1024 };
Genode::Rpc_entrypoint _ep { &_env.pd(), _ep_stack_size, "avplay_ep" };
QMember<QNitpickerViewWidget> _avplay_widget;
QMember<Control_bar> _control_bar;
Nitpicker_framebuffer_service_factory _nitpicker_framebuffer_service_factory { _env,
*_avplay_widget,
640, 480 };
Nitpicker::Session_component _nitpicker_session_component {
_env, _ep, *_avplay_widget };
Input::Session_component _input_session_component { _env, _env.ram() };
Input_service::Single_session_factory _input_factory { _input_session_component };
Input_service _input_service { _input_factory };
Nitpicker_service::Single_session_factory _nitpicker_factory {
_nitpicker_session_component };
Nitpicker_service _nitpicker_service { _nitpicker_factory };
public:

View File

@@ -0,0 +1,158 @@
/*
* \brief Nitpicker session component
* \author Christian Prochaska
* \date 2019-03-12
*/
/*
* Copyright (C) 2019 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef _NITPICKER_SESSION_COMPONENT_H_
#define _NITPICKER_SESSION_COMPONENT_H_
/* Genode includes */
#include <nitpicker_session/connection.h>
/* Qt includes */
#include <qnitpickerplatformwindow.h>
#include <qnitpickerviewwidget/qnitpickerviewwidget.h>
namespace Nitpicker {
using namespace Genode;
struct Session_component;
}
struct Nitpicker::Session_component : Rpc_object<Nitpicker::Session>
{
Env &_env;
Entrypoint &_ep;
QNitpickerViewWidget &_nitpicker_view_widget;
Nitpicker::Connection _connection;
Input::Session_component _input_component { _env, _env.ram() };
typedef Nitpicker::Session::Command_buffer Command_buffer;
Attached_ram_dataspace _command_ds;
Command_buffer &_command_buffer = *_command_ds.local_addr<Command_buffer>();
Nitpicker::Session::View_handle _view_handle;
Input::Session_component &input_component() { return _input_component; }
void _execute_command(Command const &command)
{
switch (command.opcode) {
case Command::OP_GEOMETRY:
{
Nitpicker::Rect rect = command.geometry.rect;
_nitpicker_view_widget.setNitpickerView(&_connection,
_view_handle,
0, 0,
rect.w(), rect.h());
return;
}
case Command::OP_OFFSET: return;
case Command::OP_TO_FRONT: return;
case Command::OP_TO_BACK: return;
case Command::OP_BACKGROUND: return;
case Command::OP_TITLE: return;
case Command::OP_NOP: return;
}
}
Session_component(Env &env, Entrypoint &ep,
QNitpickerViewWidget &nitpicker_view_widget)
:
_env(env), _ep(ep),
_nitpicker_view_widget(nitpicker_view_widget),
_connection(env),
_command_ds(env.ram(), env.rm(), sizeof(Command_buffer))
{
_ep.manage(_input_component);
_ep.manage(*this);
_input_component.event_queue().enabled(true);
}
~Session_component()
{
_ep.dissolve(*this);
_ep.dissolve(_input_component);
}
Framebuffer::Session_capability framebuffer_session() override {
return _connection.framebuffer_session(); }
Input::Session_capability input_session() override {
return _input_component.cap(); }
View_handle create_view(View_handle parent) override
{
QNitpickerPlatformWindow *platform_window =
dynamic_cast<QNitpickerPlatformWindow*>(_nitpicker_view_widget
.window()->windowHandle()->handle());
Nitpicker::Session::View_handle parent_view_handle =
_connection.view_handle(platform_window->view_cap());
_view_handle = _connection.create_view(parent_view_handle);
_connection.release_view_handle(parent_view_handle);
return _view_handle;
}
void destroy_view(View_handle view) override {
_connection.destroy_view(view); }
View_handle view_handle(View_capability view_cap, View_handle handle) override {
return _connection.view_handle(view_cap, handle); }
View_capability view_capability(View_handle view) override {
return _connection.view_capability(view); }
void release_view_handle(View_handle view) override {
_connection.release_view_handle(view); }
Dataspace_capability command_dataspace() override {
return _command_ds.cap(); }
void execute() override
{
for (unsigned i = 0; i < _command_buffer.num(); i++)
_execute_command(_command_buffer.get(i));
}
Framebuffer::Mode mode() override
{
Framebuffer::Mode connection_mode { _connection.mode() };
Framebuffer::Mode new_mode {
Genode::min(connection_mode.width(),
_nitpicker_view_widget.maximumWidth()),
Genode::min(connection_mode.height(),
_nitpicker_view_widget.maximumHeight()),
connection_mode.format()
};
return new_mode;
}
void mode_sigh(Signal_context_capability sigh) override {
_connection.mode_sigh(sigh); }
void buffer(Framebuffer::Mode mode, bool use_alpha) override {
_connection.buffer(mode, use_alpha); }
void focus(Capability<Nitpicker::Session> session) override {
_connection.focus(session); }
};
#endif /* _NITPICKER_SESSION_COMPONENT_H_ */

View File

@@ -4,4 +4,6 @@ include $(call select_from_repositories,src/app/qt5/tmpl/target_final.inc)
LIBS += qt5_qnitpickerviewwidget qoost
REP_INC_DIR += include/qt5/qpa_nitpicker
CC_CXX_WARN_STRICT =