aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordvdli <70133153+dvdli@users.noreply.github.com>2023-09-05 10:20:40 +0800
committerGitHub <noreply@github.com>2023-09-05 10:20:40 +0800
commit2ca2386c1f41f3820e22281de570b19380682086 (patch)
treee88d363b4b9f5ea8eba982337f52496bb95298ff /src
parentc0fbed5e2ba87ee8cacc3cbca55488bcb85f327a (diff)
parent4516c73951d861e974f338540b026285148dc426 (diff)
Merge pull request #244 from rohit-qc/chmap_mixer_support
Chmap mixer support
Diffstat (limited to 'src')
-rw-r--r--src/mixer.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/mixer.c b/src/mixer.c
index 029fc84..f2c21c3 100644
--- a/src/mixer.c
+++ b/src/mixer.c
@@ -760,6 +760,55 @@ struct mixer_ctl *mixer_get_ctl_by_name_and_index(struct mixer *mixer,
return NULL;
}
+/** Gets an instance of mixer control handle, by the mixer control's name and device.
+ * For instance, if two controls have same name,
+ * e.g. 'Playback Channel map', then PCM device returns the specific control.
+ * @param mixer An initialized mixer handle.
+ * @param name The control's name in the given mixer.
+ * @param device The PCM device
+ * @returns A handle to the mixer control.
+ * @ingroup libtinyalsa-mixer
+ */
+struct mixer_ctl *mixer_get_ctl_by_name_and_device(struct mixer *mixer,
+ const char *name,
+ unsigned int device)
+{
+ struct mixer_ctl_group *grp;
+ unsigned int n;
+ struct mixer_ctl *ctl;
+
+ if (!mixer || !name) {
+ return NULL;
+ }
+
+ if (mixer->h_grp) {
+ grp = mixer->h_grp;
+ ctl = grp->ctl;
+
+ for (n = 0; n < grp->count; n++) {
+ if (!strcmp(name, (char*) ctl[n].info.id.name) &&
+ device == ctl[n].info.id.device) {
+ return ctl + n;
+ }
+ }
+ }
+
+#ifdef TINYALSA_USES_PLUGINS
+ if (mixer->v_grp) {
+ grp = mixer->v_grp;
+ ctl = grp->ctl;
+
+ for (n = 0; n < grp->count; n++) {
+ if (!strcmp(name, (char*) ctl[n].info.id.name) &&
+ device == ctl[n].info.id.device) {
+ return ctl + n;
+ }
+ }
+ }
+#endif
+ return NULL;
+}
+
/** Updates the control's info.
* This is useful for a program that may be idle for a period of time.
* @param ctl An initialized control handle.
@@ -822,6 +871,14 @@ const char *mixer_ctl_get_name(const struct mixer_ctl *ctl)
return (const char *)ctl->info.id.name;
}
+unsigned int mixer_ctl_get_device(const struct mixer_ctl *ctl)
+{
+ if (!ctl)
+ return UINT_MAX;
+
+ return ctl->info.id.device;
+}
+
/** Gets the value type of the control.
* @param ctl An initialized control handle
* @returns On success, the type of mixer control.