mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-11-02 09:01:48 -05:00
Takashi Iwai <iwai@ww.uni-erlangen.de>
Frank van de Pol <frank@vande-pol.demon.nl> Major sequencer changes and cleanups for 1.0.0.
This commit is contained in:
parent
7b0898c17d
commit
a3aaf0582a
8 changed files with 176 additions and 121 deletions
|
|
@ -31,7 +31,7 @@
|
|||
|
||||
#define SND_FILE_SEQ "/dev/snd/seq"
|
||||
#define SND_FILE_ALOADSEQ "/dev/aloadSEQ"
|
||||
#define SND_SEQ_VERSION_MAX SND_PROTOCOL_VERSION( 0, 0, 1 )
|
||||
#define SND_SEQ_VERSION_MAX SND_PROTOCOL_VERSION( 1, 0, 0 )
|
||||
#define SND_SEQ_OBUF_SIZE (16*1024) /* should be configurable */
|
||||
#define SND_SEQ_IBUF_SIZE (4*1024) /* should be configurable */
|
||||
|
||||
|
|
@ -721,7 +721,10 @@ static int remove_match(snd_seq_remove_events_t *info,
|
|||
return 0;
|
||||
}
|
||||
if (info->remove_mode & SND_SEQ_REMOVE_DEST_CHANNEL) {
|
||||
if (ev->dest.channel != info->dest.channel)
|
||||
if (! snd_seq_ev_is_channel_type(ev))
|
||||
return 0;
|
||||
/* data.note.channel and data.control.channel are identical */
|
||||
if (ev->data.note.channel != info->channel)
|
||||
return 0;
|
||||
}
|
||||
if (info->remove_mode & SND_SEQ_REMOVE_TIME_AFTER) {
|
||||
|
|
|
|||
|
|
@ -35,12 +35,12 @@ void snd_seq_ev_set_direct(snd_seq_event_t *ev)
|
|||
{
|
||||
ev->flags &= ~SND_SEQ_DEST_MASK;
|
||||
ev->flags |= SND_SEQ_DEST_DIRECT;
|
||||
ev->dest.queue = SND_SEQ_ADDRESS_UNKNOWN; /* XXX */
|
||||
ev->queue = SND_SEQ_ADDRESS_UNKNOWN; /* XXX */
|
||||
}
|
||||
|
||||
/* queued on tick */
|
||||
void snd_seq_ev_schedule_tick(snd_seq_event_t *ev, int q, int relative,
|
||||
unsigned long tick)
|
||||
snd_seq_tick_time_t tick)
|
||||
{
|
||||
ev->flags &= ~(SND_SEQ_DEST_MASK | SND_SEQ_TIME_STAMP_MASK |
|
||||
SND_SEQ_TIME_MODE_MASK);
|
||||
|
|
@ -85,11 +85,21 @@ void snd_seq_ev_set_variable(snd_seq_event_t *ev, int len, void *ptr)
|
|||
ev->data.ext.ptr = ptr;
|
||||
}
|
||||
|
||||
|
||||
/* use or unuse a queue */
|
||||
int snd_seq_use_queue(snd_seq_t *seq, int q, int use)
|
||||
{
|
||||
snd_seq_queue_client_t info;
|
||||
|
||||
memset(&info, 0, sizeof(info));
|
||||
info.used = use;
|
||||
return snd_seq_set_queue_client(seq, q, &info);
|
||||
}
|
||||
|
||||
|
||||
/* queue controls - start/stop/continue */
|
||||
/* if ev is NULL, send events immediately.
|
||||
otherwise, duplicate the given event data.
|
||||
destination is overwritten to Timer port (0:0)
|
||||
*/
|
||||
otherwise, duplicate the given event data. */
|
||||
int snd_seq_control_queue(snd_seq_t *seq, int q, int type, int value, snd_seq_event_t *ev)
|
||||
{
|
||||
snd_seq_event_t tmpev;
|
||||
|
|
@ -98,22 +108,35 @@ int snd_seq_control_queue(snd_seq_t *seq, int q, int type, int value, snd_seq_ev
|
|||
ev = &tmpev;
|
||||
snd_seq_ev_set_direct(ev);
|
||||
}
|
||||
|
||||
ev->type = type;
|
||||
snd_seq_ev_set_dest(ev, SND_SEQ_CLIENT_SYSTEM, SND_SEQ_PORT_SYSTEM_TIMER);
|
||||
#if 1
|
||||
/* new type */
|
||||
ev->data.queue.addr.queue = q;
|
||||
ev->data.queue.value = value;
|
||||
#else
|
||||
/* old type */
|
||||
ev->dest.queue = q;
|
||||
ev->data.control.value = value;
|
||||
#endif
|
||||
|
||||
snd_seq_ev_set_queue_control(ev, type, q, value);
|
||||
return snd_seq_event_output(seq, ev);
|
||||
}
|
||||
|
||||
/* reset queue position:
|
||||
* new values of both real-time and tick values must be given.
|
||||
*/
|
||||
int snd_seq_setpos_queue(snd_seq_t *seq, int q, snd_seq_timestamp_t *rtime, snd_seq_event_t *ev)
|
||||
{
|
||||
snd_seq_event_t tmpev;
|
||||
int result;
|
||||
|
||||
if (ev == NULL) {
|
||||
snd_seq_ev_clear(&tmpev);
|
||||
ev = &tmpev;
|
||||
snd_seq_ev_set_direct(ev);
|
||||
}
|
||||
/* stop the timer */
|
||||
result = snd_seq_stop_queue(seq, q, ev);
|
||||
/* reset queue position */
|
||||
snd_seq_ev_set_queue_pos_real(ev, q, &rtime->real);
|
||||
result = snd_seq_event_output(seq, ev);
|
||||
snd_seq_ev_set_queue_pos_tick(ev, q, rtime->tick);
|
||||
result = snd_seq_event_output(seq, ev);
|
||||
/* continue the timer */
|
||||
result = snd_seq_continue_queue(seq, q, ev);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* create a port - simple version
|
||||
* return the port number
|
||||
|
|
@ -295,7 +318,7 @@ int snd_seq_set_client_pool_input(snd_seq_t *seq, int size)
|
|||
|
||||
/*
|
||||
* reset client input/output pool
|
||||
* use REMOVE_EVENTS ioctl instead of RESET_POOL
|
||||
* use REMOVE_EVENTS ioctl
|
||||
*/
|
||||
int snd_seq_reset_pool_output(snd_seq_t *seq)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue