bug-gnupod
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug-gnupod] Patch to support ReplayGain / mp3gain


From: Richard van den Berg
Subject: [Bug-gnupod] Patch to support ReplayGain / mp3gain
Date: Fri, 17 Apr 2009 23:02:22 +0200
User-agent: Thunderbird 2.0.0.21 (Macintosh/20090302)

I'm successfully using gnupod on my iPod video 30GB. Thanks to everyone who contributed to this great tool!

I have all my mp3s tagged for ReplayGain volume leveling using mp3gain. This tool adds ReplayGain information using APE tags. Making gnupod read these tags and apply them as SoundCheck values was surprisingly easy. Boy, I love open source software. :-)

There might be a side effect if you have APE tags that also contain (wrong) title and artist information. I don't have such files to test with, but implementing a --disable-ape switch might be a good idea. Let me know if you need me to provide a patch for that as well.

This patch is against the current CVS version. It will prefer ReplayGain APE/id3v2 tags over iTunNORM id3v2 comments. The ReplayGain algorithm is far superior over the peak based SoundCheck algorithm iTunes implements, so it wouldn't make sense the other way around.

Regards,

Richard
*** FileMagic.pm.orig   2009-04-17 22:46:54.000000000 +0200
--- FileMagic.pm        2009-04-17 22:51:25.000000000 +0200
***************
*** 483,489 ****
        $rh{fdesc}    = "MPEG ${$h}{VERSION} layer ${$h}{LAYER} file";
        
        $h  = MP3::Info::get_mp3tag($file,1)    unless $flags->{'noIDv1'};  
#Get the IDv1 tag
!       $hs = MP3::Info::get_mp3tag($file,2,2)  unless $flags->{'noIDv2'};  
#Get the IDv2 tag
        
        my $nonitunescomment = undef;
        #The IDv2 Hashref may return arrays.. kill them :)
--- 483,489 ----
        $rh{fdesc}    = "MPEG ${$h}{VERSION} layer ${$h}{LAYER} file";
        
        $h  = MP3::Info::get_mp3tag($file,1)    unless $flags->{'noIDv1'};  
#Get the IDv1 tag
!       $hs = MP3::Info::get_mp3tag($file,2,2,1)  unless $flags->{'noIDv2'};  
#Get the APE + IDv2 tag
        
        my $nonitunescomment = undef;
        #The IDv2 Hashref may return arrays.. kill them :)
***************
*** 519,525 ****
        $rh{desc}       = __merge_strings({joinby => " ", wspace => "norm", 
case => "ignore"},($hs->{USLT} || $hs->{ULT}),($nonitunescomment || 
$h->{COMMENT}));
        $rh{composer}   = ($hs->{TCOM} || $hs->{TCM} || "");
        $rh{playcount}  = int($hs->{PCNT} || $hs->{CNT}) || 0;
!       $rh{soundcheck} = _parse_iTunNORM($hs->{COMM} || $hs->{COM} || 
$h->{COMMENT});
        $rh{mediatype}  = MEDIATYPE_AUDIO;
  
        # Handle volume adjustment information
--- 519,529 ----
        $rh{desc}       = __merge_strings({joinby => " ", wspace => "norm", 
case => "ignore"},($hs->{USLT} || $hs->{ULT}),($nonitunescomment || 
$h->{COMMENT}));
        $rh{composer}   = ($hs->{TCOM} || $hs->{TCM} || "");
        $rh{playcount}  = int($hs->{PCNT} || $hs->{CNT}) || 0;
!       if($hs->{REPLAYGAIN_TRACK_GAIN} ne "") {
!               $rh{soundcheck} = 
convertReplayGainToSoundCheck($hs->{REPLAYGAIN_TRACK_GAIN});
!       } else {
!               $rh{soundcheck} = _parse_iTunNORM($hs->{COMM} || $hs->{COM} || 
$h->{COMMENT});
!       }
        $rh{mediatype}  = MEDIATYPE_AUDIO;
  
        # Handle volume adjustment information
***************
*** 789,794 ****
--- 793,821 ----
  
  =cut
  
+ #########################################################
+ # Convert ReplayGain to SoundCheck
+ sub convertReplayGainToSoundCheck {
+       my ($gain) = @_;
+       if ( $gain =~ /(.*)\s+dB$/ ) {
+               $gain = $1;
+       }
+       my $result = round((10 ** (-$gain / 10)) * 1000);
+       
+       if ($result > 65534) {
+               $result = 65534;
+       }
+       
+       return oct(sprintf("0x%08X",$result));
+ }
+ 
+ #########################################################
+ # Round to next integer
+ sub round {
+       my $number = shift;
+       return int($number + .5 * ($number <=> 0));
+ }
+ 
  1;
  
  

reply via email to

[Prev in Thread] Current Thread [Next in Thread]