Commit b47f525f authored by Takashi Sakamoto's avatar Takashi Sakamoto Committed by Takashi Iwai

ALSA: firewire-digi00x: add support of asynchronous transaction for outgoing...

ALSA: firewire-digi00x: add support of asynchronous transaction for outgoing MIDI messages to physical controls

In previous commit, asynchronous transaction for incoming MIDI messages
from physical controls is supported. The physical controls may be
controlled by receiving MIDI messages at a certain address.

This commit supports asynchronous transaction for this purpose.
Signed-off-by: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 3646a54a
...@@ -9,6 +9,18 @@ ...@@ -9,6 +9,18 @@
#include <sound/asound.h> #include <sound/asound.h>
#include "digi00x.h" #include "digi00x.h"
static int fill_midi_message(struct snd_rawmidi_substream *substream, u8 *buf)
{
int bytes;
buf[0] = 0x80;
bytes = snd_rawmidi_transmit_peek(substream, buf + 1, 2);
if (bytes >= 0)
buf[3] = 0xc0 | bytes;
return bytes;
}
static void handle_midi_control(struct snd_dg00x *dg00x, __be32 *buf, static void handle_midi_control(struct snd_dg00x *dg00x, __be32 *buf,
unsigned int length) unsigned int length)
{ {
...@@ -102,15 +114,24 @@ int snd_dg00x_transaction_register(struct snd_dg00x *dg00x) ...@@ -102,15 +114,24 @@ int snd_dg00x_transaction_register(struct snd_dg00x *dg00x)
return err; return err;
err = snd_dg00x_transaction_reregister(dg00x); err = snd_dg00x_transaction_reregister(dg00x);
if (err < 0) { if (err < 0)
goto error;
err = snd_fw_async_midi_port_init(&dg00x->out_control, dg00x->unit,
DG00X_ADDR_BASE + DG00X_OFFSET_MMC,
4, fill_midi_message);
if (err < 0)
goto error;
return err;
error:
fw_core_remove_address_handler(&dg00x->async_handler); fw_core_remove_address_handler(&dg00x->async_handler);
dg00x->async_handler.address_callback = NULL; dg00x->async_handler.address_callback = NULL;
}
return err; return err;
} }
void snd_dg00x_transaction_unregister(struct snd_dg00x *dg00x) void snd_dg00x_transaction_unregister(struct snd_dg00x *dg00x)
{ {
snd_fw_async_midi_port_destroy(&dg00x->out_control);
fw_core_remove_address_handler(&dg00x->async_handler); fw_core_remove_address_handler(&dg00x->async_handler);
} }
...@@ -56,6 +56,7 @@ struct snd_dg00x { ...@@ -56,6 +56,7 @@ struct snd_dg00x {
/* For asynchronous MIDI controls. */ /* For asynchronous MIDI controls. */
struct snd_rawmidi_substream *in_control; struct snd_rawmidi_substream *in_control;
struct snd_fw_async_midi_port out_control;
}; };
#define DG00X_ADDR_BASE 0xffffe0000000ull #define DG00X_ADDR_BASE 0xffffe0000000ull
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment