/* * \brief Client-side Audio_in-session * \author Josef Soentgen * \date 2015-05-08 */ /* * Copyright (C) 2015-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 _INCLUDE__AUDIO_IN_SESSION__CLIENT_H_ #define _INCLUDE__AUDIO_IN_SESSION__CLIENT_H_ /* Genode includes */ #include #include #include #include namespace Audio_in { struct Signal; struct Session_client; } struct Audio_in::Signal { Genode::Signal_receiver recv { }; Genode::Signal_context context { }; Genode::Signal_context_capability cap; Signal() : cap(recv.manage(&context)) { } ~Signal() { recv.dissolve(&context); } void wait() { recv.wait_for_signal(); } }; class Audio_in::Session_client : public Genode::Rpc_client { private: Genode::Attached_dataspace _shared_ds; Signal _progress { }; Genode::Signal_transmitter _data_avail; public: /** * Constructor * * \param session session capability * \param progress_signal true, install 'progress_signal' receiver */ Session_client(Genode::Region_map &rm, Genode::Capability session, bool progress_signal) : Genode::Rpc_client(session), _shared_ds(rm, call()), _data_avail(call()) { _stream = _shared_ds.local_addr(); if (progress_signal) progress_sigh(_progress.cap); } /************* ** Signals ** *************/ void progress_sigh(Genode::Signal_context_capability sigh) override { call(sigh); } void overrun_sigh(Genode::Signal_context_capability sigh) override { call(sigh); } Genode::Signal_context_capability data_avail_sigh() override { return Genode::Signal_context_capability(); } /*********************** ** Session interface ** ***********************/ void start() override { call(); /* reset tail pointer */ stream()->reset(); } void stop() override { call(); } /********************************** ** Session interface extensions ** **********************************/ /** * Wait for progress signal */ void wait_for_progress() { if (!_progress.cap.valid()) { Genode::warning("Progress signal is not installed, will not block " "(enable in 'Audio_in::Connection')"); return; } _progress.wait(); } }; #endif /* _INCLUDE__AUDIO_IN_SESSION__CLIENT_H_ */