mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-25 08:21:08 +00:00
61f5ca1e4d
In line with the Audio_out session a Audio_in session is used to record audio frames. Like in the Audio_out session shared memory in form of the Audio_in::Stream is used to transport the frames from the server to the client. These frames consist of single channel (mono) samples. An Audio_in::Packet always contains a full period of frames. A Audio_in server captures frames and puts them into the Audio_in::Stream. To do so the server allocates a Audio_in::Packet from the packet queue embedded in the Audio_in::Stream. If the queue is already full, the server will override packets and notify the client by submitting the 'overrun' signal. The client has to cope with this situation, e.g., by saving packets more frequently. A client will also receive a 'progress' signal from the server when a new Audio_in::Packet was submitted to the packet queue. Fixes #1644.
117 lines
2.6 KiB
C++
117 lines
2.6 KiB
C++
/*
|
|
* \brief Server-side Audio_in session interface
|
|
* \author Josef Soentgen
|
|
* \date 2015-05-08
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C) 2015 Genode Labs GmbH
|
|
*
|
|
* This file is part of the Genode OS framework, which is distributed
|
|
* under the terms of the GNU General Public License version 2.
|
|
*/
|
|
|
|
#ifndef _INCLUDE__AUDIO_IN_SESSION__RPC_OBJECT_H_
|
|
#define _INCLUDE__AUDIO_IN_SESSION__RPC_OBJECT_H_
|
|
|
|
/* Genode includes */
|
|
#include <base/env.h>
|
|
#include <base/rpc_server.h>
|
|
#include <audio_in_session/audio_in_session.h>
|
|
|
|
|
|
namespace Audio_in { class Session_rpc_object; }
|
|
|
|
|
|
class Audio_in::Session_rpc_object : public Genode::Rpc_object<Audio_in::Session,
|
|
Session_rpc_object>
|
|
{
|
|
protected:
|
|
|
|
bool _stopped; /* state */
|
|
Genode::Ram_dataspace_capability _ds; /* contains Audio_in stream */
|
|
|
|
Genode::Signal_context_capability _data_cap;
|
|
Genode::Signal_context_capability _progress_cap;
|
|
Genode::Signal_context_capability _overrun_cap;
|
|
|
|
public:
|
|
|
|
Session_rpc_object(Genode::Signal_context_capability data_cap)
|
|
:
|
|
_stopped(true), _data_cap(data_cap)
|
|
{
|
|
using namespace Genode;
|
|
|
|
_ds = env()->ram_session()->alloc(sizeof(Stream));
|
|
_stream = static_cast<Stream *>(env()->rm_session()->attach(_ds));
|
|
}
|
|
|
|
virtual ~Session_rpc_object()
|
|
{
|
|
if (_ds.valid()) {
|
|
Genode::env()->rm_session()->detach(_stream);
|
|
Genode::env()->ram_session()->free(_ds);
|
|
}
|
|
}
|
|
|
|
|
|
/**************
|
|
** Signals **
|
|
**************/
|
|
|
|
void progress_sigh(Genode::Signal_context_capability sigh) {
|
|
_progress_cap = sigh; }
|
|
|
|
void overrun_sigh(Genode::Signal_context_capability sigh) {
|
|
_overrun_cap = sigh; }
|
|
|
|
Genode::Signal_context_capability data_avail_sigh() {
|
|
return _data_cap; }
|
|
|
|
|
|
/***********************
|
|
** Session interface **
|
|
***********************/
|
|
|
|
void start() { _stopped = false; }
|
|
void stop() { _stopped = true; }
|
|
|
|
Genode::Dataspace_capability dataspace() { return _ds; }
|
|
|
|
|
|
/**********************************
|
|
** Session interface extensions **
|
|
**********************************/
|
|
|
|
/**
|
|
* Send 'progress' signal
|
|
*/
|
|
void progress_submit()
|
|
{
|
|
if (_progress_cap.valid())
|
|
Genode::Signal_transmitter(_progress_cap).submit();
|
|
}
|
|
|
|
/**
|
|
* Send 'overrun' signal
|
|
*/
|
|
void overrun_submit()
|
|
{
|
|
if (_overrun_cap.valid())
|
|
Genode::Signal_transmitter(_overrun_cap).submit();
|
|
}
|
|
|
|
/**
|
|
* Return true if client state is stopped
|
|
*/
|
|
bool stopped() const { return _stopped; }
|
|
|
|
/**
|
|
* Return true if client session is active
|
|
*/
|
|
bool active() const { return !_stopped; }
|
|
};
|
|
|
|
#endif /* _INCLUDE__AUDIO_IN_SESSION__RPC_OBJECT_H_ */
|