Does anybody know if the original author is still reachable? I'm new to this forum and I apologize if this is not the proper way of getting changes done, but I would very much like to see these changes ending up into CPAN-library.
All other V4L-radios (XawTV and Kradio) have mute control for the radio and also seem to use it. Apparently there is no way of un-muting the thing from Perl.
Here is my patch. I added two methods (functions) for muting and un-muting the radio. Also note that the code is full of comments and commented-out debugging print with the idea of accurately describing what changes I've done. Naturally they should be removed when/if an author will be found to accept this patch.
Regards,
Jari Turkia
---------------- mute.patch begins ---------------------
--- V4L.pm 2008-01-12 08:44:03.000000000 +0200
+++ V4L.pm.JT 2008-01-12 08:12:44.000000000 +0200
@@ -1,5 +1,5 @@
BEGIN {
- $VERSION = '0.01';
+ $VERSION = '0.02';
}
########################################### main pod documentation begin ##
@@ -159,6 +159,159 @@
################################################ subroutine header begin ##
+=head2 unmute()
+
+ Usage : $radio->unmute()
+ Returns : none
+ Argument : none
+
+=cut
+
+################################################## subroutine header end ##
+sub unmute() {
+ my $self = shift;
+ croak "Open the radio first!" unless $self->{ _fh };
+
+ # struct from linux/videodev.h
+ #
+ # struct video_tuner
+ # i = int tuner;
+ # Z32 = char name[32];
+ # L = unsigned long rangelow
+ # L = unsigned long rangehigh
+ # L = __u32 flags
+ # s = __u16 mode
+ # s = __u16 signal
+ #
+ # struct video_audio
+ # i = int audio; /* Audio channel */
+ # s = __u16 volume; /* If settable */
+ # ss = __u16 bass, treble;
+ # s = struct padding, 2 bytes
+ # L = __u32 flags;
+ # #define VIDEO_AUDIO_MUTE 1
+ # #define VIDEO_AUDIO_MUTABLE 2
+ # Z16 = char name[16];
+ # s = __u16 mode;
+ # s = __u16 balance; /* Stereo balance */
+ # s = __u16 step; /* Step actual volume uses */
+ my $videoaudio = pack("issssLZ16sss", 0,0,0,0,0,0,"",0,0,0);
+ ioctl(
+ $self->{ _fh },
+ $self->_get_VIDIOCGAUDIO,
+ $videoaudio
+ )
+ or croak "Could not unmute (read values): $!";
+ my @values = unpack("issssLZ16sss", $videoaudio);
+# $self->{ _audio } = $values[ 0 ];
+# $self->{ _volume } = $values[ 1 ];
+# $self->{ _bass } = $values[ 2 ];
+# $self->{ _treble } = $values[ 3 ];
+#
+# $self->{ _flags } = $values[ 5 ];
+# $self->{ _name } = $values[ 6 ];
+# $self->{ _mode } = $values[ 7 ];
+# $self->{ _balance } = $values[ 8 ];
+# $self->{ _step } = $values[ 9 ];
+
+if (0) {
+warn sprintf ("0: %d", $values[ 0 ]);
+warn sprintf ("1: %hu", $values[ 1 ]);
+warn sprintf ("2: %hu", $values[ 2 ]);
+warn sprintf ("3: %hu", $values[ 3 ]);
+warn sprintf ("5: 0x%0X", $values[ 5 ]);
+warn "6: ".$values[ 6 ];
+warn sprintf ("7: %hu", $values[ 7 ]);
+warn sprintf ("8: %hu", $values[ 8 ]);
+warn sprintf ("9: %hu", $values[ 9 ]);
+}
+ $values[ 1 ] = 65535 if ($values[ 1 ] == 0); # max. volume
+ $values[ 5 ] &= ~1; # 1=VIDEO_AUDIO_MUTE
+
+ # Set
+ ioctl(
+ $self->{ _fh },
+ $self->_get_VIDIOCSAUDIO,
+ pack(
+ "issssLZ16sss",
+ $values[ 0 ],
+ $values[ 1 ],
+ $values[ 2 ],
+ $values[ 3 ],
+ $values[ 4 ],
+ $values[ 5 ],
+ $values[ 6 ],
+ $values[ 7 ],
+ $values[ 8 ],
+ $values[ 9 ]
+ )
+ )
+ or croak "Could not unmute: $!";
+ $self;
+}
+
+################################################ subroutine header begin ##
+
+=head2 mute()
+
+ Usage : $radio->mute()
+ Returns : none
+ Argument : none
+
+=cut
+
+################################################## subroutine header end ##
+sub mute() {
+ my $self = shift;
+ croak "Open the radio first!" unless $self->{ _fh };
+
+ # struct from linux/videodev.h
+ #
+ my $videoaudio = pack("issssLZ16sss", 0,0,0,0,0,0,"",0,0,0);
+ ioctl(
+ $self->{ _fh },
+ $self->_get_VIDIOCGAUDIO,
+ $videoaudio
+ )
+ or croak "Could not mute (read values): $!";
+ my @values = unpack("issssLZ16sss", $videoaudio);
+if (0) {
+warn sprintf ("0: %d", $values[ 0 ]);
+warn sprintf ("1: %hu", $values[ 1 ]);
+warn sprintf ("2: %hu", $values[ 2 ]);
+warn sprintf ("3: %hu", $values[ 3 ]);
+warn sprintf ("5: 0x%0X", $values[ 5 ]);
+warn "6: ".$values[ 6 ];
+warn sprintf ("7: %hu", $values[ 7 ]);
+warn sprintf ("8: %hu", $values[ 8 ]);
+warn sprintf ("9: %hu", $values[ 9 ]);
+}
+ $values[ 5 ] |= 1; # 1=VIDEO_AUDIO_MUTE
+
+ # Set
+ ioctl(
+ $self->{ _fh },
+ $self->_get_VIDIOCSAUDIO,
+ pack(
+ "issssLZ16sss",
+ $values[ 0 ],
+ $values[ 1 ],
+ $values[ 2 ],
+ $values[ 3 ],
+ $values[ 4 ],
+ $values[ 5 ],
+ $values[ 6 ],
+ $values[ 7 ],
+ $values[ 8 ],
+ $values[ 9 ]
+ )
+ )
+ or croak "Could not mute: $!";
+ $self;
+}
+
+################################################ subroutine header begin ##
+
=head2 close()
Usage : $radio->close()
@@ -246,6 +399,18 @@
#
#END_OF_C
+sub _get_VIDIOCGAUDIO() {
+ return 0x80287610;
+ # _IOR('v',16, struct video_audio) /* Get audio info */
+ # return _get_VIDIOCGAUDIO;
+}
+
+sub _get_VIDIOCSAUDIO() {
+ return 0x40287611;
+ # _IOW('v',17, struct video_audio) /* Audio source, mute etc */
+ # return _get_VIDIOCSAUDIO;
+}
+
sub _get_frequency_factor() {
my $self = shift;
$self->{ _deviceflags } & _get_VIDEO_TUNER_LOW() ?
|