static int snd_rawmidi_virtual_input_params(snd_rawmidi_virtual_t *virt, snd_rawmidi_params_t *params) { int err; // snd_rawmidi_drain_input(substream); if (params->buffer_size < sizeof(snd_seq_event_t) || params->buffer_size > 1024L * 1024L) { return -EINVAL; } if (params->buffer_size != snd_seq_get_input_buffer_size(virt->handle)) { err = snd_seq_set_input_buffer_size(virt->handle, params->buffer_size); if (err < 0) return err; params->buffer_size = snd_seq_get_input_buffer_size(virt->handle); /* FIXME: input pool size? */ } return 0; }
void mastermidibus::init (int ppqn) { #ifdef SEQ64_HAVE_LIBASOUND snd_seq_client_info_t * cinfo; /* client info */ snd_seq_port_info_t * pinfo; /* port info */ snd_seq_client_info_alloca(&cinfo); snd_seq_client_info_set_client(cinfo, -1); if (rc().manual_alsa_ports()) { /* * Output busses */ int num_buses = SEQ64_ALSA_OUTPUT_BUSS_MAX; for (int i = 0; i < num_buses; ++i) { if (not_nullptr(m_buses_out[i])) { delete m_buses_out[i]; errprintf("mmbus::init() manual: m_buses_out[%d] not null\n", i); } m_buses_out[i] = new midibus ( snd_seq_client_id(m_alsa_seq), m_alsa_seq, i+1, m_queue ); m_buses_out[i]->init_out_sub(); m_buses_out_active[i] = m_buses_out_init[i] = true; } m_num_out_buses = num_buses; if (not_nullptr(m_buses_in[0])) { delete m_buses_in[0]; errprint("mmbus::init() manual: m_buses_[0] not null"); } /* * Input buss. Only the first element is set up. The rest are used * only for non-manual ALSA ports in the else-class below. */ m_num_in_buses = 1; m_buses_in[0] = new midibus ( snd_seq_client_id(m_alsa_seq), m_alsa_seq, m_num_in_buses, m_queue ); m_buses_in[0]->init_in_sub(); m_buses_in_active[0] = m_buses_in_init[0] = true; } else { /* * While the next client for the sequencer is available, get the client * from cinfo. Fill pinfo. */ while (snd_seq_query_next_client(m_alsa_seq, cinfo) >= 0) { int client = snd_seq_client_info_get_client(cinfo); snd_seq_port_info_alloca(&pinfo); /* will fill pinfo */ snd_seq_port_info_set_client(pinfo, client); snd_seq_port_info_set_port(pinfo, -1); while (snd_seq_query_next_port(m_alsa_seq, pinfo) >= 0) { /* * While the next port is available, get its capability. */ int cap = snd_seq_port_info_get_capability(pinfo); if ( ALSA_CLIENT_CHECK(pinfo) && snd_seq_port_info_get_client(pinfo) != SND_SEQ_CLIENT_SYSTEM ) { /* * Output busses: * * Why are we doing the ALSA client check again here? * Because it could be altered in the if-clause above. */ if (CAP_WRITE(cap) && ALSA_CLIENT_CHECK(pinfo)) { if (not_nullptr(m_buses_out[m_num_out_buses])) { delete m_buses_out[m_num_out_buses]; errprintf ( "mmbus::init(): m_buses_out[%d] not null\n", m_num_out_buses ); } m_buses_out[m_num_out_buses] = new midibus ( snd_seq_client_id(m_alsa_seq), snd_seq_port_info_get_client(pinfo), snd_seq_port_info_get_port(pinfo), m_alsa_seq, snd_seq_client_info_get_name(cinfo), snd_seq_port_info_get_name(pinfo), m_num_out_buses, m_queue ); if (m_buses_out[m_num_out_buses]->init_out()) { m_buses_out_active[m_num_out_buses] = true; m_buses_out_init[m_num_out_buses] = true; } else m_buses_out_init[m_num_out_buses] = true; ++m_num_out_buses; } /* * Input busses */ if (CAP_READ(cap) && ALSA_CLIENT_CHECK(pinfo)) /* inputs */ { if (not_nullptr(m_buses_in[m_num_in_buses])) { delete m_buses_in[m_num_in_buses]; errprintf ( "mmbus::init(): m_buses_in[%d] not null\n", m_num_in_buses ); } m_buses_in[m_num_in_buses] = new midibus ( snd_seq_client_id(m_alsa_seq), snd_seq_port_info_get_client(pinfo), snd_seq_port_info_get_port(pinfo), m_alsa_seq, snd_seq_client_info_get_name(cinfo), snd_seq_port_info_get_name(pinfo), m_num_in_buses, m_queue ); m_buses_in_active[m_num_in_buses] = m_buses_in_init[m_num_in_buses] = true; ++m_num_in_buses; } } } } /* end loop for clients */ } set_beats_per_minute(m_beats_per_minute); set_ppqn(ppqn); /* * Get the number of MIDI input poll file descriptors. Allocate the * poll-descriptors array. Then get the input poll-descriptors into the * array */ m_num_poll_descriptors = snd_seq_poll_descriptors_count(m_alsa_seq, POLLIN); m_poll_descriptors = new pollfd[m_num_poll_descriptors]; snd_seq_poll_descriptors ( m_alsa_seq, m_poll_descriptors, m_num_poll_descriptors, POLLIN ); set_sequence_input(false, nullptr); /* Set the input and output buffer sizes */ snd_seq_set_output_buffer_size(m_alsa_seq, c_midibus_output_size); snd_seq_set_input_buffer_size(m_alsa_seq, c_midibus_input_size); m_bus_announce = new midibus ( snd_seq_client_id(m_alsa_seq), SND_SEQ_CLIENT_SYSTEM, SND_SEQ_PORT_SYSTEM_ANNOUNCE, m_alsa_seq, "system", "announce", // was "annouce" ca 2016-04-03 0, m_queue ); m_bus_announce->set_input(true); for (int i = 0; i < m_num_out_buses; ++i) set_clock(i, m_init_clock[i]); for (int i = 0; i < m_num_in_buses; ++i) set_input(i, m_init_input[i]); #endif // SEQ64_HAVE_LIBASOUND }
void mastermidibus::init( ) { /* client info */ snd_seq_client_info_t *cinfo; /* port info */ snd_seq_port_info_t *pinfo; int client; snd_seq_client_info_alloca(&cinfo); snd_seq_client_info_set_client(cinfo, -1); //printf( "global_ports %d\n", global_manual_alsa_ports ); if ( global_manual_alsa_ports ) { int num_buses = 16; for( int i=0; i<num_buses; ++i ) { m_buses_out[i] = new midibus( snd_seq_client_id( m_alsa_seq ), m_alsa_seq, i+1, m_queue ); m_buses_out[i]->init_out_sub(); m_buses_out_active[i] = true; m_buses_out_init[i] = true; } m_num_out_buses = num_buses; /* only one in */ m_buses_in[0] = new midibus( snd_seq_client_id( m_alsa_seq ), m_alsa_seq, m_num_in_buses, m_queue); m_buses_in[0]->init_in_sub(); m_buses_in_active[0] = true; m_buses_in_init[0] = true; m_num_in_buses = 1; } else { /* while the next client one the sequencer is avaiable */ while (snd_seq_query_next_client(m_alsa_seq, cinfo) >= 0){ /* get client from cinfo */ client = snd_seq_client_info_get_client(cinfo); /* fill pinfo */ snd_seq_port_info_alloca(&pinfo); snd_seq_port_info_set_client(pinfo, client); snd_seq_port_info_set_port(pinfo, -1); /* while the next port is avail */ while (snd_seq_query_next_port(m_alsa_seq, pinfo) >= 0 ){ /* get its capability */ int cap = snd_seq_port_info_get_capability(pinfo); if ( snd_seq_client_id( m_alsa_seq ) != snd_seq_port_info_get_client(pinfo) && snd_seq_port_info_get_client(pinfo) != SND_SEQ_CLIENT_SYSTEM){ /* the outs */ if ( (cap & SND_SEQ_PORT_CAP_SUBS_WRITE) != 0 && snd_seq_client_id( m_alsa_seq ) != snd_seq_port_info_get_client(pinfo)){ m_buses_out[m_num_out_buses] = new midibus( snd_seq_client_id( m_alsa_seq ), snd_seq_port_info_get_client(pinfo), snd_seq_port_info_get_port(pinfo), m_alsa_seq, snd_seq_client_info_get_name(cinfo), snd_seq_port_info_get_name(pinfo), m_num_out_buses, m_queue ); if ( m_buses_out[m_num_out_buses]->init_out() ){ m_buses_out_active[m_num_out_buses] = true; m_buses_out_init[m_num_out_buses] = true; } else { m_buses_out_init[m_num_out_buses] = true; } m_num_out_buses++; } /* the ins */ if ( (cap & SND_SEQ_PORT_CAP_SUBS_READ) != 0 && snd_seq_client_id( m_alsa_seq ) != snd_seq_port_info_get_client(pinfo)){ m_buses_in[m_num_in_buses] = new midibus( snd_seq_client_id( m_alsa_seq ), snd_seq_port_info_get_client(pinfo), snd_seq_port_info_get_port(pinfo), m_alsa_seq, snd_seq_client_info_get_name(cinfo), snd_seq_port_info_get_name(pinfo), m_num_in_buses, m_queue); //if ( m_buses_in[m_num_in_buses]->init_in() ){ m_buses_in_active[m_num_in_buses] = true; m_buses_in_init[m_num_in_buses] = true; //} else { //m_buses_in_init[m_num_in_buses] = true; //} m_num_in_buses++; } } } } /* end loop for clients */ } set_bpm( c_bpm ); set_ppqn( c_ppqn ); /* midi input */ /* poll descriptors */ /* get number of file descriptors */ m_num_poll_descriptors = snd_seq_poll_descriptors_count(m_alsa_seq, POLLIN); /* allocate into */ m_poll_descriptors = new pollfd[m_num_poll_descriptors]; /* get descriptors */ snd_seq_poll_descriptors(m_alsa_seq, m_poll_descriptors, m_num_poll_descriptors, POLLIN); set_sequence_input( false, NULL ); /* sizes */ snd_seq_set_output_buffer_size(m_alsa_seq, c_midibus_output_size ); snd_seq_set_input_buffer_size(m_alsa_seq, c_midibus_input_size ); m_bus_announce = new midibus( snd_seq_client_id( m_alsa_seq ), SND_SEQ_CLIENT_SYSTEM, SND_SEQ_PORT_SYSTEM_ANNOUNCE, m_alsa_seq, "system","annouce", 0, m_queue); m_bus_announce->set_input(true); for ( int i=0; i<m_num_out_buses; i++ ) set_clock(i,m_init_clock[i]); for ( int i=0; i<m_num_in_buses; i++ ) set_input(i,m_init_input[i]); }
void mastermidibus::init() { #ifdef HAVE_LIBASOUND snd_seq_client_info_t * cinfo; /* client info */ snd_seq_port_info_t * pinfo; /* port info */ snd_seq_client_info_alloca(&cinfo); snd_seq_client_info_set_client(cinfo, -1); if (global_manual_alsa_ports) { int num_buses = 16; for (int i = 0; i < num_buses; ++i) { m_buses_out[i] = new midibus ( snd_seq_client_id(m_alsa_seq), m_alsa_seq, i+1, m_queue ); m_buses_out[i]->init_out_sub(); m_buses_out_active[i] = true; m_buses_out_init[i] = true; } m_num_out_buses = num_buses; m_num_in_buses = 1; /* only one in, or 0? */ m_buses_in[0] = new midibus ( snd_seq_client_id(m_alsa_seq), m_alsa_seq, m_num_in_buses, m_queue ); m_buses_in[0]->init_in_sub(); m_buses_in_active[0] = true; m_buses_in_init[0] = true; } else { /* While the next client for the sequencer is available */ while (snd_seq_query_next_client(m_alsa_seq, cinfo) >= 0) { int client = snd_seq_client_info_get_client(cinfo); snd_seq_port_info_alloca(&pinfo); /* will fill pinfo */ snd_seq_port_info_set_client(pinfo, client); snd_seq_port_info_set_port(pinfo, -1); while (snd_seq_query_next_port(m_alsa_seq, pinfo) >= 0) { /* While the next port is available, get its capability */ int cap = snd_seq_port_info_get_capability(pinfo); if ( snd_seq_client_id(m_alsa_seq) != snd_seq_port_info_get_client(pinfo) && snd_seq_port_info_get_client(pinfo) != SND_SEQ_CLIENT_SYSTEM ) { if /* the outputs */ ( (cap & SND_SEQ_PORT_CAP_SUBS_WRITE) != 0 && snd_seq_client_id(m_alsa_seq) != snd_seq_port_info_get_client(pinfo) ) { m_buses_out[m_num_out_buses] = new midibus ( snd_seq_client_id(m_alsa_seq), snd_seq_port_info_get_client(pinfo), snd_seq_port_info_get_port(pinfo), m_alsa_seq, snd_seq_client_info_get_name(cinfo), snd_seq_port_info_get_name(pinfo), m_num_out_buses, m_queue ); if (m_buses_out[m_num_out_buses]->init_out()) { m_buses_out_active[m_num_out_buses] = true; m_buses_out_init[m_num_out_buses] = true; } else m_buses_out_init[m_num_out_buses] = true; m_num_out_buses++; } if /* the inputs */ ( (cap & SND_SEQ_PORT_CAP_SUBS_READ) != 0 && snd_seq_client_id(m_alsa_seq) != snd_seq_port_info_get_client(pinfo) ) { m_buses_in[m_num_in_buses] = new midibus ( snd_seq_client_id(m_alsa_seq), snd_seq_port_info_get_client(pinfo), snd_seq_port_info_get_port(pinfo), m_alsa_seq, snd_seq_client_info_get_name(cinfo), snd_seq_port_info_get_name(pinfo), m_num_in_buses, m_queue ); m_buses_in_active[m_num_in_buses] = true; m_buses_in_init[m_num_in_buses] = true; m_num_in_buses++; } } } } /* end loop for clients */ } set_bpm(c_bpm); set_ppqn(c_ppqn); /* * Get the number of MIDI input poll file descriptors. */ m_num_poll_descriptors = snd_seq_poll_descriptors_count(m_alsa_seq, POLLIN); m_poll_descriptors = new pollfd[m_num_poll_descriptors]; /* allocate into */ snd_seq_poll_descriptors /* get input poll descriptors */ ( m_alsa_seq, m_poll_descriptors, m_num_poll_descriptors, POLLIN ); set_sequence_input(false, nullptr); /* Set the input and output buffer sizes */ snd_seq_set_output_buffer_size(m_alsa_seq, c_midibus_output_size); snd_seq_set_input_buffer_size(m_alsa_seq, c_midibus_input_size); m_bus_announce = new midibus ( snd_seq_client_id(m_alsa_seq), SND_SEQ_CLIENT_SYSTEM, SND_SEQ_PORT_SYSTEM_ANNOUNCE, m_alsa_seq, "system", "annouce", 0, m_queue ); m_bus_announce->set_input(true); for (int i = 0; i < m_num_out_buses; i++) set_clock(i, m_init_clock[i]); for (int i = 0; i < m_num_in_buses; i++) set_input(i, m_init_input[i]); #endif // HAVE_LIBASOUND }