25#ifndef LMMS_REMOTE_PLUGIN_BASE_H
26#define LMMS_REMOTE_PLUGIN_BASE_H
36#include "lmmsconfig.h"
38#if !(defined(LMMS_HAVE_SYS_IPC_H) && defined(LMMS_HAVE_SEMAPHORE_H))
39#define SYNC_WITH_SHM_FIFO
41#ifdef LMMS_HAVE_PROCESS_H
45#ifdef LMMS_HAVE_UNISTD_H
50#ifdef LMMS_HAVE_PTHREAD_H
55#ifdef BUILD_REMOTE_PLUGIN_CLIENT
59#ifndef SYNC_WITH_SHM_FIFO
60#include <sys/socket.h>
65#include "lmms_export.h"
68#ifndef SYNC_WITH_SHM_FIFO
75#ifdef SYNC_WITH_SHM_FIFO
84#ifdef SYNC_WITH_SHM_FIFO
89const int SHM_FIFO_SIZE = 512*1024;
109 char data[SHM_FIFO_SIZE];
113#ifndef BUILD_REMOTE_PLUGIN_CLIENT
121 m_data->startPtr = m_data->endPtr = 0;
123 m_data->dataSem.semKey = ( getpid()<<10 ) + ++
k;
124 m_data->messageSem.semKey = ( getpid()<<10 ) + ++
k;
125 m_dataSem = SystemSemaphore{std::to_string(m_data->dataSem.semKey), 1u};
126 m_messageSem = SystemSemaphore{std::to_string(m_data->messageSem.semKey), 0
u};
132 shmFifo(
const std::string& shmKey) :
137 m_data.attach(shmKey);
138 m_dataSem = SystemSemaphore{std::to_string(m_data->dataSem.semKey)};
139 m_messageSem = SystemSemaphore{std::to_string(m_data->messageSem.semKey)};
142 inline bool isInvalid()
const
153 inline bool isMaster()
const
161 if( !isInvalid() && m_lockDepth.fetch_add( 1 ) == 0 )
170 if( m_lockDepth.fetch_sub( 1 ) <= 1 )
177 inline void waitForMessage()
181 m_messageSem.acquire();
186 inline void messageSent()
188 m_messageSem.release();
199 inline void writeInt(
const int32_t & _i )
201 write( &_i,
sizeof( _i ) );
204 std::string readString()
207 const int len = readInt();
210 ret.resize(
static_cast<std::size_t
>(len));
211 read(ret.data(), len);
218 inline void writeString(
const std::string & _s )
220 const int len = _s.size();
222 write( _s.c_str(), len );
226 inline bool messagesLeft()
233 const bool empty = ( m_data->startPtr == m_data->endPtr );
239 const std::string& shmKey()
const
246 void read(
void * _buf,
int _len )
250 memset( _buf, 0, _len );
254 while( isInvalid() ==
false &&
255 _len > m_data->endPtr - m_data->startPtr )
258#ifndef LMMS_BUILD_WIN32
263 std::memcpy(_buf, m_data->data + m_data->startPtr, _len);
264 m_data->startPtr += _len;
266 if( m_data->startPtr == m_data->endPtr )
269 m_data->startPtr = m_data->endPtr = 0;
274 void write(
const void * _buf,
int _len )
276 if( isInvalid() || _len > SHM_FIFO_SIZE )
281 while( _len > SHM_FIFO_SIZE - m_data->endPtr )
284 if( m_data->startPtr > 0 )
286 memmove( m_data->data,
287 m_data->data + m_data->startPtr,
288 m_data->endPtr - m_data->startPtr );
289 m_data->endPtr = m_data->endPtr -
291 m_data->startPtr = 0;
294#ifndef LMMS_BUILD_WIN32
299 std::memcpy(m_data->data + m_data->endPtr, _buf, _len);
300 m_data->endPtr += _len;
304 volatile bool m_invalid;
306 SharedMemory<shmData> m_data;
307 SystemSemaphore m_dataSem;
308 SystemSemaphore m_messageSem;
309 std::atomic_int m_lockDepth;
368 template<
class... Args>
371 data.emplace_back(std::forward<Args>(args)...);
378 std::snprintf(buf, 32,
"%d", _i);
379 data.emplace_back( buf );
386 std::snprintf(buf, 32,
"%f", _f);
387 data.emplace_back( buf );
396#ifndef BUILD_REMOTE_PLUGIN_CLIENT
399 return QString::fromStdString(
getString( _p ) );
405 return atoi(
data[_p].c_str() );
410 return (
float) atof(
data[_p].c_str() );
415 return(
id == _m.
id );
427#ifdef SYNC_WITH_SHM_FIFO
434#ifdef SYNC_WITH_SHM_FIFO
435 void reset( shmFifo *
in, shmFifo *
out )
449#ifdef SYNC_WITH_SHM_FIFO
450 return m_in->isInvalid() || m_out->isInvalid();
457 bool _busy_waiting =
false );
466#ifndef SYNC_WITH_SHM_FIFO
476 write( &_i,
sizeof( _i ) );
485 ret.resize(
static_cast<std::size_t
>(len));
486 read(ret.data(), len);
495 const int len = _s.size();
497 write( _s.c_str(), len );
501#ifndef BUILD_REMOTE_PLUGIN_CLIENT
504#ifdef SYNC_WITH_SHM_FIFO
505 return m_in->messagesLeft();
507 struct pollfd pollin;
509 pollin.events = POLLIN;
511 if ( poll( &pollin, 1, 0 ) == -1 )
513 qWarning(
"Unexpected poll error." );
515 return pollin.revents & POLLIN;
537#ifdef SYNC_WITH_SHM_FIFO
538 inline const shmFifo *
in()
const
543 inline const shmFifo *
out()
const
551#ifdef SYNC_WITH_SHM_FIFO
561#ifndef SYNC_WITH_SHM_FIFO
567#ifndef BUILD_REMOTE_PLUGIN_CLIENT
570 static int waitDepth = 0;
575#ifdef SYNC_WITH_SHM_FIFO
579 void read(
void * _buf,
int _len )
583 memset( _buf, 0, _len );
586 char * buf = (
char *) _buf;
587 int remaining = _len;
595 "Error while reading.\n" );
598 memset( _buf, 0, _len );
606 void write(
const void * _buf,
int _len )
612 const char * buf = (
const char *) _buf;
613 int remaining = _len;
621 "Error while writing.\n" );
627 remaining -= nwritten;
static bool isMainThreadWaiting()
Definition RemotePluginBase.h:527
int sendMessage(const message &_m)
int32_t readInt()
Definition RemotePluginBase.h:467
int m_socket
Definition RemotePluginBase.h:562
void invalidate()
Definition RemotePluginBase.h:549
bool m_invalid
Definition RemotePluginBase.h:632
message fetchAndProcessNextMessage()
Definition RemotePluginBase.h:459
virtual bool processMessage(const message &_m)=0
bool messagesLeft()
Definition RemotePluginBase.h:502
void write(const void *_buf, int _len)
Definition RemotePluginBase.h:606
void writeString(const std::string &_s)
Definition RemotePluginBase.h:493
pthread_mutex_t m_receiveMutex
Definition RemotePluginBase.h:634
void fetchAndProcessAllMessages()
Definition RemotePluginBase.h:519
static int & waitDepthCounter()
Definition RemotePluginBase.h:568
pthread_mutex_t m_sendMutex
Definition RemotePluginBase.h:635
void read(void *_buf, int _len)
Definition RemotePluginBase.h:579
void writeInt(const int32_t &_i)
Definition RemotePluginBase.h:474
bool isInvalid() const
Definition RemotePluginBase.h:447
message waitForMessage(const message &_m, bool _busy_waiting=false)
virtual ~RemotePluginBase()
std::string readString()
Definition RemotePluginBase.h:479
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:316
@ IdSaveSettingsToString
Definition RemotePluginBase.h:336
@ IdDebugMessage
Definition RemotePluginBase.h:342
@ IdSyncKey
Definition RemotePluginBase.h:321
@ IdMidiEvent
Definition RemotePluginBase.h:325
@ IdBufferSizeInformation
Definition RemotePluginBase.h:323
@ IdChangeInputOutputCount
Definition RemotePluginBase.h:331
@ IdLoadSettingsFromString
Definition RemotePluginBase.h:338
@ IdStartProcessing
Definition RemotePluginBase.h:326
@ IdChangeSharedMemoryKey
Definition RemotePluginBase.h:328
@ IdProcessingDone
Definition RemotePluginBase.h:327
@ IdInitDone
Definition RemotePluginBase.h:319
@ IdToggleUI
Definition RemotePluginBase.h:334
@ IdSavePresetFile
Definition RemotePluginBase.h:340
@ IdUndefined
Definition RemotePluginBase.h:317
@ IdLoadPresetFile
Definition RemotePluginBase.h:341
@ IdIdle
Definition RemotePluginBase.h:343
@ IdSaveSettingsToFile
Definition RemotePluginBase.h:337
@ IdHostInfoGotten
Definition RemotePluginBase.h:318
@ IdChangeOutputCount
Definition RemotePluginBase.h:330
@ IdQuit
Definition RemotePluginBase.h:320
@ IdIsUIVisible
Definition RemotePluginBase.h:335
@ IdHideUI
Definition RemotePluginBase.h:333
@ IdLoadSettingsFromFile
Definition RemotePluginBase.h:339
@ IdInformationUpdated
Definition RemotePluginBase.h:324
@ IdSampleRateInformation
Definition RemotePluginBase.h:322
@ IdUserBase
Definition RemotePluginBase.h:344
@ IdShowUI
Definition RemotePluginBase.h:332
@ IdChangeInputCount
Definition RemotePluginBase.h:329
#define true
Definition ordinals.h:82
#define false
Definition ordinals.h:83
Definition RemotePluginBase.h:353
message(const message &_m)=default
message()
Definition RemotePluginBase.h:354
message & addString(Args &&... args)
Definition RemotePluginBase.h:369
std::vector< std::string > data
Definition RemotePluginBase.h:421
message & addFloat(float _f)
Definition RemotePluginBase.h:383
QString getQString(int _p=0) const
Definition RemotePluginBase.h:397
std::string getString(int _p=0) const
Definition RemotePluginBase.h:391
bool operator==(const message &_m) const
Definition RemotePluginBase.h:413
int getInt(int _p=0) const
Definition RemotePluginBase.h:403
int id
Definition RemotePluginBase.h:418
friend class RemotePluginBase
Definition RemotePluginBase.h:423
message & addInt(int _i)
Definition RemotePluginBase.h:375
float getFloat(int _p) const
Definition RemotePluginBase.h:408
message(int _id)
Definition RemotePluginBase.h:362