* [PATCH] libv4l1: move VIDIOCGAUDIO and VIDIOCSAUDIO to libv4l1
@ 2010-06-07 9:50 huzaifas
2010-06-07 12:47 ` Hans de Goede
0 siblings, 1 reply; 2+ messages in thread
From: huzaifas @ 2010-06-07 9:50 UTC (permalink / raw)
To: linux-media; +Cc: hdegoede, Huzaifa Sidhpurwala
From: Huzaifa Sidhpurwala <huzaifas@redhat.com>
move VIDIOCGAUDIO and VIDIOCSAUDIO to libv4l1
Signed-of-by: Huzaifa Sidhpurwala <huzaifas@redhat.com>
---
lib/libv4l1/libv4l1-priv.h | 7 ++
lib/libv4l1/libv4l1.c | 160 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 167 insertions(+), 0 deletions(-)
diff --git a/lib/libv4l1/libv4l1-priv.h b/lib/libv4l1/libv4l1-priv.h
index 11f4fd0..11ee57a 100644
--- a/lib/libv4l1/libv4l1-priv.h
+++ b/lib/libv4l1/libv4l1-priv.h
@@ -60,6 +60,13 @@ extern FILE *v4l1_log_file;
#define min(a, b) (((a) < (b)) ? (a) : (b))
#endif
+#define DIV_ROUND_CLOSEST(x, divisor)( \
+{ \
+ typeof(divisor) __divisor = divisor; \
+ (((x) + ((__divisor) / 2)) / (__divisor)); \
+} \
+)
+
struct v4l1_dev_info {
int fd;
int flags;
diff --git a/lib/libv4l1/libv4l1.c b/lib/libv4l1/libv4l1.c
index 2981c40..263d564 100644
--- a/lib/libv4l1/libv4l1.c
+++ b/lib/libv4l1/libv4l1.c
@@ -233,6 +233,59 @@ static int v4l1_set_format(int index, unsigned int width,
return result;
}
+static int set_v4l_control(int fd, int cid, int value)
+{
+ struct v4l2_queryctrl qctrl2;
+ struct v4l2_control ctrl2;
+ int result;
+
+ qctrl2.id = cid;
+ result = v4l2_ioctl(fd, VIDIOC_QUERYCTRL, &qctrl2);
+ if (result < 0)
+ return 0;
+ if (result == 0 &&
+ !(qctrl2.flags & V4L2_CTRL_FLAG_DISABLED) &&
+ !(qctrl2.flags & V4L2_CTRL_FLAG_GRABBED)) {
+ if (value < 0)
+ value = 0;
+ if (value > 65535)
+ value = 65535;
+ if (value && qctrl2.type == V4L2_CTRL_TYPE_BOOLEAN)
+ value = 65535;
+ ctrl2.id = qctrl2.id;
+ ctrl2.value =
+ (value * (qctrl2.maximum - qctrl2.minimum)
+ + 32767)
+ / 65535;
+ ctrl2.value += qctrl2.minimum;
+ result = v4l2_ioctl(fd, VIDIOC_S_CTRL, &ctrl2);
+ }
+ return 0;
+}
+
+static int get_v4l_control(int fd, int cid)
+{
+ struct v4l2_queryctrl qctrl2;
+ struct v4l2_control ctrl2;
+ int result;
+
+ qctrl2.id = cid;
+ result = v4l2_ioctl(fd, VIDIOC_QUERYCTRL, &qctrl2);
+ if (result < 0)
+ return 0;
+ if (result == 0 && !(qctrl2.flags & V4L2_CTRL_FLAG_DISABLED)) {
+ ctrl2.id = qctrl2.id;
+ result = v4l2_ioctl(fd, VIDIOC_G_CTRL, &ctrl2);
+ if (result < 0)
+ return 0;
+
+ return DIV_ROUND_CLOSEST((ctrl2.value-qctrl2.minimum) * 65535,
+ qctrl2.maximum - qctrl2.minimum);
+ }
+ return 0;
+}
+
+
static void v4l1_find_min_and_max_size(int index, struct v4l2_format *fmt2)
{
int i;
@@ -983,6 +1036,113 @@ int v4l1_ioctl(int fd, unsigned long int request, ...)
break;
}
+
+ case VIDIOCSAUDIO: {
+ struct video_audio *aud = arg;
+ struct v4l2_audio aud2 = { 0, };
+ struct v4l2_tuner tun2 = { 0, };
+
+ aud2.index = aud->audio;
+ result = v4l2_ioctl(fd, VIDIOC_S_AUDIO, &aud2);
+ if (result < 0)
+ break;
+
+ set_v4l_control(fd, V4L2_CID_AUDIO_VOLUME,
+ aud->volume);
+ set_v4l_control(fd, V4L2_CID_AUDIO_BASS,
+ aud->bass);
+ set_v4l_control(fd, V4L2_CID_AUDIO_TREBLE,
+ aud->treble);
+ set_v4l_control(fd, V4L2_CID_AUDIO_BALANCE,
+ aud->balance);
+ set_v4l_control(fd, V4L2_CID_AUDIO_MUTE,
+ !!(aud->flags & VIDEO_AUDIO_MUTE));
+
+ result = v4l2_ioctl(fd, VIDIOC_G_TUNER, &tun2);
+ if (result < 0)
+ break;
+ if (result == 0) {
+ switch (aud->mode) {
+ default:
+ case VIDEO_SOUND_MONO:
+ case VIDEO_SOUND_LANG1:
+ tun2.audmode = V4L2_TUNER_MODE_MONO;
+ break;
+ case VIDEO_SOUND_STEREO:
+ tun2.audmode = V4L2_TUNER_MODE_STEREO;
+ break;
+ case VIDEO_SOUND_LANG2:
+ tun2.audmode = V4L2_TUNER_MODE_LANG2;
+ break;
+ }
+ result = v4l2_ioctl(fd, VIDIOC_S_TUNER, &tun2);
+ }
+ break;
+ }
+
+ case VIDIOCGAUDIO: {
+ int i;
+ struct video_audio *aud = arg;
+ struct v4l2_queryctrl qctrl2;
+ struct v4l2_audio aud2 = { 0, };
+ struct v4l2_tuner tun2;
+
+ result = v4l2_ioctl(fd, VIDIOC_G_AUDIO, &aud2);
+ if (result < 0)
+ break;
+
+ memcpy(aud->name, aud2.name,
+ min(sizeof(aud->name), sizeof(aud2.name)));
+ aud->name[sizeof(aud->name) - 1] = 0;
+ aud->audio = aud2.index;
+ aud->flags = 0;
+ i = get_v4l_control(fd, V4L2_CID_AUDIO_VOLUME);
+ if (i >= 0) {
+ aud->volume = i;
+ aud->flags |= VIDEO_AUDIO_VOLUME;
+ }
+ i = get_v4l_control(fd, V4L2_CID_AUDIO_BASS);
+ if (i >= 0) {
+ aud->bass = i;
+ aud->flags |= VIDEO_AUDIO_BASS;
+ }
+ i = get_v4l_control(fd, V4L2_CID_AUDIO_TREBLE);
+ if (i >= 0) {
+ aud->treble = i;
+ aud->flags |= VIDEO_AUDIO_TREBLE;
+ }
+ i = get_v4l_control(fd, V4L2_CID_AUDIO_BALANCE);
+ if (i >= 0) {
+ aud->balance = i;
+ aud->flags |= VIDEO_AUDIO_BALANCE;
+ }
+ i = get_v4l_control(fd, V4L2_CID_AUDIO_MUTE);
+ if (i >= 0) {
+ if (i)
+ aud->flags |= VIDEO_AUDIO_MUTE;
+
+ aud->flags |= VIDEO_AUDIO_MUTABLE;
+ }
+ aud->step = 1;
+ qctrl2.id = V4L2_CID_AUDIO_VOLUME;
+ if (v4l2_ioctl(fd, VIDIOC_QUERYCTRL, &qctrl2) == 0 &&
+ !(qctrl2.flags & V4L2_CTRL_FLAG_DISABLED))
+ aud->step = qctrl2.step;
+ aud->mode = 0;
+
+ result = v4l2_ioctl(fd, VIDIOC_G_TUNER, &tun2);
+ if (result < 0)
+ break;
+
+ if (tun2.rxsubchans & V4L2_TUNER_SUB_LANG2)
+ aud->mode = VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
+ else if (tun2.rxsubchans & V4L2_TUNER_SUB_STEREO)
+ aud->mode = VIDEO_SOUND_STEREO;
+ else if (tun2.rxsubchans & V4L2_TUNER_SUB_MONO)
+ aud->mode = VIDEO_SOUND_MONO;
+
+ }
+
default:
/* Pass through libv4l2 for applications which are using v4l2 through
libv4l1 (this can happen with the v4l1compat.so wrapper preloaded */
--
1.6.6.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] libv4l1: move VIDIOCGAUDIO and VIDIOCSAUDIO to libv4l1
2010-06-07 9:50 [PATCH] libv4l1: move VIDIOCGAUDIO and VIDIOCSAUDIO to libv4l1 huzaifas
@ 2010-06-07 12:47 ` Hans de Goede
0 siblings, 0 replies; 2+ messages in thread
From: Hans de Goede @ 2010-06-07 12:47 UTC (permalink / raw)
To: huzaifas; +Cc: linux-media
Hi,
See comments inline.
On 06/07/2010 11:50 AM, huzaifas@redhat.com wrote:
> From: Huzaifa Sidhpurwala<huzaifas@redhat.com>
>
> move VIDIOCGAUDIO and VIDIOCSAUDIO to libv4l1
>
> Signed-of-by: Huzaifa Sidhpurwala<huzaifas@redhat.com>
> ---
> lib/libv4l1/libv4l1-priv.h | 7 ++
> lib/libv4l1/libv4l1.c | 160 ++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 167 insertions(+), 0 deletions(-)
>
> diff --git a/lib/libv4l1/libv4l1-priv.h b/lib/libv4l1/libv4l1-priv.h
> index 11f4fd0..11ee57a 100644
> --- a/lib/libv4l1/libv4l1-priv.h
> +++ b/lib/libv4l1/libv4l1-priv.h
> @@ -60,6 +60,13 @@ extern FILE *v4l1_log_file;
> #define min(a, b) (((a)< (b)) ? (a) : (b))
> #endif
>
> +#define DIV_ROUND_CLOSEST(x, divisor)( \
> +{ \
> + typeof(divisor) __divisor = divisor; \
> + (((x) + ((__divisor) / 2)) / (__divisor)); \
> +} \
> +)
> +
> struct v4l1_dev_info {
> int fd;
> int flags;
> diff --git a/lib/libv4l1/libv4l1.c b/lib/libv4l1/libv4l1.c
> index 2981c40..263d564 100644
> --- a/lib/libv4l1/libv4l1.c
> +++ b/lib/libv4l1/libv4l1.c
> @@ -233,6 +233,59 @@ static int v4l1_set_format(int index, unsigned int width,
> return result;
> }
>
> +static int set_v4l_control(int fd, int cid, int value)
> +{
> + struct v4l2_queryctrl qctrl2;
> + struct v4l2_control ctrl2;
> + int result;
> +
> + qctrl2.id = cid;
> + result = v4l2_ioctl(fd, VIDIOC_QUERYCTRL,&qctrl2);
> + if (result< 0)
> + return 0;
> + if (result == 0&&
> + !(qctrl2.flags& V4L2_CTRL_FLAG_DISABLED)&&
> + !(qctrl2.flags& V4L2_CTRL_FLAG_GRABBED)) {
> + if (value< 0)
> + value = 0;
> + if (value> 65535)
> + value = 65535;
> + if (value&& qctrl2.type == V4L2_CTRL_TYPE_BOOLEAN)
> + value = 65535;
> + ctrl2.id = qctrl2.id;
> + ctrl2.value =
> + (value * (qctrl2.maximum - qctrl2.minimum)
> + + 32767)
> + / 65535;
> + ctrl2.value += qctrl2.minimum;
> + result = v4l2_ioctl(fd, VIDIOC_S_CTRL,&ctrl2);
> + }
> + return 0;
> +}
> +
> +static int get_v4l_control(int fd, int cid)
> +{
> + struct v4l2_queryctrl qctrl2;
> + struct v4l2_control ctrl2;
> + int result;
> +
> + qctrl2.id = cid;
> + result = v4l2_ioctl(fd, VIDIOC_QUERYCTRL,&qctrl2);
> + if (result< 0)
> + return 0;
> + if (result == 0&& !(qctrl2.flags& V4L2_CTRL_FLAG_DISABLED)) {
> + ctrl2.id = qctrl2.id;
> + result = v4l2_ioctl(fd, VIDIOC_G_CTRL,&ctrl2);
> + if (result< 0)
> + return 0;
> +
> + return DIV_ROUND_CLOSEST((ctrl2.value-qctrl2.minimum) * 65535,
> + qctrl2.maximum - qctrl2.minimum);
> + }
> + return 0;
> +}
> +
> +
These 2 functions are already present in libv4l2, they are called
v4l2_set_control and v4l2_get_control resp.
Regards,
Hans
> static void v4l1_find_min_and_max_size(int index, struct v4l2_format *fmt2)
> {
> int i;
> @@ -983,6 +1036,113 @@ int v4l1_ioctl(int fd, unsigned long int request, ...)
>
> break;
> }
> +
> + case VIDIOCSAUDIO: {
> + struct video_audio *aud = arg;
> + struct v4l2_audio aud2 = { 0, };
> + struct v4l2_tuner tun2 = { 0, };
> +
> + aud2.index = aud->audio;
> + result = v4l2_ioctl(fd, VIDIOC_S_AUDIO,&aud2);
> + if (result< 0)
> + break;
> +
> + set_v4l_control(fd, V4L2_CID_AUDIO_VOLUME,
> + aud->volume);
> + set_v4l_control(fd, V4L2_CID_AUDIO_BASS,
> + aud->bass);
> + set_v4l_control(fd, V4L2_CID_AUDIO_TREBLE,
> + aud->treble);
> + set_v4l_control(fd, V4L2_CID_AUDIO_BALANCE,
> + aud->balance);
> + set_v4l_control(fd, V4L2_CID_AUDIO_MUTE,
> + !!(aud->flags& VIDEO_AUDIO_MUTE));
> +
> + result = v4l2_ioctl(fd, VIDIOC_G_TUNER,&tun2);
> + if (result< 0)
> + break;
> + if (result == 0) {
> + switch (aud->mode) {
> + default:
> + case VIDEO_SOUND_MONO:
> + case VIDEO_SOUND_LANG1:
> + tun2.audmode = V4L2_TUNER_MODE_MONO;
> + break;
> + case VIDEO_SOUND_STEREO:
> + tun2.audmode = V4L2_TUNER_MODE_STEREO;
> + break;
> + case VIDEO_SOUND_LANG2:
> + tun2.audmode = V4L2_TUNER_MODE_LANG2;
> + break;
> + }
> + result = v4l2_ioctl(fd, VIDIOC_S_TUNER,&tun2);
> + }
> + break;
> + }
> +
> + case VIDIOCGAUDIO: {
> + int i;
> + struct video_audio *aud = arg;
> + struct v4l2_queryctrl qctrl2;
> + struct v4l2_audio aud2 = { 0, };
> + struct v4l2_tuner tun2;
> +
> + result = v4l2_ioctl(fd, VIDIOC_G_AUDIO,&aud2);
> + if (result< 0)
> + break;
> +
> + memcpy(aud->name, aud2.name,
> + min(sizeof(aud->name), sizeof(aud2.name)));
> + aud->name[sizeof(aud->name) - 1] = 0;
> + aud->audio = aud2.index;
> + aud->flags = 0;
> + i = get_v4l_control(fd, V4L2_CID_AUDIO_VOLUME);
> + if (i>= 0) {
> + aud->volume = i;
> + aud->flags |= VIDEO_AUDIO_VOLUME;
> + }
> + i = get_v4l_control(fd, V4L2_CID_AUDIO_BASS);
> + if (i>= 0) {
> + aud->bass = i;
> + aud->flags |= VIDEO_AUDIO_BASS;
> + }
> + i = get_v4l_control(fd, V4L2_CID_AUDIO_TREBLE);
> + if (i>= 0) {
> + aud->treble = i;
> + aud->flags |= VIDEO_AUDIO_TREBLE;
> + }
> + i = get_v4l_control(fd, V4L2_CID_AUDIO_BALANCE);
> + if (i>= 0) {
> + aud->balance = i;
> + aud->flags |= VIDEO_AUDIO_BALANCE;
> + }
> + i = get_v4l_control(fd, V4L2_CID_AUDIO_MUTE);
> + if (i>= 0) {
> + if (i)
> + aud->flags |= VIDEO_AUDIO_MUTE;
> +
> + aud->flags |= VIDEO_AUDIO_MUTABLE;
> + }
> + aud->step = 1;
> + qctrl2.id = V4L2_CID_AUDIO_VOLUME;
> + if (v4l2_ioctl(fd, VIDIOC_QUERYCTRL,&qctrl2) == 0&&
> + !(qctrl2.flags& V4L2_CTRL_FLAG_DISABLED))
> + aud->step = qctrl2.step;
> + aud->mode = 0;
> +
> + result = v4l2_ioctl(fd, VIDIOC_G_TUNER,&tun2);
> + if (result< 0)
> + break;
> +
> + if (tun2.rxsubchans& V4L2_TUNER_SUB_LANG2)
> + aud->mode = VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
> + else if (tun2.rxsubchans& V4L2_TUNER_SUB_STEREO)
> + aud->mode = VIDEO_SOUND_STEREO;
> + else if (tun2.rxsubchans& V4L2_TUNER_SUB_MONO)
> + aud->mode = VIDEO_SOUND_MONO;
> +
> + }
> +
> default:
> /* Pass through libv4l2 for applications which are using v4l2 through
> libv4l1 (this can happen with the v4l1compat.so wrapper preloaded */
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2010-06-07 12:45 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-06-07 9:50 [PATCH] libv4l1: move VIDIOCGAUDIO and VIDIOCSAUDIO to libv4l1 huzaifas
2010-06-07 12:47 ` Hans de Goede
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).