25#ifndef LMMS_REMOTE_PLUGIN_BASE_H
26#define LMMS_REMOTE_PLUGIN_BASE_H
35#include "lmmsconfig.h"
37#if !(defined(LMMS_HAVE_SYS_IPC_H) && defined(LMMS_HAVE_SEMAPHORE_H))
38#define SYNC_WITH_SHM_FIFO
40#ifdef LMMS_HAVE_PROCESS_H
44#ifdef LMMS_HAVE_UNISTD_H
49#ifdef LMMS_HAVE_LOCALE_H
53#ifdef LMMS_HAVE_PTHREAD_H
58#ifdef BUILD_REMOTE_PLUGIN_CLIENT
62#ifndef SYNC_WITH_SHM_FIFO
63#include <sys/socket.h>
68#include "lmms_export.h"
71#ifndef SYNC_WITH_SHM_FIFO
78#ifdef SYNC_WITH_SHM_FIFO
87#ifdef SYNC_WITH_SHM_FIFO
92const int SHM_FIFO_SIZE = 512*1024;
112 char data[SHM_FIFO_SIZE];
116#ifndef BUILD_REMOTE_PLUGIN_CLIENT
124 m_data->startPtr = m_data->endPtr = 0;
126 m_data->dataSem.semKey = ( getpid()<<10 ) + ++
k;
127 m_data->messageSem.semKey = ( getpid()<<10 ) + ++
k;
128 m_dataSem = SystemSemaphore{std::to_string(m_data->dataSem.semKey), 1u};
129 m_messageSem = SystemSemaphore{std::to_string(m_data->messageSem.semKey), 0
u};
135 shmFifo(
const std::string& shmKey) :
140 m_data.attach(shmKey);
141 m_dataSem = SystemSemaphore{std::to_string(m_data->dataSem.semKey)};
142 m_messageSem = SystemSemaphore{std::to_string(m_data->messageSem.semKey)};
145 inline bool isInvalid()
const
156 inline bool isMaster()
const
164 if( !isInvalid() && m_lockDepth.fetch_add( 1 ) == 0 )
173 if( m_lockDepth.fetch_sub( 1 ) <= 1 )
180 inline void waitForMessage()
184 m_messageSem.acquire();
189 inline void messageSent()
191 m_messageSem.release();
202 inline void writeInt(
const int32_t & _i )
204 write( &_i,
sizeof( _i ) );
207 std::string readString()
210 const int len = readInt();
213 ret.resize(
static_cast<std::size_t
>(len));
214 read(ret.data(), len);
221 inline void writeString(
const std::string & _s )
223 const int len = _s.size();
225 write( _s.c_str(), len );
229 inline bool messagesLeft()
236 const bool empty = ( m_data->startPtr == m_data->endPtr );
242 const std::string& shmKey()
const
249 void read(
void * _buf,
int _len )
253 memset( _buf, 0, _len );
257 while( isInvalid() ==
false &&
258 _len > m_data->endPtr - m_data->startPtr )
261#ifndef LMMS_BUILD_WIN32
266 std::memcpy(_buf, m_data->data + m_data->startPtr, _len);
267 m_data->startPtr += _len;
269 if( m_data->startPtr == m_data->endPtr )
272 m_data->startPtr = m_data->endPtr = 0;
277 void write(
const void * _buf,
int _len )
279 if( isInvalid() || _len > SHM_FIFO_SIZE )
284 while( _len > SHM_FIFO_SIZE - m_data->endPtr )
287 if( m_data->startPtr > 0 )
289 memmove( m_data->data,
290 m_data->data + m_data->startPtr,
291 m_data->endPtr - m_data->startPtr );
292 m_data->endPtr = m_data->endPtr -
294 m_data->startPtr = 0;
297#ifndef LMMS_BUILD_WIN32
302 std::memcpy(m_data->data + m_data->endPtr, _buf, _len);
303 m_data->endPtr += _len;
307 volatile bool m_invalid;
309 SharedMemory<shmData> m_data;
310 SystemSemaphore m_dataSem;
311 SystemSemaphore m_messageSem;
312 std::atomic_int m_lockDepth;
371 template<
class... Args>
374 data.emplace_back(std::forward<Args>(args)...);
381 std::snprintf(buf, 32,
"%d", _i);
382 data.emplace_back( buf );
389 std::snprintf(buf, 32,
"%f", _f);
390 data.emplace_back( buf );
399#ifndef BUILD_REMOTE_PLUGIN_CLIENT
402 return QString::fromStdString(
getString( _p ) );
408 return atoi(
data[_p].c_str() );
413 return (
float) atof(
data[_p].c_str() );
418 return(
id == _m.
id );
430#ifdef SYNC_WITH_SHM_FIFO
437#ifdef SYNC_WITH_SHM_FIFO
438 void reset( shmFifo *
in, shmFifo *
out )
452#ifdef SYNC_WITH_SHM_FIFO
453 return m_in->isInvalid() || m_out->isInvalid();
460 bool _busy_waiting =
false );
469#ifndef SYNC_WITH_SHM_FIFO
479 write( &_i,
sizeof( _i ) );
488 ret.resize(
static_cast<std::size_t
>(len));
489 read(ret.data(), len);
498 const int len = _s.size();
500 write( _s.c_str(), len );
504#ifndef BUILD_REMOTE_PLUGIN_CLIENT
507#ifdef SYNC_WITH_SHM_FIFO
508 return m_in->messagesLeft();
510 struct pollfd pollin;
512 pollin.events = POLLIN;
514 if ( poll( &pollin, 1, 0 ) == -1 )
516 qWarning(
"Unexpected poll error." );
518 return pollin.revents & POLLIN;
540#ifdef SYNC_WITH_SHM_FIFO
541 inline const shmFifo *
in()
const
546 inline const shmFifo *
out()
const
554#ifdef SYNC_WITH_SHM_FIFO
564#ifndef SYNC_WITH_SHM_FIFO
570#ifndef BUILD_REMOTE_PLUGIN_CLIENT
573 static int waitDepth = 0;
578#ifdef SYNC_WITH_SHM_FIFO
582 void read(
void * _buf,
int _len )
586 memset( _buf, 0, _len );
589 char * buf = (
char *) _buf;
590 int remaining = _len;
598 "Error while reading.\n" );
601 memset( _buf, 0, _len );
609 void write(
const void * _buf,
int _len )
615 const char * buf = (
const char *) _buf;
616 int remaining = _len;
624 "Error while writing.\n" );
630 remaining -= nwritten;
static bool isMainThreadWaiting()
Definition RemotePluginBase.h:530
int sendMessage(const message &_m)
int32_t readInt()
Definition RemotePluginBase.h:470
int m_socket
Definition RemotePluginBase.h:565
void invalidate()
Definition RemotePluginBase.h:552
bool m_invalid
Definition RemotePluginBase.h:635
message fetchAndProcessNextMessage()
Definition RemotePluginBase.h:462
virtual bool processMessage(const message &_m)=0
bool messagesLeft()
Definition RemotePluginBase.h:505
void write(const void *_buf, int _len)
Definition RemotePluginBase.h:609
void writeString(const std::string &_s)
Definition RemotePluginBase.h:496
pthread_mutex_t m_receiveMutex
Definition RemotePluginBase.h:637
void fetchAndProcessAllMessages()
Definition RemotePluginBase.h:522
static int & waitDepthCounter()
Definition RemotePluginBase.h:571
pthread_mutex_t m_sendMutex
Definition RemotePluginBase.h:638
void read(void *_buf, int _len)
Definition RemotePluginBase.h:582
void writeInt(const int32_t &_i)
Definition RemotePluginBase.h:477
bool isInvalid() const
Definition RemotePluginBase.h:450
message waitForMessage(const message &_m, bool _busy_waiting=false)
virtual ~RemotePluginBase()
std::string readString()
Definition RemotePluginBase.h:482
unsigned * m
Definition inflate.c:1559
register unsigned k
Definition inflate.c:946
struct huft * u[BMAX]
Definition inflate.c:1583
register unsigned i
Definition inflate.c:1575
JSAMPIMAGE data
Definition jpeglib.h:945
float in
Definition lilv_test.c:1460
float out
Definition lilv_test.c:1461
int int32_t
Definition mid.cpp:97
void fill(Buf &buf, T value)
Definition buffer.h:50
Definition AudioAlsa.cpp:35
RemoteMessageIDs
Definition RemotePluginBase.h:319
@ IdSaveSettingsToString
Definition RemotePluginBase.h:339
@ IdDebugMessage
Definition RemotePluginBase.h:345
@ IdSyncKey
Definition RemotePluginBase.h:324
@ IdMidiEvent
Definition RemotePluginBase.h:328
@ IdBufferSizeInformation
Definition RemotePluginBase.h:326
@ IdChangeInputOutputCount
Definition RemotePluginBase.h:334
@ IdLoadSettingsFromString
Definition RemotePluginBase.h:341
@ IdStartProcessing
Definition RemotePluginBase.h:329
@ IdChangeSharedMemoryKey
Definition RemotePluginBase.h:331
@ IdProcessingDone
Definition RemotePluginBase.h:330
@ IdInitDone
Definition RemotePluginBase.h:322
@ IdToggleUI
Definition RemotePluginBase.h:337
@ IdSavePresetFile
Definition RemotePluginBase.h:343
@ IdUndefined
Definition RemotePluginBase.h:320
@ IdLoadPresetFile
Definition RemotePluginBase.h:344
@ IdIdle
Definition RemotePluginBase.h:346
@ IdSaveSettingsToFile
Definition RemotePluginBase.h:340
@ IdHostInfoGotten
Definition RemotePluginBase.h:321
@ IdChangeOutputCount
Definition RemotePluginBase.h:333
@ IdQuit
Definition RemotePluginBase.h:323
@ IdIsUIVisible
Definition RemotePluginBase.h:338
@ IdHideUI
Definition RemotePluginBase.h:336
@ IdLoadSettingsFromFile
Definition RemotePluginBase.h:342
@ IdInformationUpdated
Definition RemotePluginBase.h:327
@ IdSampleRateInformation
Definition RemotePluginBase.h:325
@ IdUserBase
Definition RemotePluginBase.h:347
@ IdShowUI
Definition RemotePluginBase.h:335
@ IdChangeInputCount
Definition RemotePluginBase.h:332
#define true
Definition ordinals.h:82
#define false
Definition ordinals.h:83
Definition RemotePluginBase.h:356
message(const message &_m)=default
message()
Definition RemotePluginBase.h:357
message & addString(Args &&... args)
Definition RemotePluginBase.h:372
std::vector< std::string > data
Definition RemotePluginBase.h:424
message & addFloat(float _f)
Definition RemotePluginBase.h:386
QString getQString(int _p=0) const
Definition RemotePluginBase.h:400
std::string getString(int _p=0) const
Definition RemotePluginBase.h:394
bool operator==(const message &_m) const
Definition RemotePluginBase.h:416
int getInt(int _p=0) const
Definition RemotePluginBase.h:406
int id
Definition RemotePluginBase.h:421
friend class RemotePluginBase
Definition RemotePluginBase.h:426
message & addInt(int _i)
Definition RemotePluginBase.h:378
float getFloat(int _p) const
Definition RemotePluginBase.h:411
message(int _id)
Definition RemotePluginBase.h:365