Skip to content

Commit

Permalink
ALSA: fireworks/firewire-lib: Add a quirk of data blocks for MIDI in …
Browse files Browse the repository at this point in the history
…out-stream

Fireworks has a quirk to ignore MIDI messages in data blocks more than 8.
This commit adds a flag for this quirk and codes to skip 8 or more data
blocks to transfer MIDI messages.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
Takashi Sakamoto authored and Takashi Iwai committed May 26, 2014
1 parent a63d3ff commit 53111cd
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 1 deletion.
5 changes: 4 additions & 1 deletion sound/firewire/amdtp.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ int amdtp_stream_init(struct amdtp_stream *s, struct fw_unit *unit,
s->callbacked = false;
s->sync_slave = NULL;

s->rx_blocks_for_midi = UINT_MAX;

return 0;
}
EXPORT_SYMBOL(amdtp_stream_init);
Expand Down Expand Up @@ -472,7 +474,8 @@ static void amdtp_fill_midi(struct amdtp_stream *s,
b = (u8 *)&buffer[s->midi_position];

port = (s->data_block_counter + f) % 8;
if ((s->midi[port] == NULL) ||
if ((f >= s->rx_blocks_for_midi) ||
(s->midi[port] == NULL) ||
(snd_rawmidi_transmit(s->midi[port], b + 1, 1) <= 0))
b[0] = 0x80;
else
Expand Down
3 changes: 3 additions & 0 deletions sound/firewire/amdtp.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,9 @@ struct amdtp_stream {
/* quirk: fixed interval of dbc between previos/current packets. */
unsigned int tx_dbc_interval;

/* quirk: the first count of data blocks in an rx packet for MIDI */
unsigned int rx_blocks_for_midi;

bool callbacked;
wait_queue_head_t callback_wait;
struct amdtp_stream *sync_slave;
Expand Down
5 changes: 5 additions & 0 deletions sound/firewire/fireworks/fireworks_stream.c
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,11 @@ int snd_efw_stream_init_duplex(struct snd_efw *efw)
destroy_stream(efw, &efw->tx_stream);
goto end;
}
/*
* Fireworks ignores MIDI messages in more than first 8 data
* blocks of an received AMDTP packet.
*/
efw->rx_stream.rx_blocks_for_midi = 8;

/* set IEC61883 compliant mode (actually not fully compliant...) */
err = snd_efw_command_set_tx_mode(efw, SND_EFW_TRANSPORT_MODE_IEC61883);
Expand Down

0 comments on commit 53111cd

Please sign in to comment.