Skip to content

Commit 57f6a47

Browse files
committed
Merge branch 'song-tick-pointer'
* song-tick-pointer: EBEAST: utilities.js: work around Firefox lacking setImmediate() EBEAST: utilities.js: batch shm_reschedule() requests during the same tick EBEAST: utilities.js: cleanup ShmFragmentSeq for broadcast_shm_fragments() EBEAST: utilities.js: fix missing initial call_frame_handlers() EBEAST: b/part-thumb.vue: optimize redraws via batch-await before updating EBEAST: b/part-thumb.vue: fix vertical note orientation EBEAST: b/part-thumb.vue: properly scale font-size and note thickness EBEAST: b/part-thumb.vue: adjust canvas size to match hardware pixels EBEAST: b/part-thumb.vue: use await for part.get_last_tick() EBEAST: adjust part thumbnail colors and style EBEAST: b/track-list.vue: fix tick position subscription setup EBEAST: b/track-list.vue: avoid tick pointer layout being cut-off EBEAST: b/track-list.vue: add song position pointer, synced to Song EBEAST: utilities.js: fix shm_unsubscribe() EBEAST: utilities.js: remove old array_fields_* code EBEAST: eliminate shm_id handling BEAST-GTK: eliminate shm_id BSE: eliminate shm_id, only one shared memory area is supported by Bse.server EBEAST: b/track-view.vue: remove old Util.array_fields_* handling BSE: add Song.get_shm_offset and SongTelemetry to monitor tick pointer BSE: beast-sound-engine.cc: add debug code for extended binary watching Signed-off-by: Tim Janik <[email protected]>
2 parents 9f75cce + dd83e1c commit 57f6a47

19 files changed

+250
-202
lines changed

beast-gtk/bstbuseditor.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -198,16 +198,16 @@ bst_bus_editor_set_bus (BstBusEditor *self,
198198
self->rmonitor = self->source.create_signal_monitor (1);
199199
self->lmonitor.set_probe_features (features);
200200
self->rmonitor.set_probe_features (features);
201-
Bst::MonitorFieldU lfields = Bst::monitor_fields_from_shm (self->lmonitor.get_shm_id(), self->lmonitor.get_shm_offset (Bse::MonitorField (0)));
202-
Bst::MonitorFieldU rfields = Bst::monitor_fields_from_shm (self->rmonitor.get_shm_id(), self->rmonitor.get_shm_offset (Bse::MonitorField (0)));
201+
Bst::MonitorFieldU lfields = Bst::monitor_fields_from_shm (self->lmonitor.get_shm_offset (Bse::MonitorField (0)));
202+
Bst::MonitorFieldU rfields = Bst::monitor_fields_from_shm (self->rmonitor.get_shm_offset (Bse::MonitorField (0)));
203203
auto framecb = [self, lfields, rfields] () {
204204
bst_db_beam_set_value (self->lbeam, lfields.f32 (Bse::MonitorField::F32_DB_SPL));
205205
bst_db_beam_set_value (self->rbeam, rfields.f32 (Bse::MonitorField::F32_DB_SPL));
206206
if (0)
207-
printerr ("BstBusEditor: (%x.%x/%x %x.%x/%x) ldb=%f rdb=%f\n",
208-
self->lmonitor.get_shm_id(), self->lmonitor.get_shm_offset (Bse::MonitorField (0)),
207+
printerr ("BstBusEditor: (%x/%x %x/%x) ldb=%f rdb=%f\n",
208+
self->lmonitor.get_shm_offset (Bse::MonitorField (0)),
209209
lfields.f64 (Bse::MonitorField::F64_GENERATION),
210-
self->rmonitor.get_shm_id(), self->rmonitor.get_shm_offset (Bse::MonitorField (0)),
210+
self->rmonitor.get_shm_offset (Bse::MonitorField (0)),
211211
rfields.f64 (Bse::MonitorField::F64_GENERATION),
212212
lfields.f32 (Bse::MonitorField::F32_DB_SPL),
213213
rfields.f32 (Bse::MonitorField::F32_DB_SPL));

beast-gtk/bstsnifferscope.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -271,17 +271,17 @@ bst_sniffer_scope_set_sniffer (BstSnifferScope *self, Bse::SourceH source)
271271
features.probe_range = true;
272272
self->lmonitor.set_probe_features (features);
273273
self->rmonitor.set_probe_features (features);
274-
Bst::MonitorFieldU lfields = Bst::monitor_fields_from_shm (self->lmonitor.get_shm_id(), self->lmonitor.get_shm_offset (Bse::MonitorField (0)));
275-
Bst::MonitorFieldU rfields = Bst::monitor_fields_from_shm (self->rmonitor.get_shm_id(), self->rmonitor.get_shm_offset (Bse::MonitorField (0)));
274+
Bst::MonitorFieldU lfields = Bst::monitor_fields_from_shm (self->lmonitor.get_shm_offset (Bse::MonitorField (0)));
275+
Bst::MonitorFieldU rfields = Bst::monitor_fields_from_shm (self->rmonitor.get_shm_offset (Bse::MonitorField (0)));
276276
auto framecb = [self, lfields, rfields] () {
277277
scope_draw_range (self,
278278
lfields.f32 (Bse::MonitorField::F32_MIN), lfields.f32 (Bse::MonitorField::F32_MAX),
279279
rfields.f32 (Bse::MonitorField::F32_MIN), rfields.f32 (Bse::MonitorField::F32_MAX));
280280
if (0)
281-
printerr ("SnifferScope: (%x.%x/%x %x.%x/%x) %f,%f %f,%f\n",
282-
self->lmonitor.get_shm_id(), self->lmonitor.get_shm_offset (Bse::MonitorField (0)),
281+
printerr ("SnifferScope: (%x/%x %x/%x) %f,%f %f,%f\n",
282+
self->lmonitor.get_shm_offset (Bse::MonitorField (0)),
283283
lfields.f64 (Bse::MonitorField::F64_GENERATION),
284-
self->rmonitor.get_shm_id(), self->rmonitor.get_shm_offset (Bse::MonitorField (0)),
284+
self->rmonitor.get_shm_offset (Bse::MonitorField (0)),
285285
rfields.f64 (Bse::MonitorField::F64_GENERATION),
286286
lfields.f32 (Bse::MonitorField::F32_MIN), lfields.f32 (Bse::MonitorField::F32_MAX),
287287
rfields.f32 (Bse::MonitorField::F32_MIN), rfields.f32 (Bse::MonitorField::F32_MAX));

beast-gtk/bstutils.cc

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,12 +144,11 @@ add_frame_handler (const std::function<void()> &func)
144144

145145
// == Shared Memory Monitors ==
146146
MonitorFieldU
147-
monitor_fields_from_shm (int64 shm_id, uint32 shm_offset)
147+
monitor_fields_from_shm (uint32 shm_offset)
148148
{
149149
const MonitorFieldU mfu0 { NULL };
150150
assert_return ((shm_offset & 0x0f) == 0, mfu0); // must have alginment >= 16 bytes
151-
Bse::SharedMemory sm = bse_server.get_shared_memory (shm_id);
152-
assert_return (sm.shm_id == shm_id, mfu0);
151+
Bse::SharedMemory sm = bse_server.get_shared_memory();
153152
assert_return (sm.shm_creator == Bse::this_thread_getpid(), mfu0);
154153
char *shm_start = (char*) sm.shm_start; // allowed if sm.shm_creator matches our pid
155154
assert_return (shm_start != NULL, mfu0);

beast-gtk/bstutils.hh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public:
3737
inline double& f64 (Bse::MonitorField mf) const { return f64_[size_t (mf) / 8]; }
3838
};
3939

40-
MonitorFieldU monitor_fields_from_shm (int64 shm_id, uint32_t shm_offset);
40+
MonitorFieldU monitor_fields_from_shm (uint32_t shm_offset);
4141

4242
} // Bst
4343

bse/beast-sound-engine.cc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,19 @@ struct IpcHandlerImpl : Bse::IpcHandler {
364364
ServerEndpoint::connection_ptr con = websocket_server.get_con_from_hdl (weak_hdl, ec);
365365
const ptrdiff_t conid = ptrdiff_t (con.get());
366366
Bse::printerr ("%p: BINARY: len=%d hash=%016x\n", conid, message.size(), Bse::fnv1a_consthash64 (message));
367+
if (0)
368+
{
369+
std::string hex;
370+
for (size_t i = 0; i < message.size(); i++)
371+
{
372+
if (i && 0 == i % 16)
373+
hex += "\n ";
374+
else if (0 == i % 8)
375+
hex += " ";
376+
hex += Bse::string_format (" %02x", message[i]);
377+
}
378+
Bse::printerr ("%s\n", hex);
379+
}
367380
}
368381
return true; // connection alive and message queued
369382
};

bse/bseapi.idl

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -786,7 +786,6 @@ sequence FloatSeq {
786786
/// Descriptor for a shared memory region.
787787
record SharedMemory {
788788
int64 shm_creator; ///< IPC id of the shared memory creator process.
789-
int64 shm_id; ///< Identifier for the associated shared memory area.
790789
int64 shm_start; ///< Shared memory area location.
791790
int64 shm_length; ///< Shared memory area length in bytes
792791
};
@@ -805,8 +804,7 @@ interface SignalMonitor {
805804
int32 get_ochannel (); ///< Retrieve output channel the SignalMonitor is connected to.
806805
int64 get_mix_freq (); ///< Mix frequency at which monitor values are calculated.
807806
int64 get_frame_duration (); ///< Frame duration in µseconds for the calculation of monitor values.
808-
int64 get_shm_id (); ///< Identifier for the associated shared memory area.
809-
int64 get_shm_offset (MonitorField fld); ///< Offset into shm_id for MonitorField values of `ochannel`.
807+
int64 get_shm_offset (MonitorField fld); ///< Offset into shared memory for MonitorField values of `ochannel`.
810808
void set_probe_features (ProbeFeatures pf); ///< Configure probe features.
811809
ProbeFeatures get_probe_features (); ///< Get configured probe features.
812810
};
@@ -1020,6 +1018,12 @@ interface Bus : SubSynth {
10201018
};
10211019
};
10221020

1021+
/// Offsets for signal monitoring fields in bytes, field type and size is used as prefix.
1022+
enum SongTelemetry {
1023+
I32_TICK_POINTER = 0 * 4, ///< Current song position pointer.
1024+
BYTECOUNT = 1 * 4, ///< Total length of all fields.
1025+
};
1026+
10231027
/// Interface for Track and Part objects, as well as meta data for sequencing.
10241028
interface Song : SNet {
10251029
SongTiming get_timing (int32 tick); ///< Retrieve song timing information at a specific tick.
@@ -1036,6 +1040,7 @@ interface Song : SNet {
10361040
Bus get_master_bus (); ///< Retrieve master output bus of a song if it exists.
10371041
/// Synthesize a note on a song of an active project.
10381042
void synthesize_note (Track track, int32 duration, int32 note, int32 fine_tune, float64 velocity);
1043+
int64 get_shm_offset (SongTelemetry fld); ///< Offset into SharedMemory for SongTelemetry fields.
10391044
// signal void pointer_changed (int32 a);
10401045
// group _("MIDI Instrument") {
10411046
// CSynth pnet = Object ("Postprocessor", "Synthesis network to be used as postprocessor", STANDARD);
@@ -1321,10 +1326,9 @@ interface Server : Container {
13211326
AuxData find_module_type (String module_type); ///< Retrieve info about a Source type names.
13221327
Icon module_type_icon (String module_type); ///< Retrieve the icon associated with a module type.
13231328
SampleFileInfo sample_file_info (String file_name); ///< Load sample file info from file.
1324-
void broadcast_shm_fragments (int64 shm_id,
1325-
ShmFragmentSeq plan,
1329+
void broadcast_shm_fragments (ShmFragmentSeq plan,
13261330
int32 interval_ms); ///< Broadcast shared memory fragments to the current Jsonipc connection.
1327-
SharedMemory get_shared_memory (int64 id); ///< Retrieve SharedMemory from id.
1331+
SharedMemory get_shared_memory (); ///< Retrieve global SharedMemory information.
13281332
Configuration get_config_defaults (); ///< Retrieve Bse::Configuration setting defaults.
13291333
void set_config (Configuration configuration); ///< Assign updated Bse::Configuration settings.
13301334
Configuration get_config (); ///< Retrieve Bse::Configuration settings.

bse/bsesequencer.cc

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ Sequencer::start_song (BseSong *song, uint64 start_stamp)
252252
song->sequencer_start_SL = 0;
253253
song->sequencer_done_SL = 0;
254254
song->delta_stamp_SL = 0;
255-
song->tick_SL = 0;
255+
*song->tick_SL = 0;
256256
SfiRing *ring;
257257
for (ring = song->tracks_SL; ring; ring = sfi_ring_walk (ring, song->tracks_SL))
258258
{
@@ -401,7 +401,7 @@ Sequencer::process_song_unlooped_SL (BseSong *song, uint n_ticks, bool force_act
401401
gdouble current_stamp = song->sequencer_start_SL + song->delta_stamp_SL;
402402
gdouble stamps_per_tick = 1.0 / song->tpsi_SL;
403403
guint64 next_stamp = bse_dtoull (current_stamp + n_ticks * stamps_per_tick);
404-
guint tick_bound = song->tick_SL + n_ticks;
404+
guint tick_bound = *song->tick_SL + n_ticks;
405405
guint n_done_tracks = 0, n_tracks = 0;
406406
SfiRing *ring;
407407
for (ring = song->tracks_SL; ring; ring = sfi_ring_walk (ring, song->tracks_SL))
@@ -411,13 +411,13 @@ Sequencer::process_song_unlooped_SL (BseSong *song, uint n_ticks, bool force_act
411411
if (!track->track_done_SL || force_active_tracks)
412412
{
413413
track->track_done_SL = FALSE;
414-
process_track_SL (song, track, current_stamp, song->tick_SL, tick_bound, stamps_per_tick, midi_receiver);
414+
process_track_SL (song, track, current_stamp, *song->tick_SL, tick_bound, stamps_per_tick, midi_receiver);
415415
}
416416
if (track->track_done_SL)
417417
n_done_tracks++;
418418
}
419419
bse_midi_receiver_process_events (midi_receiver, next_stamp);
420-
song->tick_SL += n_ticks;
420+
*song->tick_SL += n_ticks;
421421
song->delta_stamp_SL += n_ticks * stamps_per_tick;
422422
return n_done_tracks != n_tracks;
423423
}
@@ -426,17 +426,17 @@ void
426426
Sequencer::process_song_SL (BseSong *song, uint n_ticks)
427427
{
428428
gboolean tracks_active = TRUE;
429-
if (song->loop_enabled_SL && (gint64) song->tick_SL <= song->loop_right_SL)
429+
if (song->loop_enabled_SL && int64_t (*song->tick_SL) <= song->loop_right_SL)
430430
do
431431
{
432-
guint tdiff = song->loop_right_SL - song->tick_SL;
432+
guint tdiff = song->loop_right_SL - *song->tick_SL;
433433
tdiff = MIN (tdiff, n_ticks);
434434
if (tdiff)
435435
process_song_unlooped_SL (song, tdiff, true);
436436
n_ticks -= tdiff;
437-
if ((gint64) song->tick_SL >= song->loop_right_SL)
437+
if (int64_t (*song->tick_SL) >= song->loop_right_SL)
438438
{
439-
song->tick_SL = song->loop_left_SL;
439+
*song->tick_SL = song->loop_left_SL;
440440
}
441441
}
442442
while (n_ticks);

bse/bseserver.cc

Lines changed: 49 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1415,11 +1415,9 @@ validate_shm_fragments (const SharedMemory &smem, const ShmFragmentSeq &plan, si
14151415
}
14161416

14171417
void
1418-
ServerImpl::broadcast_shm_fragments (int64 shm_id, const ShmFragmentSeq &plan, int interval_ms)
1418+
ServerImpl::broadcast_shm_fragments (const ShmFragmentSeq &plan, int interval_ms)
14191419
{
1420-
assert_return (shm_id != 0);
1421-
SharedMemory sm = get_shared_memory (shm_id);
1422-
assert_return (sm.shm_id != 0); // shm_id must be valid
1420+
SharedMemory sm = get_shared_memory();
14231421
IpcHandler *ipch = get_ipc_handler();
14241422
const ptrdiff_t conid = ipch ? ipch->current_connection_id() : 0;
14251423
assert_return (conid != 0);
@@ -1464,24 +1462,21 @@ ServerImpl::broadcast_shm_fragments (int64 shm_id, const ShmFragmentSeq &plan, i
14641462
broad.timerid = exec_timeout (broadcast_timer_func, std::max (interval_ms, 16));
14651463
}
14661464

1467-
#define SHARED_MEMORY_AREA_SIZE (4 * 1024 * 1024)
1465+
static constexpr size_t SHARED_MEMORY_AREA_SIZE = 4 * 1024 * 1024;
1466+
static size_t current_shared_memory_area_size = SHARED_MEMORY_AREA_SIZE;
14681467

1469-
static std::vector<uint32> shared_memory_area_ids;
1468+
static const MemoryArea&
1469+
server_shared_memory_area()
1470+
{
1471+
static MemoryArea shm_area = create_memory_area (SHARED_MEMORY_AREA_SIZE, 2 * BSE_CACHE_LINE_ALIGNMENT);
1472+
return shm_area;
1473+
}
14701474

14711475
SharedMemory
1472-
ServerImpl::get_shared_memory (int64 shm_id)
1476+
ServerImpl::get_shared_memory()
14731477
{
1478+
const MemoryArea &ma = server_shared_memory_area();
14741479
SharedMemory sm;
1475-
bool found_shm_id = false;
1476-
for (auto id : shared_memory_area_ids)
1477-
if (id == shm_id)
1478-
{
1479-
found_shm_id = true;
1480-
break;
1481-
}
1482-
assert_return (found_shm_id, sm);
1483-
MemoryArea ma = find_memory_area (shm_id);
1484-
sm.shm_id = ma.mem_id;
14851480
sm.shm_start = ma.mem_start;
14861481
sm.shm_length = ma.mem_length;
14871482
sm.shm_creator = this_thread_getpid();
@@ -1494,33 +1489,39 @@ ServerImpl::allocate_shared_block (int64 length)
14941489
SharedBlock sb;
14951490
assert_return (length <= SHARED_MEMORY_AREA_SIZE, sb);
14961491
return_unless (length > 0, sb);
1497-
AlignedBlock ab;
1498-
for (size_t i = 0; i < shared_memory_area_ids.size(); i++)
1492+
const MemoryArea &ma = server_shared_memory_area();
1493+
AlignedBlock ab = allocate_aligned_block (ma.mem_id, length);
1494+
if (!ab.block_start)
14991495
{
1500-
ab = allocate_aligned_block (shared_memory_area_ids[i], length);
1501-
if (ab.block_start)
1502-
break;
1496+
// Generally, this should not happen, if it does, we need to increase the area size
1497+
// and possibly deal with fragmentation better.
1498+
fatal_error ("Failed to allocate from shared memory (reserved=%d, used=%d, needed=%d), please report to upstream",
1499+
SHARED_MEMORY_AREA_SIZE, SHARED_MEMORY_AREA_SIZE - current_shared_memory_area_size, length);
15031500
}
1504-
if (!ab.block_start)
1501+
const size_t prev_shared_memory_area_size = current_shared_memory_area_size;
1502+
current_shared_memory_area_size -= length;
1503+
if (prev_shared_memory_area_size >= SHARED_MEMORY_AREA_SIZE / 2 &&
1504+
current_shared_memory_area_size < SHARED_MEMORY_AREA_SIZE / 2)
15051505
{
1506-
shared_memory_area_ids.push_back (create_memory_area (SHARED_MEMORY_AREA_SIZE, 2 * BSE_CACHE_LINE_ALIGNMENT).mem_id);
1507-
ab = allocate_aligned_block (shared_memory_area_ids.back(), length);
1506+
// There should always be plenty of space, we need to increase the area if not
1507+
warning ("Available shared memory dropped below 50%% (reserved=%d, used=%d, needed=%d), please report to upstream",
1508+
SHARED_MEMORY_AREA_SIZE, SHARED_MEMORY_AREA_SIZE - current_shared_memory_area_size, length);
15081509
}
1509-
assert_return (ab.block_start != NULL, sb);
1510-
sb.shm_id = ab.mem_id;
15111510
sb.mem_length = ab.block_length;
15121511
sb.mem_start = ab.block_start;
1513-
sb.mem_offset = uint64 (sb.mem_start) - find_memory_area (sb.shm_id).mem_start;
1512+
sb.mem_offset = uint64 (sb.mem_start) - ma.mem_start;
15141513
return sb;
15151514
}
15161515

15171516
void
15181517
ServerImpl::release_shared_block (const SharedBlock &sb)
15191518
{
1520-
assert_return (sb.shm_id == uint32 (sb.shm_id));
15211519
assert_return (sb.mem_length == int32 (sb.mem_length));
1522-
AlignedBlock ab { uint32 (sb.shm_id), uint32 (sb.mem_length), sb.mem_start };
1520+
const MemoryArea &ma = server_shared_memory_area();
1521+
AlignedBlock ab { ma.mem_id, uint32 (sb.mem_length), sb.mem_start };
15231522
release_aligned_block (ab);
1523+
assert_return (current_shared_memory_area_size + ab.block_length <= SHARED_MEMORY_AREA_SIZE);
1524+
current_shared_memory_area_size += ab.block_length;
15241525
}
15251526

15261527
IpcHandler::~IpcHandler()
@@ -1568,27 +1569,32 @@ BSE_INTEGRITY_TEST (bse_server_test_allocator);
15681569
static void
15691570
bse_server_test_allocator()
15701571
{
1571-
const ssize_t mb = 1024 * 1024;
1572-
SharedBlock sb1 = BSE_SERVER.allocate_shared_block (mb);
1572+
const ssize_t block = 512 * 1024;
1573+
SharedBlock sb1 = BSE_SERVER.allocate_shared_block (block);
15731574
assert_return (sb1.mem_start);
1574-
SharedBlock sb2 = BSE_SERVER.allocate_shared_block (mb);
1575+
SharedBlock sb2 = BSE_SERVER.allocate_shared_block (block);
15751576
assert_return (sb2.mem_start);
1576-
SharedBlock sb3 = BSE_SERVER.allocate_shared_block (mb * 3);
1577+
SharedBlock sb3 = BSE_SERVER.allocate_shared_block (block * 2);
15771578
assert_return (sb3.mem_start);
1578-
assert_return (sb3.shm_id != sb1.shm_id); // 1mb + 1mb + 3mb won't fit into 4mb area
1579+
// assert_return (sb3.shm_id == sb1.shm_id); // 1mb + 1mb + 2mb barely fit into 4mb area
15791580
BSE_SERVER.release_shared_block (sb3);
15801581
BSE_SERVER.release_shared_block (sb2);
1581-
sb3 = BSE_SERVER.allocate_shared_block (mb * 3);
1582+
sb3 = BSE_SERVER.allocate_shared_block (block * 3);
15821583
assert_return (sb3.mem_start);
1583-
assert_return (sb3.shm_id == sb1.shm_id); // now sb1 and sb3 fit the same area
1584-
sb2 = BSE_SERVER.allocate_shared_block (1);
1585-
assert_return (sb2.mem_start);
1586-
assert_return (sb2.shm_id != sb3.shm_id); // but nothing else
1587-
assert_return (BSE_SERVER.get_shared_memory (sb2.shm_id).shm_id == sb2.shm_id); // is shared?
1588-
assert_return (BSE_SERVER.get_shared_memory (sb3.shm_id).shm_id == sb3.shm_id); // is shared?
1584+
if (0) // this triggers the 50% warning
1585+
{
1586+
sb2 = BSE_SERVER.allocate_shared_block (1);
1587+
assert_return (sb2.mem_start);
1588+
BSE_SERVER.release_shared_block (sb2);
1589+
}
1590+
// assert_return (sb2.shm_id != sb3.shm_id); // but nothing else
1591+
// assert_return (BSE_SERVER.get_shared_memory (sb2.shm_id).shm_id == sb2.shm_id); // is shared?
1592+
// assert_return (BSE_SERVER.get_shared_memory (sb3.shm_id).shm_id == sb3.shm_id); // is shared?
15891593
BSE_SERVER.release_shared_block (sb3);
1590-
BSE_SERVER.release_shared_block (sb2);
15911594
BSE_SERVER.release_shared_block (sb1);
1595+
sb2 = BSE_SERVER.allocate_shared_block (4 * block); // 50% of maximum
1596+
assert_return (sb2.mem_start);
1597+
BSE_SERVER.release_shared_block (sb2);
15921598
}
15931599

15941600
} // Anon

bse/bseserver.hh

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,8 @@ public:
107107
virtual void wave_file (const String& val) override;
108108
virtual bool engine_active () override;
109109
virtual ObjectIfaceP from_proxy (int64_t proxyid) override;
110-
virtual SharedMemory get_shared_memory (int64 id) override;
111-
virtual void broadcast_shm_fragments (int64 shm_id, const ShmFragmentSeq &plan,
112-
int interval_ms) override;
110+
virtual SharedMemory get_shared_memory () override;
111+
virtual void broadcast_shm_fragments (const ShmFragmentSeq &plan, int interval_ms) override;
113112
virtual String get_mp3_version () override;
114113
virtual String get_vorbis_version () override;
115114
virtual String get_ladspa_path () override;

0 commit comments

Comments
 (0)