[vlc-devel] [PATCH] aout: add device cycling helper
Rémi Denis-Courmont
remi at remlab.net
Thu Nov 29 14:46:11 CET 2018
since there is anyway a ToCToU situation now, I don't see the point of the helper, and even less of the unlocked function.
Le 28 novembre 2018 16:47:22 GMT+02:00, Victorien Le Couviour--Tuffet <victorien.lecouviour.tuffet at gmail.com> a écrit :
>---
> include/vlc_aout.h | 1 +
> src/audio_output/output.c | 94 ++++++++++++++++++++++++++++++++-------
> src/libvlccore.sym | 1 +
> 3 files changed, 81 insertions(+), 15 deletions(-)
>
>diff --git a/include/vlc_aout.h b/include/vlc_aout.h
>index aa49884001..ef78127c13 100644
>--- a/include/vlc_aout.h
>+++ b/include/vlc_aout.h
>@@ -373,6 +373,7 @@ VLC_API int aout_MuteGet (audio_output_t *);
> VLC_API int aout_MuteSet (audio_output_t *, bool);
> VLC_API char *aout_DeviceGet (audio_output_t *);
> VLC_API int aout_DeviceSet (audio_output_t *, const char *);
>+VLC_API int aout_DeviceNext (audio_output_t *, char **);
> VLC_API int aout_DevicesList (audio_output_t *, char ***, char ***);
>
> /**
>diff --git a/src/audio_output/output.c b/src/audio_output/output.c
>index 019797c5ef..ef643260b0 100644
>--- a/src/audio_output/output.c
>+++ b/src/audio_output/output.c
>@@ -701,24 +701,15 @@ int aout_DeviceSet (audio_output_t *aout, const
>char *id)
> return ret ? -1 : 0;
> }
>
>-/**
>- * Enumerates possible audio output devices.
>- *
>- * The function will heap-allocate two tables of heap-allocated
>strings;
>- * the caller is responsible for freeing all strings and both tables.
>- *
>- * \param ids pointer to a table of device identifiers [OUT]
>- * \param names pointer to a table of device human-readable
>descriptions [OUT]
>- * \return the number of devices, or negative on error.
>- * \note In case of error, *ids and *names are undefined.
>- */
>-int aout_DevicesList (audio_output_t *aout, char ***ids, char
>***names)
>+static int aout_DevicesListLocked(audio_output_t *aout,
>+ char ***ids, char ***names)
> {
> aout_owner_t *owner = aout_owner (aout);
>+ vlc_mutex_assert(&owner->lock);
>+ vlc_mutex_assert(&owner->dev.lock);
> char **tabid, **tabname;
> unsigned i = 0;
>
>- vlc_mutex_lock (&owner->dev.lock);
> tabid = vlc_alloc (owner->dev.count, sizeof (*tabid));
> tabname = vlc_alloc (owner->dev.count, sizeof (*tabname));
>
>@@ -743,12 +734,10 @@ int aout_DevicesList (audio_output_t *aout, char
>***ids, char ***names)
>
> i++;
> }
>- vlc_mutex_unlock (&owner->dev.lock);
>
> return i;
>
> error:
>- vlc_mutex_unlock(&owner->dev.lock);
> while (i > 0)
> {
> i--;
>@@ -760,6 +749,81 @@ error:
> return -1;
> }
>
>+/**
>+ * Enumerates possible audio output devices.
>+ *
>+ * The function will heap-allocate two tables of heap-allocated
>strings;
>+ * the caller is responsible for freeing all strings and both tables.
>+ *
>+ * \param ids pointer to a table of device identifiers [OUT]
>+ * \param names pointer to a table of device human-readable
>descriptions [OUT]
>+ * \return the number of devices, or negative on error.
>+ * \note In case of error, *ids and *names are undefined.
>+ */
>+int aout_DevicesList (audio_output_t *aout, char ***ids, char
>***names)
>+{
>+ aout_OutputLock(aout);
>+ vlc_mutex_t *lock = &aout_owner(aout)->dev.lock;
>+ vlc_mutex_lock(lock);
>+ int ret = aout_DevicesListLocked(aout, ids, names);
>+ vlc_mutex_unlock(lock);
>+ aout_OutputUnlock(aout);
>+ return ret;
>+}
>+
>+/**
>+ * Cycle through audio output devices.
>+ * \param p_name pointer to the selected device human-readable
>description [OUT]
>+ * \return zero on success, non-zero on error.
>+ */
>+int aout_DeviceNext (audio_output_t *aout, char **p_name)
>+{
>+ int ret = -1;
>+ aout_owner_t *owner = aout_owner(aout);
>+ aout_OutputLock(aout);
>+ vlc_mutex_lock(&owner->dev.lock);
>+ bool locked = true;
>+
>+ char **ids, **names;
>+ int n = aout_DevicesListLocked(aout, &ids, &names);
>+ if (n == -1)
>+ goto end;
>+ char *device = aout_DeviceGet(aout);
>+ if (!device)
>+ goto no_dev;
>+
>+ int index;
>+ for (index = 0; index < n; ++index)
>+ if (!strcmp(ids[index], device))
>+ {
>+ index = (index + 1) % n;
>+ break;
>+ }
>+ vlc_mutex_unlock(&owner->dev.lock);
>+ aout_OutputUnlock(aout);
>+ locked = false;
>+ ret = aout_DeviceSet(aout, ids[index]);
>+ if (p_name != NULL)
>+ *p_name = strdup(names[index]);
>+
>+ free(device);
>+no_dev:
>+ for (int i = 0; i < n; ++i)
>+ {
>+ free(ids[i]);
>+ free(names[i]);
>+ }
>+ free(ids);
>+ free(names);
>+end:
>+ if (locked)
>+ {
>+ vlc_mutex_unlock(&owner->dev.lock);
>+ aout_OutputUnlock(aout);
>+ }
>+ return ret;
>+}
>+
> static void aout_ChangeViewpoint(audio_output_t *aout,
> const vlc_viewpoint_t *p_viewpoint)
> {
>diff --git a/src/libvlccore.sym b/src/libvlccore.sym
>index d4db4ccc51..41af4b48db 100644
>--- a/src/libvlccore.sym
>+++ b/src/libvlccore.sym
>@@ -20,6 +20,7 @@ aout_MuteSet
> aout_MuteGet
> aout_DeviceGet
> aout_DeviceSet
>+aout_DeviceNext
> aout_DevicesList
> aout_FiltersNew
> aout_FiltersChangeViewpoint
>--
>2.19.1
>
>_______________________________________________
>vlc-devel mailing list
>To unsubscribe or modify your subscription options:
>https://mailman.videolan.org/listinfo/vlc-devel
--
Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20181129/adc3c895/attachment.html>
More information about the vlc-devel
mailing list