From: Jaroslav Kysela Date: Fri, 22 Dec 2000 14:03:01 +0000 (+0000) Subject: Added snd_*_card() functions. X-Git-Tag: v1.0.3~1047 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=9acdef38c9953436801989a620fb6b705baf6855;p=alsa-lib.git Added snd_*_card() functions. --- diff --git a/aserver/aserver.c b/aserver/aserver.c index ebedb059..5752dfd9 100644 --- a/aserver/aserver.c +++ b/aserver/aserver.c @@ -373,6 +373,10 @@ int pcm_shm_cmd(client_t *client) ctrl->cmd = 0; pcm = client->device.pcm.handle; switch (cmd) { + case SND_PCM_IOCTL_CARD: + ctrl->result = 0; + ctrl->u.card = snd_pcm_card(pcm); + break; case SND_PCM_IOCTL_ASYNC: ctrl->result = snd_pcm_async(pcm, ctrl->u.async.sig, ctrl->u.async.pid); break; @@ -627,6 +631,9 @@ int ctl_shm_cmd(client_t *client) case SND_CTL_IOCTL_CLOSE: client->ops->close(client); break; + case SND_PCM_IOCTL_CARD: + ctrl->result = 0; + return shm_ack_fd(client, snd_ctl_card(ctl)); case SND_PCM_IOCTL_POLL_DESCRIPTOR: ctrl->result = 0; return shm_ack_fd(client, snd_ctl_poll_descriptor(ctl)); diff --git a/include/aserver.h b/include/aserver.h index 209f4425..9b4cc834 100644 --- a/include/aserver.h +++ b/include/aserver.h @@ -21,15 +21,16 @@ #include "../src/pcm/pcm_local.h" -#define SND_PCM_IOCTL_STATE _IO ('A', 0xf0) -#define SND_PCM_IOCTL_MMAP _IO ('A', 0xf1) -#define SND_PCM_IOCTL_MUNMAP _IO ('A', 0xf4) -#define SND_PCM_IOCTL_MMAP_FORWARD _IO ('A', 0xf7) -#define SND_PCM_IOCTL_AVAIL_UPDATE _IO ('A', 0xf8) -#define SND_PCM_IOCTL_ASYNC _IO ('A', 0xf9) -#define SND_PCM_IOCTL_CLOSE _IO ('A', 0xfa) -#define SND_PCM_IOCTL_POLL_DESCRIPTOR _IO ('A', 0xfc) -#define SND_PCM_IOCTL_SET_AVAIL_MIN _IO ('A', 0xfd) +#define SND_PCM_IOCTL_CARD _IO ('A', 0xf0) +#define SND_PCM_IOCTL_STATE _IO ('A', 0xf1) +#define SND_PCM_IOCTL_MMAP _IO ('A', 0xf2) +#define SND_PCM_IOCTL_MUNMAP _IO ('A', 0xf3) +#define SND_PCM_IOCTL_MMAP_FORWARD _IO ('A', 0xf4) +#define SND_PCM_IOCTL_AVAIL_UPDATE _IO ('A', 0xf5) +#define SND_PCM_IOCTL_ASYNC _IO ('A', 0xf6) +#define SND_PCM_IOCTL_CLOSE _IO ('A', 0xf7) +#define SND_PCM_IOCTL_POLL_DESCRIPTOR _IO ('A', 0xf8) +#define SND_PCM_IOCTL_SET_AVAIL_MIN _IO ('A', 0xf9) typedef struct { long result; @@ -37,6 +38,7 @@ typedef struct { size_t hw_ptr; size_t appl_ptr; union { + int card; struct { int sig; pid_t pid; @@ -71,9 +73,10 @@ typedef struct { #define PCM_SHM_SIZE sizeof(snd_pcm_shm_ctrl_t) -#define SND_CTL_IOCTL_READ _IOR('U', 0xf0, snd_ctl_event_t) -#define SND_CTL_IOCTL_CLOSE _IO ('U', 0xf1) -#define SND_CTL_IOCTL_POLL_DESCRIPTOR _IO ('U', 0xf2) +#define SND_CTL_IOCTL_CARD _IO ('U', 0xf0) +#define SND_CTL_IOCTL_READ _IOR('U', 0xf1, snd_ctl_event_t) +#define SND_CTL_IOCTL_CLOSE _IO ('U', 0xf2) +#define SND_CTL_IOCTL_POLL_DESCRIPTOR _IO ('U', 0xf3) typedef struct { int result; diff --git a/include/control.h b/include/control.h index cd8e0e53..401bb8ed 100644 --- a/include/control.h +++ b/include/control.h @@ -42,6 +42,7 @@ int snd_defaults_rawmidi_device(void); snd_ctl_type_t snd_ctl_type(snd_ctl_t *handle); int snd_ctl_open(snd_ctl_t **handle, char *name); int snd_ctl_close(snd_ctl_t *handle); +int snd_ctl_card(snd_ctl_t *handle); int snd_ctl_poll_descriptor(snd_ctl_t *handle); int snd_ctl_hw_info(snd_ctl_t *handle, snd_ctl_hw_info_t *info); int snd_ctl_clist(snd_ctl_t *handle, snd_control_list_t * list); diff --git a/include/mixer.h b/include/mixer.h index c53de78c..2382062d 100644 --- a/include/mixer.h +++ b/include/mixer.h @@ -13,6 +13,7 @@ extern "C" { int snd_mixer_open(snd_mixer_t **handle, char *name); int snd_mixer_close(snd_mixer_t *handle); +int snd_mixer_card(snd_mixer_t *handle); int snd_mixer_poll_descriptor(snd_mixer_t *handle); #ifdef __cplusplus diff --git a/include/pcm.h b/include/pcm.h index c5d49af5..8efc8708 100644 --- a/include/pcm.h +++ b/include/pcm.h @@ -53,6 +53,7 @@ ssize_t snd_pcm_readv(snd_pcm_t *pcm, const struct iovec *vector, int count); snd_pcm_type_t snd_pcm_type(snd_pcm_t *pcm); int snd_pcm_close(snd_pcm_t *pcm); +int snd_pcm_card(snd_pcm_t *pcm); int snd_pcm_poll_descriptor(snd_pcm_t *pcm); int snd_pcm_nonblock(snd_pcm_t *pcm, int nonblock); int snd_pcm_async(snd_pcm_t *pcm, int sig, pid_t pid); diff --git a/include/rawmidi.h b/include/rawmidi.h index f75ef0c2..f1b1bbc0 100644 --- a/include/rawmidi.h +++ b/include/rawmidi.h @@ -26,6 +26,7 @@ typedef enum _snd_rawmidi_type { int snd_rawmidi_open(snd_rawmidi_t **handle, char *name, int streams, int mode); int snd_rawmidi_close(snd_rawmidi_t *handle); +int snd_rawmidi_card(snd_rawmidi_t *handle); int snd_rawmidi_poll_descriptor(snd_rawmidi_t *handle); int snd_rawmidi_nonblock(snd_rawmidi_t *handle, int nonblock); int snd_rawmidi_info(snd_rawmidi_t *handle, snd_rawmidi_info_t * info); diff --git a/src/control/control.c b/src/control/control.c index 584fd946..7a18e400 100644 --- a/src/control/control.c +++ b/src/control/control.c @@ -45,6 +45,12 @@ int snd_ctl_close(snd_ctl_t *ctl) return res; } +int snd_ctl_card(snd_ctl_t *ctl) +{ + assert(ctl); + return ctl->ops->card(ctl); +} + int snd_ctl_poll_descriptor(snd_ctl_t *ctl) { assert(ctl); diff --git a/src/control/control_hw.c b/src/control/control_hw.c index abc00106..85f80653 100644 --- a/src/control/control_hw.c +++ b/src/control/control_hw.c @@ -48,6 +48,12 @@ static int snd_ctl_hw_close(snd_ctl_t *handle) return res; } +static int snd_ctl_hw_card(snd_ctl_t *handle) +{ + snd_ctl_hw_t *hw = handle->private; + return hw->card; +} + static int snd_ctl_hw_poll_descriptor(snd_ctl_t *handle) { snd_ctl_hw_t *hw = handle->private; @@ -166,6 +172,7 @@ static int snd_ctl_hw_read(snd_ctl_t *handle, snd_ctl_event_t *event) snd_ctl_ops_t snd_ctl_hw_ops = { close: snd_ctl_hw_close, + card: snd_ctl_hw_card, poll_descriptor: snd_ctl_hw_poll_descriptor, hw_info: snd_ctl_hw_hw_info, clist: snd_ctl_hw_clist, diff --git a/src/control/control_local.h b/src/control/control_local.h index 9a13521e..5bd9f197 100644 --- a/src/control/control_local.h +++ b/src/control/control_local.h @@ -33,6 +33,7 @@ typedef struct { int (*close)(snd_ctl_t *handle); + int (*card)(snd_ctl_t *handle); int (*poll_descriptor)(snd_ctl_t *handle); int (*hw_info)(snd_ctl_t *handle, snd_ctl_hw_info_t *info); int (*clist)(snd_ctl_t *handle, snd_control_list_t *list); diff --git a/src/control/control_shm.c b/src/control/control_shm.c index fad8a41a..e5131d33 100644 --- a/src/control/control_shm.c +++ b/src/control/control_shm.c @@ -95,6 +95,18 @@ static int snd_ctl_shm_close(snd_ctl_t *ctl) return result; } +static int snd_ctl_shm_card(snd_ctl_t *ctl) +{ + snd_ctl_shm_t *shm = ctl->private; + snd_ctl_shm_ctrl_t *ctrl = shm->ctrl; + int card, err; + ctrl->cmd = SND_CTL_IOCTL_CARD; + err = snd_ctl_shm_action_fd(ctl, &card); + if (err < 0) + return err; + return card; +} + static int snd_ctl_shm_poll_descriptor(snd_ctl_t *ctl) { snd_ctl_shm_t *shm = ctl->private; @@ -310,6 +322,7 @@ static int snd_ctl_shm_read(snd_ctl_t *ctl, snd_ctl_event_t *event) snd_ctl_ops_t snd_ctl_shm_ops = { close: snd_ctl_shm_close, + card: snd_ctl_shm_card, poll_descriptor: snd_ctl_shm_poll_descriptor, hw_info: snd_ctl_shm_hw_info, clist: snd_ctl_shm_clist, diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c index bb96a900..d46bbdc4 100644 --- a/src/pcm/pcm.c +++ b/src/pcm/pcm.c @@ -261,6 +261,12 @@ ssize_t snd_pcm_readv(snd_pcm_t *pcm, const struct iovec *vector, int count) return snd_pcm_readn(pcm, bufs, vector[0].iov_len); } +int snd_pcm_card(snd_pcm_t *pcm) +{ + assert(pcm); + return pcm->ops->card(pcm->op_arg); +} + /* FIXME */ #define snd_pcm_link_descriptor snd_pcm_poll_descriptor diff --git a/src/pcm/pcm_adpcm.c b/src/pcm/pcm_adpcm.c index 18307132..4c184abb 100644 --- a/src/pcm/pcm_adpcm.c +++ b/src/pcm/pcm_adpcm.c @@ -532,6 +532,7 @@ static void snd_pcm_adpcm_dump(snd_pcm_t *pcm, FILE *fp) snd_pcm_ops_t snd_pcm_adpcm_ops = { close: snd_pcm_adpcm_close, + card: snd_pcm_plugin_card, info: snd_pcm_plugin_info, hw_refine: snd_pcm_adpcm_hw_refine, hw_params: snd_pcm_adpcm_hw_params, diff --git a/src/pcm/pcm_alaw.c b/src/pcm/pcm_alaw.c index 6459b0b5..8fd84589 100644 --- a/src/pcm/pcm_alaw.c +++ b/src/pcm/pcm_alaw.c @@ -400,6 +400,7 @@ static void snd_pcm_alaw_dump(snd_pcm_t *pcm, FILE *fp) snd_pcm_ops_t snd_pcm_alaw_ops = { close: snd_pcm_plugin_close, + card: snd_pcm_plugin_card, info: snd_pcm_plugin_info, hw_refine: snd_pcm_alaw_hw_refine, hw_params: snd_pcm_alaw_hw_params, diff --git a/src/pcm/pcm_copy.c b/src/pcm/pcm_copy.c index 25773dfa..594ead57 100644 --- a/src/pcm/pcm_copy.c +++ b/src/pcm/pcm_copy.c @@ -158,6 +158,7 @@ static void snd_pcm_copy_dump(snd_pcm_t *pcm, FILE *fp) snd_pcm_ops_t snd_pcm_copy_ops = { close: snd_pcm_plugin_close, + card: snd_pcm_plugin_card, info: snd_pcm_plugin_info, hw_refine: snd_pcm_copy_hw_refine, hw_params: snd_pcm_copy_hw_params, diff --git a/src/pcm/pcm_file.c b/src/pcm/pcm_file.c index 55ca5693..4a801405 100644 --- a/src/pcm/pcm_file.c +++ b/src/pcm/pcm_file.c @@ -49,6 +49,12 @@ static int snd_pcm_file_close(snd_pcm_t *pcm) return 0; } +static int snd_pcm_file_card(snd_pcm_t *pcm) +{ + snd_pcm_file_t *file = pcm->private; + return snd_pcm_card(file->slave); +} + static int snd_pcm_file_nonblock(snd_pcm_t *pcm, int nonblock) { snd_pcm_file_t *file = pcm->private; @@ -301,6 +307,7 @@ static void snd_pcm_file_dump(snd_pcm_t *pcm, FILE *fp) snd_pcm_ops_t snd_pcm_file_ops = { close: snd_pcm_file_close, + card: snd_pcm_file_card, info: snd_pcm_file_info, hw_refine: snd_pcm_file_hw_refine, hw_params: snd_pcm_file_hw_params, diff --git a/src/pcm/pcm_hw.c b/src/pcm/pcm_hw.c index 63dea446..77bf9d94 100644 --- a/src/pcm/pcm_hw.c +++ b/src/pcm/pcm_hw.c @@ -109,6 +109,12 @@ static int snd_pcm_hw_async(snd_pcm_t *pcm, int sig, pid_t pid) return 0; } +static int snd_pcm_hw_card(snd_pcm_t *pcm) +{ + snd_pcm_hw_t *hw = pcm->private; + return hw->card; +} + static int snd_pcm_hw_info(snd_pcm_t *pcm, snd_pcm_info_t * info) { snd_pcm_hw_t *hw = pcm->private; @@ -499,6 +505,7 @@ static void snd_pcm_hw_dump(snd_pcm_t *pcm, FILE *fp) snd_pcm_ops_t snd_pcm_hw_ops = { close: snd_pcm_hw_close, + card: snd_pcm_hw_card, info: snd_pcm_hw_info, hw_refine: snd_pcm_hw_hw_refine, hw_params: snd_pcm_hw_hw_params, diff --git a/src/pcm/pcm_linear.c b/src/pcm/pcm_linear.c index 9ecb5252..6fb66128 100644 --- a/src/pcm/pcm_linear.c +++ b/src/pcm/pcm_linear.c @@ -239,6 +239,7 @@ static void snd_pcm_linear_dump(snd_pcm_t *pcm, FILE *fp) snd_pcm_ops_t snd_pcm_linear_ops = { close: snd_pcm_plugin_close, + card: snd_pcm_plugin_card, info: snd_pcm_plugin_info, hw_refine: snd_pcm_linear_hw_refine, hw_params: snd_pcm_linear_hw_params, diff --git a/src/pcm/pcm_local.h b/src/pcm/pcm_local.h index 6bfdb707..5c354ab4 100644 --- a/src/pcm/pcm_local.h +++ b/src/pcm/pcm_local.h @@ -56,6 +56,7 @@ typedef struct _snd_pcm_channel_info { typedef struct { int (*close)(snd_pcm_t *pcm); + int (*card)(snd_pcm_t *pcm); int (*nonblock)(snd_pcm_t *pcm, int nonblock); int (*async)(snd_pcm_t *pcm, int sig, pid_t pid); int (*info)(snd_pcm_t *pcm, snd_pcm_info_t *info); diff --git a/src/pcm/pcm_mulaw.c b/src/pcm/pcm_mulaw.c index ec0642f1..55dc7dac 100644 --- a/src/pcm/pcm_mulaw.c +++ b/src/pcm/pcm_mulaw.c @@ -417,6 +417,7 @@ static void snd_pcm_mulaw_dump(snd_pcm_t *pcm, FILE *fp) snd_pcm_ops_t snd_pcm_mulaw_ops = { close: snd_pcm_plugin_close, + card: snd_pcm_plugin_card, info: snd_pcm_plugin_info, hw_refine: snd_pcm_mulaw_hw_refine, hw_params: snd_pcm_mulaw_hw_params, diff --git a/src/pcm/pcm_multi.c b/src/pcm/pcm_multi.c index f36dd222..c4e5f425 100644 --- a/src/pcm/pcm_multi.c +++ b/src/pcm/pcm_multi.c @@ -67,6 +67,11 @@ static int snd_pcm_multi_close(snd_pcm_t *pcm) return ret; } +static int snd_pcm_multi_card(snd_pcm_t *pcm ATTRIBUTE_UNUSED) +{ + return -ENOENT; /* not available */ +} + static int snd_pcm_multi_nonblock(snd_pcm_t *pcm ATTRIBUTE_UNUSED, int nonblock ATTRIBUTE_UNUSED) { return 0; @@ -390,6 +395,7 @@ static void snd_pcm_multi_dump(snd_pcm_t *pcm, FILE *fp) snd_pcm_ops_t snd_pcm_multi_ops = { close: snd_pcm_multi_close, + card: snd_pcm_multi_card, info: snd_pcm_multi_info, hw_refine: snd_pcm_multi_hw_refine, hw_params: snd_pcm_multi_hw_params, diff --git a/src/pcm/pcm_null.c b/src/pcm/pcm_null.c index 171a79e4..0e3ad1aa 100644 --- a/src/pcm/pcm_null.c +++ b/src/pcm/pcm_null.c @@ -42,6 +42,11 @@ static int snd_pcm_null_close(snd_pcm_t *pcm) return 0; } +static int snd_pcm_null_card(snd_pcm_t *pcm ATTRIBUTE_UNUSED) +{ + return -ENOENT; /* not available */ +} + static int snd_pcm_null_nonblock(snd_pcm_t *pcm ATTRIBUTE_UNUSED, int nonblock ATTRIBUTE_UNUSED) { return 0; @@ -295,6 +300,7 @@ static void snd_pcm_null_dump(snd_pcm_t *pcm, FILE *fp) snd_pcm_ops_t snd_pcm_null_ops = { close: snd_pcm_null_close, + card: snd_pcm_null_card, info: snd_pcm_null_info, hw_refine: snd_pcm_null_hw_refine, hw_params: snd_pcm_null_hw_params, diff --git a/src/pcm/pcm_plug.c b/src/pcm/pcm_plug.c index 0019c6e2..1206af6b 100644 --- a/src/pcm/pcm_plug.c +++ b/src/pcm/pcm_plug.c @@ -51,6 +51,12 @@ static int snd_pcm_plug_close(snd_pcm_t *pcm) return result; } +static int snd_pcm_plug_card(snd_pcm_t *pcm) +{ + snd_pcm_plug_t *plug = pcm->private; + return snd_pcm_card(plug->slave); +} + static int snd_pcm_plug_nonblock(snd_pcm_t *pcm, int nonblock) { snd_pcm_plug_t *plug = pcm->private; @@ -645,6 +651,7 @@ static void snd_pcm_plug_dump(snd_pcm_t *pcm, FILE *fp) snd_pcm_ops_t snd_pcm_plug_ops = { close: snd_pcm_plug_close, + card: snd_pcm_plug_card, info: snd_pcm_plug_info, hw_refine: snd_pcm_plug_hw_refine, hw_params: snd_pcm_plug_hw_params, diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c index 342cbe27..f7b53696 100644 --- a/src/pcm/pcm_plugin.c +++ b/src/pcm/pcm_plugin.c @@ -34,6 +34,12 @@ int snd_pcm_plugin_close(snd_pcm_t *pcm) return 0; } +int snd_pcm_plugin_card(snd_pcm_t *pcm) +{ + snd_pcm_plugin_t *plugin = pcm->private; + return snd_pcm_card(plugin->slave); +} + int snd_pcm_plugin_nonblock(snd_pcm_t *pcm, int nonblock) { snd_pcm_plugin_t *plugin = pcm->private; diff --git a/src/pcm/pcm_plugin.h b/src/pcm/pcm_plugin.h index cf58714e..24e68915 100644 --- a/src/pcm/pcm_plugin.h +++ b/src/pcm/pcm_plugin.h @@ -31,6 +31,7 @@ typedef struct { } snd_pcm_plugin_t; int snd_pcm_plugin_close(snd_pcm_t *pcm); +int snd_pcm_plugin_card(snd_pcm_t *pcm); int snd_pcm_plugin_nonblock(snd_pcm_t *pcm, int nonblock); int snd_pcm_plugin_async(snd_pcm_t *pcm, int sig, pid_t pid); int snd_pcm_plugin_info(snd_pcm_t *pcm, snd_pcm_info_t * info); diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c index ffb9349c..2e091416 100644 --- a/src/pcm/pcm_rate.c +++ b/src/pcm/pcm_rate.c @@ -511,6 +511,7 @@ static void snd_pcm_rate_dump(snd_pcm_t *pcm, FILE *fp) snd_pcm_ops_t snd_pcm_rate_ops = { close: snd_pcm_rate_close, + card: snd_pcm_plugin_card, info: snd_pcm_plugin_info, hw_refine: snd_pcm_rate_hw_refine, hw_params: snd_pcm_rate_hw_params, diff --git a/src/pcm/pcm_route.c b/src/pcm/pcm_route.c index 3aec22a2..ad33740c 100644 --- a/src/pcm/pcm_route.c +++ b/src/pcm/pcm_route.c @@ -660,6 +660,7 @@ static void snd_pcm_route_dump(snd_pcm_t *pcm, FILE *fp) snd_pcm_ops_t snd_pcm_route_ops = { close: snd_pcm_route_close, + card: snd_pcm_plugin_card, info: snd_pcm_plugin_info, hw_refine: snd_pcm_route_hw_refine, hw_params: snd_pcm_route_hw_params, diff --git a/src/pcm/pcm_share.c b/src/pcm/pcm_share.c index 071f59f0..ccb3870a 100644 --- a/src/pcm/pcm_share.c +++ b/src/pcm/pcm_share.c @@ -417,6 +417,11 @@ static void _snd_pcm_share_update(snd_pcm_t *pcm) } } +static int snd_pcm_share_card(snd_pcm_t *pcm ATTRIBUTE_UNUSED) +{ + return -ENOENT; /* not available */ +} + static int snd_pcm_share_nonblock(snd_pcm_t *pcm ATTRIBUTE_UNUSED, int nonblock ATTRIBUTE_UNUSED) { return 0; @@ -1082,6 +1087,7 @@ static void snd_pcm_share_dump(snd_pcm_t *pcm, FILE *fp) snd_pcm_ops_t snd_pcm_share_ops = { close: snd_pcm_share_close, + card: snd_pcm_share_card, info: snd_pcm_share_info, hw_refine: snd_pcm_share_hw_refine, hw_params: snd_pcm_share_hw_params, diff --git a/src/pcm/pcm_shm.c b/src/pcm/pcm_shm.c index c9e73057..4655a252 100644 --- a/src/pcm/pcm_shm.c +++ b/src/pcm/pcm_shm.c @@ -116,6 +116,18 @@ static int snd_pcm_shm_action_fd(snd_pcm_t *pcm, int *fd) return ctrl->result; } +static int snd_pcm_shm_card(snd_pcm_t *pcm) +{ + snd_pcm_shm_t *shm = pcm->private; + volatile snd_pcm_shm_ctrl_t *ctrl = shm->ctrl; + int err; + ctrl->cmd = SND_PCM_IOCTL_CARD; + err = snd_pcm_shm_action(pcm); + if (err < 0) + return err; + return ctrl->u.card; +} + static int snd_pcm_shm_nonblock(snd_pcm_t *pcm ATTRIBUTE_UNUSED, int nonblock ATTRIBUTE_UNUSED) { return 0; @@ -442,6 +454,7 @@ static void snd_pcm_shm_dump(snd_pcm_t *pcm, FILE *fp) snd_pcm_ops_t snd_pcm_shm_ops = { close: snd_pcm_shm_close, + card: snd_pcm_shm_card, info: snd_pcm_shm_info, hw_refine: snd_pcm_shm_hw_refine, hw_params: snd_pcm_shm_hw_params, diff --git a/src/rawmidi/rawmidi.c b/src/rawmidi/rawmidi.c index 536098a7..50d89bda 100644 --- a/src/rawmidi/rawmidi.c +++ b/src/rawmidi/rawmidi.c @@ -41,6 +41,12 @@ int snd_rawmidi_close(snd_rawmidi_t *rmidi) return 0; } +int snd_rawmidi_card(snd_rawmidi_t *rmidi) +{ + assert(rmidi); + return rmidi->ops->card(rmidi); +} + int snd_rawmidi_poll_descriptor(snd_rawmidi_t *rmidi) { assert(rmidi); diff --git a/src/rawmidi/rawmidi_hw.c b/src/rawmidi/rawmidi_hw.c index 8a2590c6..a5b5ec95 100644 --- a/src/rawmidi/rawmidi_hw.c +++ b/src/rawmidi/rawmidi_hw.c @@ -50,6 +50,12 @@ static int snd_rawmidi_hw_close(snd_rawmidi_t *rmidi) return 0; } +static int snd_rawmidi_hw_card(snd_rawmidi_t *rmidi) +{ + snd_rawmidi_hw_t *hw = rmidi->private; + return hw->card; +} + static int snd_rawmidi_hw_nonblock(snd_rawmidi_t *rmidi, int nonblock) { snd_rawmidi_hw_t *hw = rmidi->private; @@ -142,6 +148,7 @@ static ssize_t snd_rawmidi_hw_read(snd_rawmidi_t *rmidi, void *buffer, size_t si snd_rawmidi_ops_t snd_rawmidi_hw_ops = { close: snd_rawmidi_hw_close, + card: snd_rawmidi_hw_card, nonblock: snd_rawmidi_hw_nonblock, info: snd_rawmidi_hw_info, params: snd_rawmidi_hw_params, diff --git a/src/rawmidi/rawmidi_local.h b/src/rawmidi/rawmidi_local.h index 81b303de..16f7c037 100644 --- a/src/rawmidi/rawmidi_local.h +++ b/src/rawmidi/rawmidi_local.h @@ -36,6 +36,7 @@ typedef struct { int (*close)(snd_rawmidi_t *rawmidi); + int (*card)(snd_rawmidi_t *rawmidi); int (*nonblock)(snd_rawmidi_t *rawmidi, int nonblock); int (*info)(snd_rawmidi_t *rawmidi, snd_rawmidi_info_t *info); int (*params)(snd_rawmidi_t *rawmidi, snd_rawmidi_params_t *params);