[RÉSOLU] Audio Kontrol 1 en usb2 ça marche !! [PATCH]
Bonsoir !
j'ai acheté il y a quelques temps une Audio Kontrol1 de chez Native instrument. Jusque là ça marchouillait. En fait j'avais de gros problèmes avec certains logiciels qui utilisent le midi, mais pas tous. Exemple : Rosegarden, puredata qui faisaient systématiquement planter jack, et obligation de redémarrer le systeme... un peu relou comme situation.
J'ai trouvé quelqu'un avec le meme soucis que moi sur la mailing liste LAU (linux audio user), et on a donc envoyé un mail aux développeurs qui nous ont tout de suite proposé un patch.
Le problème est maintenant résolu. Il y a encore quelques message d'erreurs dans le output de la commande "dmesg" mais en tout cas maintenant j'arrive à utiliser pure data et rosegarden sans problème. Donc le soucis majeur à disparu. Je poste ici le patch à appliqué.
(ps : Moi la fonction patch -p1 < .... n'a pas fonctionné donc j'ai modifié les fichiers directement à la main. Pensez à faire une copie de sauvegarde du fichier à modifier)
Merci à Takashi Iwai (developpeur du patch) et Daniel Mack un des principal développeur aussi pour ce driver.
__(remplacer les moins moins moins par 3 signe "-" (soustraction) sans espace entre chaque...
Je n'ai pas réussi à trouver comment faire pour insérer du code...)__
moinsmoinsmoins
diff --git a/sound/usb/caiaq/caiaq-device.h b/sound/usb/caiaq/caiaq-device.h
index f9fbdba..ab56e73 100644
moinsmoinsmoins a/sound/usb/caiaq/caiaq-device.h
+++ b/sound/usb/caiaq/caiaq-device.h
@@ -75,6 +75,7 @@ struct snd_usb_caiaqdev {
wait_queue_head_t ep1_wait_queue;
wait_queue_head_t prepare_wait_queue;
int spec_received, audio_parm_answer;
+ int midi_out_active;
char vendor_nameCAIAQ_USB_STR_LEN;
char product_nameCAIAQ_USB_STR_LEN;
diff --git a/sound/usb/caiaq/caiaq-midi.c b/sound/usb/caiaq/caiaq-midi.c
index 30b57f9..f19fd36 100644
moinsmoinsmoins a/sound/usb/caiaq/caiaq-midi.c
+++ b/sound/usb/caiaq/caiaq-midi.c
@@ -59,6 +59,11 @@ static int snd_usb_caiaq_midi_output_open(struct snd_rawmidi_substream *substrea
static int snd_usb_caiaq_midi_output_close(struct snd_rawmidi_substream *substream)
{
+ struct snd_usb_caiaqdev *dev = substream->rmidi->private_data;
+ if (dev->midi_out_active) {
+ usb_kill_urb(&dev->midi_out_urb);
+ dev->midi_out_active = 0;
+ }
return 0;
}
@@ -69,7 +74,8 @@ static void snd_usb_caiaq_midi_send(struct snd_usb_caiaqdev *dev,
dev->midi_out_buf0 = EP1_CMD_MIDI_WRITE;
dev->midi_out_buf1 = 0; /* port */
- len = snd_rawmidi_transmit_peek(substream, dev->midi_out_buf+3, EP1_BUFSIZE-3);
+ len = snd_rawmidi_transmit(substream, dev->midi_out_buf + 3,
+ EP1_BUFSIZE - 3);
if (len midi_out_urb, GFP_ATOMIC);
if (ret < 0)
- log("snd_usb_caiaq_midi_send(%p): usb_submit_urb() failed, %d\n",
- substream, ret);
+ log("snd_usb_caiaq_midi_send(%p): usb_submit_urb() failed,"
+ "ret=%d, len=%d\n",
+ substream, ret, len);
+ else
+ dev->midi_out_active = 1;
}
static void snd_usb_caiaq_midi_output_trigger(struct snd_rawmidi_substream *substream, int up)
{
struct snd_usb_caiaqdev *dev = substream->rmidi->private_data;
- if (dev->midi_out_substream != NULL)
- return;
-
- if (!up) {
+ if (up) {
+ dev->midi_out_substream = substream;
+ if (!dev->midi_out_active)
+ snd_usb_caiaq_midi_send(dev, substream);
+ } else {
dev->midi_out_substream = NULL;
- return;
}
-
- dev->midi_out_substream = substream;
- snd_usb_caiaq_midi_send(dev, substream);
}
@@ -161,16 +167,14 @@ int snd_usb_caiaq_midi_init(struct snd_usb_caiaqdev *device)
void snd_usb_caiaq_midi_output_done(struct urb* urb)
{
struct snd_usb_caiaqdev *dev = urb->context;
- char *buf = urb->transfer_buffer;
+ dev->midi_out_active = 0;
if (urb->status != 0)
return;
if (!dev->midi_out_substream)
return;
- snd_rawmidi_transmit_ack(dev->midi_out_substream, buf2);
- dev->midi_out_substream = NULL;
snd_usb_caiaq_midi_send(dev, dev->midi_out_substream);
}
j'ai acheté il y a quelques temps une Audio Kontrol1 de chez Native instrument. Jusque là ça marchouillait. En fait j'avais de gros problèmes avec certains logiciels qui utilisent le midi, mais pas tous. Exemple : Rosegarden, puredata qui faisaient systématiquement planter jack, et obligation de redémarrer le systeme... un peu relou comme situation.
J'ai trouvé quelqu'un avec le meme soucis que moi sur la mailing liste LAU (linux audio user), et on a donc envoyé un mail aux développeurs qui nous ont tout de suite proposé un patch.
Le problème est maintenant résolu. Il y a encore quelques message d'erreurs dans le output de la commande "dmesg" mais en tout cas maintenant j'arrive à utiliser pure data et rosegarden sans problème. Donc le soucis majeur à disparu. Je poste ici le patch à appliqué.
(ps : Moi la fonction patch -p1 < .... n'a pas fonctionné donc j'ai modifié les fichiers directement à la main. Pensez à faire une copie de sauvegarde du fichier à modifier)
Merci à Takashi Iwai (developpeur du patch) et Daniel Mack un des principal développeur aussi pour ce driver.
__(remplacer les moins moins moins par 3 signe "-" (soustraction) sans espace entre chaque...
Je n'ai pas réussi à trouver comment faire pour insérer du code...)__
moinsmoinsmoins
diff --git a/sound/usb/caiaq/caiaq-device.h b/sound/usb/caiaq/caiaq-device.h
index f9fbdba..ab56e73 100644
moinsmoinsmoins a/sound/usb/caiaq/caiaq-device.h
+++ b/sound/usb/caiaq/caiaq-device.h
@@ -75,6 +75,7 @@ struct snd_usb_caiaqdev {
wait_queue_head_t ep1_wait_queue;
wait_queue_head_t prepare_wait_queue;
int spec_received, audio_parm_answer;
+ int midi_out_active;
char vendor_nameCAIAQ_USB_STR_LEN;
char product_nameCAIAQ_USB_STR_LEN;
diff --git a/sound/usb/caiaq/caiaq-midi.c b/sound/usb/caiaq/caiaq-midi.c
index 30b57f9..f19fd36 100644
moinsmoinsmoins a/sound/usb/caiaq/caiaq-midi.c
+++ b/sound/usb/caiaq/caiaq-midi.c
@@ -59,6 +59,11 @@ static int snd_usb_caiaq_midi_output_open(struct snd_rawmidi_substream *substrea
static int snd_usb_caiaq_midi_output_close(struct snd_rawmidi_substream *substream)
{
+ struct snd_usb_caiaqdev *dev = substream->rmidi->private_data;
+ if (dev->midi_out_active) {
+ usb_kill_urb(&dev->midi_out_urb);
+ dev->midi_out_active = 0;
+ }
return 0;
}
@@ -69,7 +74,8 @@ static void snd_usb_caiaq_midi_send(struct snd_usb_caiaqdev *dev,
dev->midi_out_buf0 = EP1_CMD_MIDI_WRITE;
dev->midi_out_buf1 = 0; /* port */
- len = snd_rawmidi_transmit_peek(substream, dev->midi_out_buf+3, EP1_BUFSIZE-3);
+ len = snd_rawmidi_transmit(substream, dev->midi_out_buf + 3,
+ EP1_BUFSIZE - 3);
if (len midi_out_urb, GFP_ATOMIC);
if (ret < 0)
- log("snd_usb_caiaq_midi_send(%p): usb_submit_urb() failed, %d\n",
- substream, ret);
+ log("snd_usb_caiaq_midi_send(%p): usb_submit_urb() failed,"
+ "ret=%d, len=%d\n",
+ substream, ret, len);
+ else
+ dev->midi_out_active = 1;
}
static void snd_usb_caiaq_midi_output_trigger(struct snd_rawmidi_substream *substream, int up)
{
struct snd_usb_caiaqdev *dev = substream->rmidi->private_data;
- if (dev->midi_out_substream != NULL)
- return;
-
- if (!up) {
+ if (up) {
+ dev->midi_out_substream = substream;
+ if (!dev->midi_out_active)
+ snd_usb_caiaq_midi_send(dev, substream);
+ } else {
dev->midi_out_substream = NULL;
- return;
}
-
- dev->midi_out_substream = substream;
- snd_usb_caiaq_midi_send(dev, substream);
}
@@ -161,16 +167,14 @@ int snd_usb_caiaq_midi_init(struct snd_usb_caiaqdev *device)
void snd_usb_caiaq_midi_output_done(struct urb* urb)
{
struct snd_usb_caiaqdev *dev = urb->context;
- char *buf = urb->transfer_buffer;
+ dev->midi_out_active = 0;
if (urb->status != 0)
return;
if (!dev->midi_out_substream)
return;
- snd_rawmidi_transmit_ack(dev->midi_out_substream, buf2);
- dev->midi_out_substream = NULL;
snd_usb_caiaq_midi_send(dev, dev->midi_out_substream);
}