mirror of
https://github.com/alsa-project/alsa-utils
synced 2024-10-06 04:27:59 +02:00
Compare commits
5 commits
1205dd5f6c
...
68491dd464
Author | SHA1 | Date | |
---|---|---|---|
|
68491dd464 | ||
|
330741d523 | ||
|
2ee6c170a8 | ||
|
e609d66807 | ||
|
16533f81de |
3 changed files with 131 additions and 12 deletions
|
@ -215,10 +215,6 @@ static void print_port(snd_seq_t *seq ATTRIBUTE_UNUSED,
|
|||
break;
|
||||
}
|
||||
#endif
|
||||
#ifdef HANDLE_SHOW_ALL
|
||||
if (snd_seq_port_info_get_capability(pinfo) & SND_SEQ_PORT_CAP_INACTIVE)
|
||||
printf(",INACTIVE");
|
||||
#endif
|
||||
#ifdef HAVE_SEQ_CLIENT_INFO_GET_CARD
|
||||
card = snd_seq_client_info_get_card(cinfo);
|
||||
#endif
|
||||
|
@ -232,9 +228,14 @@ static void print_port(snd_seq_t *seq ATTRIBUTE_UNUSED,
|
|||
printf(",pid=%d", pid);
|
||||
printf("]\n");
|
||||
}
|
||||
printf(" %3d '%-16s'\n",
|
||||
printf(" %3d '%-16s'",
|
||||
snd_seq_port_info_get_port(pinfo),
|
||||
snd_seq_port_info_get_name(pinfo));
|
||||
#ifdef HANDLE_SHOW_ALL
|
||||
if (snd_seq_port_info_get_capability(pinfo) & SND_SEQ_PORT_CAP_INACTIVE)
|
||||
printf(" [INACTIVE]");
|
||||
#endif
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
static void print_port_and_subs(snd_seq_t *seq, snd_seq_client_info_t *cinfo,
|
||||
|
|
|
@ -288,6 +288,117 @@ static void send_ump(const uint32_t *ump, int len)
|
|||
snd_seq_ump_event_output(seq, &ev);
|
||||
}
|
||||
|
||||
struct flexdata_text_prefix {
|
||||
unsigned char status_bank;
|
||||
unsigned char status;
|
||||
const char *prefix;
|
||||
};
|
||||
|
||||
static struct flexdata_text_prefix text_prefix[] = {
|
||||
{ .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA,
|
||||
.status = SND_UMP_FLEX_DATA_MSG_STATUS_PROJECT_NAME,
|
||||
.prefix = "Project" },
|
||||
{ .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA,
|
||||
.status = SND_UMP_FLEX_DATA_MSG_STATUS_SONG_NAME,
|
||||
.prefix = "Song" },
|
||||
{ .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA,
|
||||
.status = SND_UMP_FLEX_DATA_MSG_STATUS_MIDI_CLIP_NAME,
|
||||
.prefix = "MIDI Clip" },
|
||||
{ .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA,
|
||||
.status = SND_UMP_FLEX_DATA_MSG_STATUS_COPYRIGHT_NOTICE,
|
||||
.prefix = "Copyright" },
|
||||
{ .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA,
|
||||
.status = SND_UMP_FLEX_DATA_MSG_STATUS_COMPOSER_NAME,
|
||||
.prefix = "Composer" },
|
||||
{ .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA,
|
||||
.status = SND_UMP_FLEX_DATA_MSG_STATUS_LYRICIST_NAME,
|
||||
.prefix = "Lyricist" },
|
||||
{ .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA,
|
||||
.status = SND_UMP_FLEX_DATA_MSG_STATUS_ARRANGER_NAME,
|
||||
.prefix = "Arranger" },
|
||||
{ .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA,
|
||||
.status = SND_UMP_FLEX_DATA_MSG_STATUS_PUBLISHER_NAME,
|
||||
.prefix = "Publisher" },
|
||||
{ .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA,
|
||||
.status = SND_UMP_FLEX_DATA_MSG_STATUS_PRIMARY_PERFORMER,
|
||||
.prefix = "Performer" },
|
||||
{ .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA,
|
||||
.status = SND_UMP_FLEX_DATA_MSG_STATUS_ACCOMPANY_PERFORMAER,
|
||||
.prefix = "Accompany Performer" },
|
||||
{ .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA,
|
||||
.status = SND_UMP_FLEX_DATA_MSG_STATUS_RECORDING_DATE,
|
||||
.prefix = "Recording Date" },
|
||||
{ .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA,
|
||||
.status = SND_UMP_FLEX_DATA_MSG_STATUS_RECORDING_LOCATION,
|
||||
.prefix = "Recording Location" },
|
||||
{ .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_PERF_TEXT,
|
||||
.status = SND_UMP_FLEX_DATA_MSG_STATUS_LYRICS,
|
||||
.prefix = "Lyrics" },
|
||||
{ .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_PERF_TEXT,
|
||||
.status = SND_UMP_FLEX_DATA_MSG_STATUS_LYRICS_LANGUAGE,
|
||||
.prefix = "Lyrics Language" },
|
||||
{ .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_PERF_TEXT,
|
||||
.status = SND_UMP_FLEX_DATA_MSG_STATUS_RUBY,
|
||||
.prefix = "Ruby" },
|
||||
{ .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_PERF_TEXT,
|
||||
.status = SND_UMP_FLEX_DATA_MSG_STATUS_RUBY_LANGUAGE,
|
||||
.prefix = "Ruby Language" },
|
||||
{}
|
||||
};
|
||||
|
||||
static void show_text(const uint32_t *ump)
|
||||
{
|
||||
static unsigned char textbuf[256];
|
||||
static int len;
|
||||
const snd_ump_msg_flex_data_t *fh =
|
||||
(const snd_ump_msg_flex_data_t *)ump;
|
||||
const char *prefix;
|
||||
int i;
|
||||
|
||||
if (fh->meta.format == SND_UMP_FLEX_DATA_MSG_FORMAT_SINGLE ||
|
||||
fh->meta.format == SND_UMP_FLEX_DATA_MSG_FORMAT_START)
|
||||
len = 0;
|
||||
|
||||
for (i = 0; i < 12 && len < (int)sizeof(textbuf); i++) {
|
||||
textbuf[len] = fh->meta.data[i / 4] >> ((3 - (i % 4)) * 8);
|
||||
if (!textbuf[len])
|
||||
break;
|
||||
switch (textbuf[len]) {
|
||||
case 0x0a: /* end of paragraph */
|
||||
case 0x0d: /* end of line */
|
||||
textbuf[len] = '\n';
|
||||
break;
|
||||
}
|
||||
len++;
|
||||
}
|
||||
|
||||
if (fh->meta.format != SND_UMP_FLEX_DATA_MSG_FORMAT_SINGLE &&
|
||||
fh->meta.format != SND_UMP_FLEX_DATA_MSG_FORMAT_END)
|
||||
return;
|
||||
|
||||
if (len >= (int)sizeof(textbuf))
|
||||
len = sizeof(textbuf) - 1;
|
||||
textbuf[len] = 0;
|
||||
|
||||
prefix = NULL;
|
||||
for (i = 0; text_prefix[i].status_bank; i++) {
|
||||
if (text_prefix[i].status_bank == fh->meta.status_bank &&
|
||||
text_prefix[i].status == fh->meta.status) {
|
||||
prefix = text_prefix[i].prefix;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (prefix) {
|
||||
printf("%s: %s\n", prefix, textbuf);
|
||||
} else {
|
||||
printf("(%d:%d): %s\n", fh->meta.status_bank, fh->meta.status,
|
||||
textbuf);
|
||||
}
|
||||
|
||||
len = 0;
|
||||
}
|
||||
|
||||
/* play the given MIDI Clip File content */
|
||||
static void play_midi(FILE *file)
|
||||
{
|
||||
|
@ -318,6 +429,12 @@ static void play_midi(FILE *file)
|
|||
set_tempo(fh->set_tempo.tempo);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (fh->meta.status_bank == SND_UMP_FLEX_DATA_MSG_BANK_METADATA ||
|
||||
fh->meta.status_bank == SND_UMP_FLEX_DATA_MSG_BANK_PERF_TEXT) {
|
||||
show_text(ump);
|
||||
continue;
|
||||
}
|
||||
} else if (h->type == SND_UMP_MSG_TYPE_STREAM) {
|
||||
const snd_ump_msg_stream_t *sh =
|
||||
(const snd_ump_msg_stream_t *)ump;
|
||||
|
|
|
@ -124,7 +124,7 @@ static void create_ump_client(void)
|
|||
|
||||
sprintf(blkname, "Group %d", i + 1);
|
||||
snd_ump_block_info_set_name(blk, blkname);
|
||||
snd_ump_block_info_set_direction(blk, SND_UMP_DIR_INPUT);
|
||||
snd_ump_block_info_set_direction(blk, SND_UMP_DIR_OUTPUT);
|
||||
snd_ump_block_info_set_first_group(blk, i);
|
||||
snd_ump_block_info_set_num_groups(blk, 1);
|
||||
snd_ump_block_info_set_ui_hint(blk, SND_UMP_BLOCK_UI_HINT_RECEIVER);
|
||||
|
@ -321,8 +321,6 @@ static void delta_time(FILE *file, const snd_seq_ump_event_t *ev)
|
|||
|
||||
if (diff <= 0)
|
||||
return;
|
||||
if (tempo_base == 1000)
|
||||
diff *= 100;
|
||||
write_dcs(file, diff);
|
||||
last_tick = ev->time.tick;
|
||||
}
|
||||
|
@ -355,6 +353,13 @@ static void write_file_header(FILE *file)
|
|||
/* write start bar */
|
||||
static void start_bar(FILE *file)
|
||||
{
|
||||
int err;
|
||||
|
||||
/* start the queue */
|
||||
err = snd_seq_start_queue(seq, queue, NULL);
|
||||
check_snd("start queue", err);
|
||||
snd_seq_drain_output(seq);
|
||||
|
||||
write_start_clip(file);
|
||||
write_tempo(file);
|
||||
write_time_sig(file);
|
||||
|
@ -489,10 +494,6 @@ int main(int argc, char *argv[])
|
|||
start = 1;
|
||||
}
|
||||
|
||||
err = snd_seq_start_queue(seq, queue, NULL);
|
||||
check_snd("start queue", err);
|
||||
snd_seq_drain_output(seq);
|
||||
|
||||
err = snd_seq_nonblock(seq, 1);
|
||||
check_snd("set nonblock mode", err);
|
||||
|
||||
|
|
Loading…
Reference in a new issue