Skip to content

Commit

Permalink
Addresses issue #76 - provides configurable level for writeback check
Browse files Browse the repository at this point in the history
  • Loading branch information
ravelox committed May 16, 2020
1 parent 009e9ce commit 4ddf3b8
Show file tree
Hide file tree
Showing 9 changed files with 102 additions and 14 deletions.
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -224,4 +224,12 @@ alsa.input_buffer_size
alsa.writeback
If a MIDI command is received from an inbound ALSA device, this option controls whether that event is written to an ALSA output device if it has the same card number.
This is a yes/no option. Default is no.
alsa.writeback
If a MIDI command is received from an inbound ALSA device, this option controls whether that event is written to an ALSA output device if it has the same level number.
See also **alsa.writeback.level**.
This is a yes/no option. Default is no.
alsa.writeback.level
Indicates how granular to make the alsa.writeback check.
Possible values are **card** (hw:X,*,*) or **device** (hw:X,Y,*)
Default is card.
```
2 changes: 1 addition & 1 deletion raveloxmidi/configure.ac
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
m4_define([VERSION_NUMBER],[0.9.0-rc7])
m4_define([VERSION_NUMBER],[0.9.0-rc8])
m4_define([BUILD_NUMBER],m4_esyscmd_s(pkgscripts/build_number))
m4_define([FULL_VERSION], [VERSION_NUMBER.BUILD_NUMBER])
AC_INIT([raveloxmidi],[FULL_VERSION])
Expand Down
2 changes: 1 addition & 1 deletion raveloxmidi/include/net_distribute.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,6 @@

#include "midi_state.h"

void net_distribute_midi( midi_state_t *state, uint32_t originator_ssrc , int originator_card );
void net_distribute_midi( midi_state_t *state, uint32_t originator_ssrc , int originator_device_hash );

#endif
2 changes: 1 addition & 1 deletion raveloxmidi/include/net_socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ typedef struct raveloxmidi_socket_t {
size_t packet_size;
midi_state_t *state;
pthread_mutex_t lock;
int card_number;
int device_hash;
#ifdef HAVE_ALSA
snd_rawmidi_t *handle;
#endif
Expand Down
3 changes: 3 additions & 0 deletions raveloxmidi/include/raveloxmidi_alsa.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ void raveloxmidi_alsa_handle_destroy( void **rawmidi );
void raveloxmidi_alsa_teardown( void );

int raveloxmidi_alsa_card_number( snd_rawmidi_t *rawmidi );
int raveloxmidi_alsa_device_number( snd_rawmidi_t *rawmidi );
void raveloxmidi_alsa_dump_rawmidi( void *data );

int raveloxmidi_alsa_out_available( void );
Expand All @@ -44,6 +45,8 @@ void raveloxmidi_alsa_set_poll_fds( snd_rawmidi_t *handle );
int raveloxmidi_alsa_loop( void );
void raveloxmidi_wait_for_alsa( void );

int raveloxmidi_alsa_device_hash( snd_rawmidi_t *rawmidi );

#define RAVELOXMIDI_ALSA_INPUT -2
#define RAVELOXMIDI_ALSA_DEFAULT_BUFFER 4096
#define RAVELOXMIDI_ALSA_MAX_BUFFER 1048576
Expand Down
11 changes: 10 additions & 1 deletion raveloxmidi/man/raveloxmidi.1.in
Original file line number Diff line number Diff line change
Expand Up @@ -202,9 +202,18 @@ Size of the buffer to use for reading data from the input device.
Default is 4096. Maximum is 65535.
.TP
.B alsa.writeback
If a MIDI command is received from an inbound ALSA device, this option controls whether that event is written to an ALSA output device if it has the same card number.
If a MIDI command is received from an inbound ALSA device, this option controls whether that event is written to an ALSA output device if it has the same level number.
.br
See also \fBalsa.writeback.level\fP.
.br
This is a yes/no option. Default is no.
.TP
.B alsa.writeback.level
Indicates how granular to make the alsa.writeback check.
.br
Possible values are \fBcard\fP (hw:X,*,*) or \fBdevice\fP (hw:X,Y,*)
.br
Default is card.
.fi
.SH AUTHOR
.B raveloxmidi
Expand Down
4 changes: 2 additions & 2 deletions raveloxmidi/src/net_socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ static raveloxmidi_socket_t *net_socket_create_item( void )
new_socket->fd = 0;
new_socket->packet = NULL;
new_socket->type = RAVELOXMIDI_SOCKET_FD_TYPE;
new_socket->card_number = -1;
new_socket->device_hash = -1;

#ifdef HAVE_ALSA
alsa_buffer_size = config_int_get("alsa.input_buffer_size");
Expand Down Expand Up @@ -530,7 +530,7 @@ int net_socket_read( int fd )
*/
{
midi_state_dump( found_socket->state );
net_distribute_midi( found_socket->state , 0, found_socket->card_number );
net_distribute_midi( found_socket->state , 0, found_socket->device_hash );
} else {
/*
RTP MIDI inbound from remote socket
Expand Down
83 changes: 75 additions & 8 deletions raveloxmidi/src/raveloxmidi_alsa.c
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,23 @@ int raveloxmidi_alsa_card_number( snd_rawmidi_t *rawmidi )
return card_number;
}

int raveloxmidi_alsa_device_number( snd_rawmidi_t *rawmidi )
{
int device_number = -1;

if( rawmidi )
{
snd_rawmidi_info_t *info = NULL;

snd_rawmidi_info_malloc( &info );
snd_rawmidi_info( rawmidi, info );
device_number = snd_rawmidi_info_get_device( info );
snd_rawmidi_info_free( info );
}

return device_number;
}

void raveloxmidi_alsa_dump_rawmidi( void *data )
{
snd_rawmidi_t *rawmidi = NULL;
Expand Down Expand Up @@ -324,7 +341,7 @@ int raveloxmidi_alsa_in_available( void )
return ( count > unused );
}

int raveloxmidi_alsa_write( unsigned char *buffer, size_t buffer_size, int originator_card )
int raveloxmidi_alsa_write( unsigned char *buffer, size_t buffer_size, int originator_device_hash )
{
int i = 0;
size_t num_outputs = 0;
Expand All @@ -339,21 +356,21 @@ int raveloxmidi_alsa_write( unsigned char *buffer, size_t buffer_size, int origi
handle = (snd_rawmidi_t *)data_table_item_get( outputs, i );
if( handle )
{
int card_number = -1;
int device_hash = -1;
int writeback = 0;

card_number = raveloxmidi_alsa_card_number( handle );
device_hash = raveloxmidi_alsa_device_hash( handle );

// Only write out if this is not the same card that provided the data
writeback = is_yes( config_string_get("alsa.writeback") );

if( ( originator_card != card_number ) || ( writeback == 1 ) )
if( ( originator_device_hash != device_hash ) || ( writeback == 1 ) || ( device_hash < 0 ) )
{
bytes_written = snd_rawmidi_write( handle, buffer, buffer_size );
logging_printf(LOGGING_DEBUG,"raveloxmidi_alsa_write: handle index=%d originator=%u card=%u bytes_written=%u\n",
i, originator_card, card_number, bytes_written );
logging_printf(LOGGING_DEBUG,"raveloxmidi_alsa_write: handle index=%d originator_device_hash=%d device_hash=%d bytes_written=%u\n",
i, originator_device_hash, device_hash, bytes_written );
} else {
logging_printf( LOGGING_DEBUG,"raveloxmidi_alsa_write: not writing to the same card\n");
logging_printf( LOGGING_DEBUG, "raveloxmidi_alsa_write: Not writing to device_hash=%d\n", device_hash);
}
}
}
Expand Down Expand Up @@ -462,7 +479,7 @@ static void raveloxmidi_alsa_add_poll_fd( snd_rawmidi_t *handle, int fd )
{
socket->type = RAVELOXMIDI_SOCKET_ALSA_TYPE;
socket->handle = handle;
socket->card_number = raveloxmidi_alsa_card_number( handle );
socket->device_hash = ( socket->handle ? raveloxmidi_alsa_device_hash( handle ) : -1 );
}
add_poll_end:
poll_descriptors_unlock();
Expand Down Expand Up @@ -572,4 +589,54 @@ void raveloxmidi_wait_for_alsa(void)
logging_printf( LOGGING_DEBUG, "raveloxmidi_wait_for_alsa: %s\n", strerror(errno) );
}
}

/* Pseudo hash for ALSA device - used to prevent writeback */
int raveloxmidi_alsa_device_hash( snd_rawmidi_t *handle )
{
const char *wb_level_string = NULL;
int card_multiplier = 0;
int device_multiplier = 0;
int return_hash = -1;

int card_number = -1;
int device_number = -1;

if( !handle ) return return_hash;

card_number = raveloxmidi_alsa_card_number( handle );
device_number = raveloxmidi_alsa_device_number( handle );

if( ( card_number < 0 ) || ( device_number < 0 ) )
{
logging_printf( LOGGING_WARN, "raveloxmidi_alsa_device_hash: card_number=%d,device_number=%d\n", card_number, device_number );
return return_hash;
}

wb_level_string = config_string_get("alsa.writeback.level");

if( ! wb_level_string )
{
card_multiplier = 4096;
device_multiplier = 1;
} else {
if( strncasecmp( wb_level_string, "card", 4 ) == 0 )
{
card_multiplier = 1;
device_multiplier = 0;
}

if( strncasecmp( wb_level_string, "device", 6 ) == 0 )
{
card_multiplier = 4096;
device_multiplier = 1;
}
}

return_hash = ( card_number * card_multiplier ) + ( device_number * device_multiplier );

logging_printf( LOGGING_DEBUG, "raveloxmidi_alsa_device_hash: card_number=%d,device_number=%d,hash=%d\n", card_number, device_number , return_hash);

return return_hash;
}

#endif
1 change: 1 addition & 0 deletions raveloxmidi/src/raveloxmidi_config.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ static void config_set_defaults( void )
#ifdef HAVE_ALSA
config_add_item("alsa.input_buffer_size", "4096" );
config_add_item("alsa.writeback", "no");
config_add_item("alsa.writeback.level", "card");
#endif

}
Expand Down

0 comments on commit 4ddf3b8

Please sign in to comment.