void rawmidi_substream_info_refer_private(ALSARawmidiSubstreamInfo *self,
struct snd_rawmidi_info **info);
-void rawmidi_select_subdevice(guint card_id, guint subdevice_id, GError **error);
+void rawmidi_select_subdevice(guint card_id, guint subdevice_id, int *ctl_fd, GError **error);
void rawmidi_substream_params_refer_private(ALSARawmidiSubstreamParams *self,
struct snd_rawmidi_params **params);
g_object_unref(*substream_info);
}
-void rawmidi_select_subdevice(guint card_id, guint subdevice_id, GError **error)
+void rawmidi_select_subdevice(guint card_id, guint subdevice_id, int *ctl_fd, GError **error)
{
guint data = subdevice_id;
rawmidi_perform_ctl_ioctl(card_id, SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE,
- &data, "RAWMIDI_PREFER_SUBDEVICE", NULL, error);
+ &data, "RAWMIDI_PREFER_SUBDEVICE", ctl_fd, error);
}
{
ALSARawmidiStreamPairPrivate *priv;
char *devnode;
+ int ctl_fd;
int proto_ver;
g_return_if_fail(ALSARAWMIDI_IS_STREAM_PAIR(self));
if (*error != NULL)
return;
- rawmidi_select_subdevice(card_id, subdevice_id, error);
+ rawmidi_select_subdevice(card_id, subdevice_id, &ctl_fd, error);
if (*error != NULL) {
g_free(devnode);
return;
}
priv->fd = open(devnode, open_flag);
+ close(ctl_fd);
if (priv->fd < 0) {
if (errno == ENODEV) {
generate_local_error(error, ALSARAWMIDI_STREAM_PAIR_ERROR_DISCONNECTED);