Posted on 2008-01-12 07:41:10-08 by cfturkja
Original author still around? (Mute patch)

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() ?
Direct Responses: Write a response
Perl Weekly newsletter
A free weekly newsletter for people who are busy to read all the blogs. click here to check it out.