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 inline std::string readString()
209 const int len = readInt();
212 char * sc =
new char[len + 1];
219 return std::string();
223 inline void writeString(
const std::string & _s )
225 const int len = _s.size();
227 write( _s.c_str(), len );
231 inline bool messagesLeft()
238 const bool empty = ( m_data->startPtr == m_data->endPtr );
244 const std::string& shmKey()
const
251 void read(
void * _buf,
int _len )
255 memset( _buf, 0, _len );
259 while( isInvalid() ==
false &&
260 _len > m_data->endPtr - m_data->startPtr )
263#ifndef LMMS_BUILD_WIN32
268 std::memcpy(_buf, m_data->data + m_data->startPtr, _len);
269 m_data->startPtr += _len;
271 if( m_data->startPtr == m_data->endPtr )
274 m_data->startPtr = m_data->endPtr = 0;
279 void write(
const void * _buf,
int _len )
281 if( isInvalid() || _len > SHM_FIFO_SIZE )
286 while( _len > SHM_FIFO_SIZE - m_data->endPtr )
289 if( m_data->startPtr > 0 )
291 memmove( m_data->data,
292 m_data->data + m_data->startPtr,
293 m_data->endPtr - m_data->startPtr );
294 m_data->endPtr = m_data->endPtr -
296 m_data->startPtr = 0;
299#ifndef LMMS_BUILD_WIN32
304 std::memcpy(m_data->data + m_data->endPtr, _buf, _len);
305 m_data->endPtr += _len;
309 volatile bool m_invalid;
311 SharedMemory<shmData> m_data;
312 SystemSemaphore m_dataSem;
313 SystemSemaphore m_messageSem;
314 std::atomic_int m_lockDepth;
375 data.push_back( _s );
382 std::snprintf(buf, 32,
"%d", _i);
383 data.emplace_back( buf );
390 std::snprintf(buf, 32,
"%f", _f);
391 data.emplace_back( buf );
400#ifndef BUILD_REMOTE_PLUGIN_CLIENT
403 return QString::fromStdString(
getString( _p ) );
409 return atoi(
data[_p].c_str() );
414 return (
float) atof(
data[_p].c_str() );
419 return(
id == _m.
id );
431#ifdef SYNC_WITH_SHM_FIFO
438#ifdef SYNC_WITH_SHM_FIFO
439 void reset( shmFifo *
in, shmFifo *
out )
453#ifdef SYNC_WITH_SHM_FIFO
454 return m_in->isInvalid() || m_out->isInvalid();
461 bool _busy_waiting =
false );
470#ifndef SYNC_WITH_SHM_FIFO
480 write( &_i,
sizeof( _i ) );
488 char * sc =
new char[len + 1];
495 return std::string();
501 const int len = _s.size();
503 write( _s.c_str(), len );
507#ifndef BUILD_REMOTE_PLUGIN_CLIENT
510#ifdef SYNC_WITH_SHM_FIFO
511 return m_in->messagesLeft();
513 struct pollfd pollin;
515 pollin.events = POLLIN;
517 if ( poll( &pollin, 1, 0 ) == -1 )
519 qWarning(
"Unexpected poll error." );
521 return pollin.revents & POLLIN;
543#ifdef SYNC_WITH_SHM_FIFO
544 inline const shmFifo *
in()
const
549 inline const shmFifo *
out()
const
557#ifdef SYNC_WITH_SHM_FIFO
567#ifndef SYNC_WITH_SHM_FIFO
573#ifndef BUILD_REMOTE_PLUGIN_CLIENT
576 static int waitDepth = 0;
581#ifdef SYNC_WITH_SHM_FIFO
585 void read(
void * _buf,
int _len )
589 memset( _buf, 0, _len );
592 char * buf = (
char *) _buf;
593 int remaining = _len;
601 "Error while reading.\n" );
604 memset( _buf, 0, _len );
612 void write(
const void * _buf,
int _len )
618 const char * buf = (
const char *) _buf;
619 int remaining = _len;
627 "Error while writing.\n" );
633 remaining -= nwritten;
static bool isMainThreadWaiting()
Definition RemotePluginBase.h:533
int sendMessage(const message &_m)
int32_t readInt()
Definition RemotePluginBase.h:471
int m_socket
Definition RemotePluginBase.h:568
void invalidate()
Definition RemotePluginBase.h:555
bool m_invalid
Definition RemotePluginBase.h:638
message fetchAndProcessNextMessage()
Definition RemotePluginBase.h:463
virtual bool processMessage(const message &_m)=0
bool messagesLeft()
Definition RemotePluginBase.h:508
void write(const void *_buf, int _len)
Definition RemotePluginBase.h:612
void writeString(const std::string &_s)
Definition RemotePluginBase.h:499
pthread_mutex_t m_receiveMutex
Definition RemotePluginBase.h:640
void fetchAndProcessAllMessages()
Definition RemotePluginBase.h:525
static int & waitDepthCounter()
Definition RemotePluginBase.h:574
pthread_mutex_t m_sendMutex
Definition RemotePluginBase.h:641
void read(void *_buf, int _len)
Definition RemotePluginBase.h:585
void writeInt(const int32_t &_i)
Definition RemotePluginBase.h:478
bool isInvalid() const
Definition RemotePluginBase.h:451
message waitForMessage(const message &_m, bool _busy_waiting=false)
virtual ~RemotePluginBase()
std::string readString()
Definition RemotePluginBase.h:483
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
unsigned s
Definition inflate.c:1555
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:321
@ IdSaveSettingsToString
Definition RemotePluginBase.h:341
@ IdDebugMessage
Definition RemotePluginBase.h:347
@ IdSyncKey
Definition RemotePluginBase.h:326
@ IdMidiEvent
Definition RemotePluginBase.h:330
@ IdBufferSizeInformation
Definition RemotePluginBase.h:328
@ IdChangeInputOutputCount
Definition RemotePluginBase.h:336
@ IdLoadSettingsFromString
Definition RemotePluginBase.h:343
@ IdStartProcessing
Definition RemotePluginBase.h:331
@ IdChangeSharedMemoryKey
Definition RemotePluginBase.h:333
@ IdProcessingDone
Definition RemotePluginBase.h:332
@ IdInitDone
Definition RemotePluginBase.h:324
@ IdToggleUI
Definition RemotePluginBase.h:339
@ IdSavePresetFile
Definition RemotePluginBase.h:345
@ IdUndefined
Definition RemotePluginBase.h:322
@ IdLoadPresetFile
Definition RemotePluginBase.h:346
@ IdIdle
Definition RemotePluginBase.h:348
@ IdSaveSettingsToFile
Definition RemotePluginBase.h:342
@ IdHostInfoGotten
Definition RemotePluginBase.h:323
@ IdChangeOutputCount
Definition RemotePluginBase.h:335
@ IdQuit
Definition RemotePluginBase.h:325
@ IdIsUIVisible
Definition RemotePluginBase.h:340
@ IdHideUI
Definition RemotePluginBase.h:338
@ IdLoadSettingsFromFile
Definition RemotePluginBase.h:344
@ IdInformationUpdated
Definition RemotePluginBase.h:329
@ IdSampleRateInformation
Definition RemotePluginBase.h:327
@ IdUserBase
Definition RemotePluginBase.h:349
@ IdShowUI
Definition RemotePluginBase.h:337
@ IdChangeInputCount
Definition RemotePluginBase.h:334
#define true
Definition ordinals.h:82
#define false
Definition ordinals.h:83
Definition RemotePluginBase.h:358
message(const message &_m)=default
message()
Definition RemotePluginBase.h:359
std::vector< std::string > data
Definition RemotePluginBase.h:425
message & addFloat(float _f)
Definition RemotePluginBase.h:387
QString getQString(int _p=0) const
Definition RemotePluginBase.h:401
std::string getString(int _p=0) const
Definition RemotePluginBase.h:395
message & addString(const std::string &_s)
Definition RemotePluginBase.h:373
bool operator==(const message &_m) const
Definition RemotePluginBase.h:417
int getInt(int _p=0) const
Definition RemotePluginBase.h:407
int id
Definition RemotePluginBase.h:422
friend class RemotePluginBase
Definition RemotePluginBase.h:427
message & addInt(int _i)
Definition RemotePluginBase.h:379
float getFloat(int _p) const
Definition RemotePluginBase.h:412
message(int _id)
Definition RemotePluginBase.h:367