Example #1
0
class AudioAnalysis:
    def compute_track(self, file_name):
        self.at = AudioTrack()

        (head, file_n) = os.path.split(file_name)

        if not self.at.open(file_name):
            return False

        self.file_name = file_name

        self.meta_data = RetirveMetadata()
        self.meta_data.scan_file(self.file_name)

        self.duration = StructDuration()
        self.duration.set_samples(self.at.Y.shape[0], self.at.Fs)

        self.virt_compute()

        return True

    def getDuration(self):
        return self.duration

    def getMetaData(self):
        return self.meta_data

    def getAudioTrack(self):
        return self.at

    def getFileName(self):
        return self.file_name

    def virt_compute(self):
        raise
Example #2
0
 def __init__(self):
     self.res_list = []
     self.dir_name = ''
     self.dr14 = 0
     self.meta_data = RetirveMetadata()
     self.compute_dr = ComputeDR14()
     self.__write_to_local_db = False
     self.coll_dir = os.path.realpath(get_collection_dir())
 def __init__( self ):
     self.res_list = []
     self.dir_name = '' 
     self.dr14 = 0 
     self.meta_data = RetirveMetadata()
     self.histogram = False
     
     self.compute_dr = ComputeDR14()
 def __init__( self ):
     self.res_list = []
     self.dir_name = '' 
     self.dr14 = 0 
     self.meta_data = RetirveMetadata()        
     self.compute_dr = ComputeDR14()
     self.__write_to_local_db = False
     self.coll_dir = os.path.realpath( get_collection_dir() )
Example #5
0
    def compute_track(self, file_name):
        self.at = AudioTrack()

        (head, file_n) = os.path.split(file_name)

        if not self.at.open(file_name):
            return False

        self.file_name = file_name

        self.meta_data = RetirveMetadata()
        self.meta_data.scan_file(self.file_name)

        self.duration = StructDuration()
        self.duration.set_samples(self.at.Y.shape[0], self.at.Fs)

        self.virt_compute()

        return True
Example #6
0
class AudioAnalysis :
    
    def compute_track( self , file_name ) :
        self.at = AudioTrack()
        
        ( head,  file_n ) = os.path.split( file_name )
        
        if not self.at.open( file_name ):
            return False
        
        self.file_name = file_name
        
        self.meta_data = RetirveMetadata()
        self.meta_data.scan_file( self.file_name )
        
        self.duration = StructDuration()
        self.duration.set_samples( self.at.Y.shape[0] , self.at.Fs )
        
        self.virt_compute()
        
        return True
    
    def getDuration(self):
        return self.duration
    
    def getMetaData(self):
        return self.meta_data

    def getAudioTrack(self):
        return self.at
    
    def getFileName(self):
        return self.file_name
    
    def virt_compute(self):
        raise
Example #7
0
 def compute_track( self , file_name ) :
     self.at = AudioTrack()
     
     ( head,  file_n ) = os.path.split( file_name )
     
     if not self.at.open( file_name ):
         return False
     
     self.file_name = file_name
     
     self.meta_data = RetirveMetadata()
     self.meta_data.scan_file( self.file_name )
     
     self.duration = StructDuration()
     self.duration.set_samples( self.at.Y.shape[0] , self.at.Fs )
     
     self.virt_compute()
     
     return True
class DynamicRangeMeter:   
    
    def __init__( self ):
        self.res_list = []
        self.dir_name = '' 
        self.dr14 = 0 
        self.meta_data = RetirveMetadata()
        self.histogram = False
        
        self.compute_dr = ComputeDR14()
    
    def scan_file( self , file_name):
        
        at = AudioTrack() 
        
        duration = StructDuration() 
        
        if self.histogram :
            compute_fun = self.__compute_histogram
        else:
            compute_fun = self.__compute_and_append
        
        if at.open( file_name ):
            compute_fun( at , file_name )
            return 1
        else:
            return 0
        
    def scan_dir( self , dir_name ):
        
        if not os.path.isdir(dir_name) :
            return 0
        
        dir_list = sorted( os.listdir( dir_name ) )
        
        self.dir_name = dir_name 
        self.dr14 = 0 
        
        duration = StructDuration() 
        
        at = AudioTrack() 
        for file_name in dir_list:
            full_file = os.path.join( dir_name , file_name )
            
            #print( full_file )
            if at.open( full_file ):
                self.__compute_and_append( at , file_name )

        self.meta_data.scan_dir( dir_name )
        if len( self.res_list ) > 0:
            self.dr14 = int( round( self.dr14 / len( self.res_list ) ) )
            return len( self.res_list )
        else:
            return 0
 

    def __compute_and_append( self , at , file_name ):
        
        duration = StructDuration()
        
        #( dr14, dB_peak, dB_rms ) = self.compute_dr.compute( at.Y , at.Fs )
        ( dr14, dB_peak, dB_rms ) = compute_dr14( at.Y , at.Fs , duration )
        
        self.dr14 = self.dr14 + dr14
        
        res = { 'file_name': file_name , 'dr14': dr14 , 'dB_peak': dB_peak , 'dB_rms': dB_rms , 'duration':duration.to_str() }
        self.res_list.append(res)
        
        print( file_name + ": \t DR " + str( int(dr14) ) )
  
    def __compute_histogram( self , at , file_name ):
        
        duration = StructDuration()
        
        self.meta_data.scan_file( file_name )
        
        (foo,fn) = os.path.split( file_name )
        title = self.meta_data.get_value( fn , "title" )
        
        print( title )
        
        compute_hist( at.Y , at.Fs , duration , title=title ) 
    
    
    def scan_dir_mt( self , dir_name , thread_cnt ):
        
        if not os.path.isdir(dir_name) :
            return 0
        
        dir_list = sorted( os.listdir( dir_name ) )
        
        self.dir_name = dir_name 
        self.dr14 = 0
        
        ad = AudioDecoder()
        
        jobs = []
        for file_name in dir_list:
            ( fn , ext ) = os.path.splitext( file_name )
            if ext in ad.formats:
                jobs.append( file_name )
        
        empty_res = { 'file_name': '' , 'dr14': dr14.min_dr() , 'dB_peak': -100 , 'dB_rms': -100 , 'duration':"0:0" }
        self.res_list = [empty_res for i in range( len(jobs) )]
        
        lock_j = threading.Lock()
        lock_res_list = threading.Lock()
        
        threads = [1 for i in range(thread_cnt)]
        job_free = [0]
        
        for t in range( thread_cnt ):
            threads[t] = ScanDirMt( dir_name, jobs , job_free , lock_j , self.res_list , lock_res_list )
            
        for t in range( thread_cnt ):
            threads[t].start() 
        
        for t in range( thread_cnt ):
            threads[t].join()
            
        succ = 0 
        for d in self.res_list:
            if d['dr14'] > dr14.min_dr():
                self.dr14 = self.dr14 + d['dr14']
                succ = succ + 1 
            
         
        #print( str(self.res_list ) )
        self.meta_data.scan_dir( dir_name )
        if len( self.res_list ) > 0 and succ > 0 :
            self.dr14 = int( round( self.dr14 / succ ) )
            return succ
        else:
            return 0
        

    def fwrite_dr( self , file_name , tm , ext_table=False , std_out=False , append=False , dr_database=True ):
        
        if ext_table :
            wr = WriteDrExtended()
        else :
            wr = WriteDr()
        
        wr.set_dr_database( dr_database )
        
        self.table_txt = wr.write_dr( self , tm )        
        
        if std_out:
            print( self.table_txt )
            return 
        
        if append :
            file_mode = "a"
        else :
            file_mode = "w"
        
        try:
            out_file = codecs.open( file_name , file_mode , "utf-8-sig" )
        except:
            print ( "File opening error [%s] :" % file_name , sys.exc_info()[0] )
            return False
        
        out_file.write( self.table_txt )
        out_file.close()
        return True
Example #9
0
class DynamicRangeMeter:   
    
    def __init__( self ):
        self.res_list = []
        self.dir_name = '' 
        self.dr14 = 0 
        self.meta_data = RetirveMetadata()        
        self.compute_dr = ComputeDR14()
    
    def scan_file( self , file_name):
        
        at = AudioTrack() 
        
        duration = StructDuration() 
        
        if at.open( file_name ):
            self.__compute_and_append( at , file_name )
            return 1
        else:
            return 0
        
    def scan_dir( self , dir_name ):
        
        if not os.path.isdir(dir_name) :
            return 0
        
        dir_list = sorted( os.listdir( dir_name ) )
        
        self.dir_name = dir_name 
        self.dr14 = 0 
        
        duration = StructDuration() 
        
        at = AudioTrack() 
        for file_name in dir_list:
            full_file = os.path.join( dir_name , file_name )
            
            #print_msg( full_file )
            if at.open( full_file ):
                self.__compute_and_append( at , file_name )

        self.meta_data.scan_dir( dir_name )
        if len( self.res_list ) > 0:
            self.dr14 = int( round( self.dr14 / len( self.res_list ) ) )
            return len( self.res_list )
        else:
            return 0
 

    def __compute_and_append( self , at , file_name ):
        
        duration = StructDuration()
        
        #( dr14, dB_peak, dB_rms ) = self.compute_dr.compute( at.Y , at.Fs )
        ( dr14, dB_peak, dB_rms ) = compute_dr14( at.Y , at.Fs , duration )
        
        self.dr14 = self.dr14 + dr14
        
        res = { 'file_name': file_name , 'dr14': dr14 , 'dB_peak': dB_peak , 'dB_rms': dB_rms , 'duration':duration.to_str() }
        self.res_list.append(res)
        
        print_msg( file_name + ": \t DR " + str( int(dr14) ) )
  


    def fwrite_dr( self , file_name , tm , ext_table=False , std_out=False , append=False , dr_database=True ):
        
        if ext_table :
            wr = WriteDrExtended()
        else :
            wr = WriteDr()
        
        wr.set_dr_database( dr_database )
        
        self.table_txt = wr.write_dr( self , tm )        
        
        if std_out:
            print_out( self.table_txt )
            return 
        
        if append :
            file_mode = "a"
        else :
            file_mode = "w"
        
        try:
            out_file = codecs.open( file_name , file_mode , "utf-8-sig" )
        except:
            print_msg ( "File opening error [%s] :" % file_name , sys.exc_info()[0] )
            return False
        
        out_file.write( self.table_txt )
        out_file.close()
        return True

    def scan_mp( self , dir_name="" , thread_cnt=2 , files_list=[] ):
        
        if sys.version_info[0] == 2 :
            dir_name = dir_name.decode('utf-8')
        
        self.dr14 = 0
                
        if files_list == [] :
            if not os.path.isdir(dir_name) :
                return 0
            dir_list = sorted( os.listdir( dir_name ) )
            self.dir_name = dir_name
            files_list = None
        else:
            dir_list = sorted( files_list )
            
        ad = AudioDecoder()
        
        jobs = []
        for file_name in dir_list:
            ( fn , ext ) = os.path.splitext( file_name )
            if ext in ad.formats:
                jobs.append( file_name )
        
        
        res_array=[SharedDrResObj() for i in range( len(jobs) )]
        
        for i in range( len(jobs) ) :
            res_array[i].file_name = jobs[i]
            res_array[i].dr14 = dr14.min_dr()
        
        lock_j = mp.Lock()
        lock_res_list = mp.Lock()
        
        threads = [1 for i in range(thread_cnt)]
        
        #job_free = [0]
        job_free = mp.Value( 'i' , 0 )
        res_array_sh = mp.Array( SharedDrResObj , res_array )
        
        for t in range( thread_cnt ):
            threads[t] = mp.Process( target=self.run_mp , args=( dir_name , lock_j , lock_res_list , job_free , res_array_sh ) )
            
        for t in range( thread_cnt ):
            threads[t].start() 
        
        for t in range( thread_cnt ):
            threads[t].join()
            
        succ = 0
        
        #empty_res = { 'file_name': '' , 'dr14': dr14.min_dr() , 'dB_peak': -100 , 'dB_rms': -100 , 'duration':"0:0" }
        self.res_list = [] # [empty_res for i in range( len(jobs) )]
        
        #i = 0
        
        dur = StructDuration()
        
        for res in res_array_sh:
            self.res_list.append( { 'file_name':   res.file_name ,
                                 'dr14':        res.dr14 ,
                                 'dB_peak':     res.dB_peak ,
                                 'dB_rms':      res.dB_rms ,
                                 'duration':    dur.float_to_str( res.duration ) } )
            
        #    i = i + 1
        
        for d in self.res_list:
            if d['dr14'] > dr14.min_dr():
                self.dr14 = self.dr14 + d['dr14']
                succ = succ + 1
                
        self.meta_data.scan_dir( dir_name , files_list )
        
        if len( self.res_list ) > 0 and succ > 0 :
            self.dr14 = int( round( self.dr14 / succ ) )
            return succ
        else:
            return 0
  
    
    def run_mp( self , dir_name , lock_j , lock_res_list , job_free , res_array_sh ):
        
        at = AudioTrack() 
        duration = StructDuration()
        
        #print_msg("start .... ")
        
        while True:
            
            #Aquire the next free job
            lock_j.acquire()
            
            if job_free.value >= len(res_array_sh):
                lock_j.release()
                return
            
            curr_job =  job_free.value
            file_name = res_array_sh[curr_job].file_name
            job_free.value = job_free.value + 1
            
            lock_j.release()
            
            full_file = os.path.join( dir_name , file_name )
            #print ( full_file )
            
            if at.open( full_file ):
                ( dr14, dB_peak, dB_rms ) = compute_dr14( at.Y , at.Fs , duration )
                lock_res_list.acquire()
                print_msg( file_name + ": \t DR " + str( int(dr14) ) )
                
                #res_list[curr_job] = { 'file_name': file_name , 'dr14': dr14 , 'dB_peak': dB_peak , 'dB_rms': dB_rms , 'duration':duration.to_str() }
                res_array_sh[curr_job].dr14 = dr14
                res_array_sh[curr_job].dB_peak = dB_peak
                res_array_sh[curr_job].dB_rms = dB_rms
                res_array_sh[curr_job].duration = duration.to_float() 
                
                lock_res_list.release()
            else:
                print_msg( "- fail - " + full_file )
class DynamicRangeMeter:   
    
    def __init__( self ):
        self.res_list = []
        self.dir_name = '' 
        self.dr14 = 0 
        self.meta_data = RetirveMetadata()        
        self.compute_dr = ComputeDR14()
        self.__write_to_local_db = False
        self.coll_dir = os.path.realpath( get_collection_dir() )
    
    def write_to_local_db( self , f=False ):
        self.__write_to_local_db = f
    
    def scan_file( self , file_name):
        
        at = AudioTrack() 
        
        duration = StructDuration() 
        
        if at.open( file_name ):
            self.__compute_and_append( at , file_name )
            return 1
        else:
            return 0
        
    def scan_dir( self , dir_name ):
        
        if not os.path.isdir(dir_name) :
            return 0
        
        dir_list = sorted( os.listdir( dir_name ) )
        
        self.dir_name = dir_name 
        self.dr14 = 0 
        
        duration = StructDuration() 
        
        at = AudioTrack() 
        for file_name in dir_list:
            full_file = os.path.join( dir_name , file_name )
            
            #print_msg( full_file )
            if at.open( full_file ):
                self.__compute_and_append( at , file_name )

        self.meta_data.scan_dir( dir_name )
        if len( self.res_list ) > 0:
            self.dr14 = int( round( self.dr14 / len( self.res_list ) ) )
            return len( self.res_list )
        else:
            return 0
 

    def __compute_and_append( self , at , file_name ):
        
        duration = StructDuration()
        
        #( dr14, dB_peak, dB_rms ) = self.compute_dr.compute( at.Y , at.Fs )
        ( dr14, dB_peak, dB_rms ) = compute_dr14( at.Y , at.Fs , duration )
        sha1 = sha1_track_v1( at.Y , at.get_file_ext_code()  )
        
        self.dr14 = self.dr14 + dr14
        
        res = { 'file_name': file_name , 
               'dr14': dr14 , 
               'dB_peak': dB_peak , 
               'dB_rms': dB_rms , 
               'duration': duration.to_str() ,
               'sha1': sha1 }
        
        self.res_list.append(res)
        
        print_msg( file_name + ": \t DR " + str( int(dr14) ) )
  


    def write_to_local_database(self):
        
        wr = WriteDr()
        
        if self.__write_to_local_db and os.path.realpath( self.dir_name ).startswith( self.coll_dir ) :
            wr.write_to_local_dr_database( self )    
                

    def fwrite_dr( self , file_name , tm , ext_table=False , std_out=False , append=False , dr_database=True ):
        
        if ext_table :
            wr = WriteDrExtended()
        else :
            wr = WriteDr()
        
        wr.set_loudness_war_db_compatible( dr_database )
        
        self.table_txt = wr.write_dr( self , tm )
        
        if std_out:
            print_out( self.table_txt )
            return 
        
        if append :
            file_mode = "a"
        else :
            file_mode = "w"
        
        try:
            out_file = codecs.open( file_name , file_mode , "utf-8-sig" )
        except:
            print_msg ( "File opening error [%s] :" % file_name , sys.exc_info()[0] )
            return False
        
        out_file.write( self.table_txt )
        out_file.close()
        return True

    def scan_mp( self , dir_name="" , thread_cnt=2 , files_list=[] ):
        
        if sys.version_info[0] == 2 :
            dir_name = dir_name.decode('utf-8')
        
        self.dr14 = 0
        
        job_queue_sh = mp.JoinableQueue( 2000 )
        res_queue_sh = mp.Queue( 2000 )
                
        if files_list == [] :
            if not os.path.isdir(dir_name) :
                return 0
            dir_list = sorted( os.listdir( dir_name ) )
            self.dir_name = dir_name
            files_list = None
        else:
            dir_list = sorted( files_list )
            
        ad = AudioDecoder()
        
        for file_name in dir_list:
            ( fn , ext ) = os.path.splitext( file_name )
            if ext in ad.formats:
                job = SharedDrResObj()
                job.file_name = file_name
                job.dir_name = dir_name
                job_queue_sh.put( job )
                
        threads = [1 for i in range(thread_cnt)]
        
        job_free = mp.Value( 'i' , 0 )
        
        for t in range( thread_cnt ):
            threads[t] = mp.Process( target=self.run_mp , args=( job_queue_sh , res_queue_sh ) )
            
        for t in range( thread_cnt ):
            threads[t].start() 
  
  
        job_queue_sh.join()
                                
        succ = 0
        
        self.res_list = [] 
        
        #i = 0
        
        dur = StructDuration()
        
        while not res_queue_sh.empty() :
            res = res_queue_sh.get()
            if res.fail :
                continue
            self.res_list.append( { 'file_name':   res.file_name ,
                                    'dr14':        res.dr14 ,
                                    'dB_peak':     res.dB_peak ,
                                    'dB_rms':      res.dB_rms ,
                                    'duration':    dur.float_to_str( res.duration ) , 
                                    'sha1':        res.sha1 } )
            
        self.res_list = sorted( self.res_list , key=lambda res: res['file_name'] )
            
        #    i = i + 1
        
        for d in self.res_list:
            if d['dr14'] > dr14.min_dr():
                self.dr14 = self.dr14 + d['dr14']
                succ = succ + 1
                
        self.meta_data.scan_dir( dir_name , files_list )
        
        if len( self.res_list ) > 0 and succ > 0 :
            self.dr14 = int( round( self.dr14 / succ ) )
            return succ
        else:
            return 0
  

    def run_mp( self , job_queue_sh , res_queue_sh ):
        
        at = AudioTrack() 
        duration = StructDuration()
        
        #print_msg("start .... ")
        
        while True:
            
            if job_queue_sh.empty() :
                return 
            
            job = job_queue_sh.get()
            
            full_file = os.path.join( job.dir_name , job.file_name )
            #print ( full_file )
            
            if at.open( full_file ):
                ( dr14, dB_peak, dB_rms ) = compute_dr14( at.Y , at.Fs , duration )
                sha1 = sha1_track_v1( at.Y , at.get_file_ext_code() )
    
                print_msg( job.file_name + ": \t DR " + str( int(dr14) ) )
                flush_msg()
                
                job.dr14 = dr14
                job.dB_peak = dB_peak
                job.dB_rms = dB_rms
                job.duration = duration.to_float() 
                job.sha1 = sha1
                
            else:
                job.fail = True
                print_msg( "- fail - " + full_file )
               
            res_queue_sh.put( job )
            job_queue_sh.task_done()
Example #11
0
class DynamicRangeMeter:
    def __init__(self):
        self.res_list = []
        self.dir_name = ''
        self.dr14 = 0
        self.meta_data = RetirveMetadata()
        self.compute_dr = ComputeDR14()
        self.__write_to_local_db = False
        self.coll_dir = os.path.realpath(get_collection_dir())

    def write_to_local_db(self, f=False):
        self.__write_to_local_db = f

    def scan_file(self, file_name):

        at = AudioTrack()

        duration = StructDuration()

        if at.open(file_name):
            self.__compute_and_append(at, file_name)
            return 1
        else:
            return 0

    def scan_dir(self, dir_name):

        if not os.path.isdir(dir_name):
            return 0

        dir_list = sorted(os.listdir(dir_name))

        self.dir_name = dir_name
        self.dr14 = 0

        duration = StructDuration()

        at = AudioTrack()
        for file_name in dir_list:
            full_file = os.path.join(dir_name, file_name)

            #print_msg( full_file )
            if at.open(full_file):
                self.__compute_and_append(at, file_name)

        self.meta_data.scan_dir(dir_name)
        if len(self.res_list) > 0:
            self.dr14 = int(round(self.dr14 / len(self.res_list)))
            return len(self.res_list)
        else:
            return 0

    def __compute_and_append(self, at, file_name):

        duration = StructDuration()

        #( dr14, dB_peak, dB_rms ) = self.compute_dr.compute( at.Y , at.Fs )
        (dr14, dB_peak, dB_rms) = compute_dr14(at.Y, at.Fs, duration)
        sha1 = sha1_track_v1(at.Y, at.get_file_ext_code())

        self.dr14 = self.dr14 + dr14

        res = {
            'file_name': file_name,
            'dr14': dr14,
            'dB_peak': dB_peak,
            'dB_rms': dB_rms,
            'duration': duration.to_str(),
            'sha1': sha1
        }

        self.res_list.append(res)

        print_msg(file_name + ": \t DR " + str(int(dr14)))

    def write_to_local_database(self):

        wr = WriteDr()

        if self.__write_to_local_db and os.path.realpath(
                self.dir_name).startswith(self.coll_dir):
            wr.write_to_local_dr_database(self)

    def fwrite_dr(self,
                  file_name,
                  tm,
                  ext_table=False,
                  std_out=False,
                  append=False,
                  dr_database=True):

        if ext_table:
            wr = WriteDrExtended()
        else:
            wr = WriteDr()

        wr.set_loudness_war_db_compatible(dr_database)

        self.table_txt = wr.write_dr(self, tm)

        if std_out:
            print_out(self.table_txt)
            return

        if append:
            file_mode = "a"
        else:
            file_mode = "w"

        try:
            out_file = codecs.open(file_name, file_mode, "utf-8-sig")
        except:
            print_msg("File opening error [%s] :" % file_name,
                      sys.exc_info()[0])
            return False

        out_file.write(self.table_txt)
        out_file.close()
        return True

    def scan_mp(self, dir_name="", thread_cnt=2, files_list=[]):

        if sys.version_info[0] == 2:
            dir_name = dir_name.decode('utf-8')

        self.dr14 = 0

        job_queue_sh = mp.JoinableQueue(2000)
        res_queue_sh = mp.Queue(2000)

        if files_list == []:
            if not os.path.isdir(dir_name):
                return 0
            dir_list = sorted(os.listdir(dir_name))
            self.dir_name = dir_name
            files_list = None
        else:
            dir_list = sorted(files_list)

        ad = AudioDecoder()

        for file_name in dir_list:
            (fn, ext) = os.path.splitext(file_name)
            if ext in ad.formats:
                job = SharedDrResObj()
                job.file_name = file_name
                job.dir_name = dir_name
                job_queue_sh.put(job)

        threads = [1 for i in range(thread_cnt)]

        job_free = mp.Value('i', 0)

        for t in range(thread_cnt):
            threads[t] = mp.Process(target=self.run_mp,
                                    args=(job_queue_sh, res_queue_sh))

        for t in range(thread_cnt):
            threads[t].start()

        job_queue_sh.join()

        succ = 0

        self.res_list = []

        #i = 0

        dur = StructDuration()

        while not res_queue_sh.empty():
            res = res_queue_sh.get()
            if res.fail:
                continue
            self.res_list.append({
                'file_name': res.file_name,
                'dr14': res.dr14,
                'dB_peak': res.dB_peak,
                'dB_rms': res.dB_rms,
                'duration': dur.float_to_str(res.duration),
                'sha1': res.sha1
            })

        self.res_list = sorted(self.res_list, key=lambda res: res['file_name'])

        #    i = i + 1

        for d in self.res_list:
            if d['dr14'] > dr14.min_dr():
                self.dr14 = self.dr14 + d['dr14']
                succ = succ + 1

        self.meta_data.scan_dir(dir_name, files_list)

        if len(self.res_list) > 0 and succ > 0:
            self.dr14 = int(round(self.dr14 / succ))
            return succ
        else:
            return 0

    def run_mp(self, job_queue_sh, res_queue_sh):

        at = AudioTrack()
        duration = StructDuration()

        #print_msg("start .... ")

        while True:

            if job_queue_sh.empty():
                return

            job = job_queue_sh.get()

            full_file = os.path.join(job.dir_name, job.file_name)
            #print ( full_file )

            if at.open(full_file):
                (dr14, dB_peak, dB_rms) = compute_dr14(at.Y, at.Fs, duration)
                sha1 = sha1_track_v1(at.Y, at.get_file_ext_code())

                print_msg(job.file_name + ": \t DR " + str(int(dr14)))
                flush_msg()

                job.dr14 = dr14
                job.dB_peak = dB_peak
                job.dB_rms = dB_rms
                job.duration = duration.to_float()
                job.sha1 = sha1

            else:
                job.fail = True
                print_msg("- fail - " + full_file)

            res_queue_sh.put(job)
            job_queue_sh.task_done()