60 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| //=========================================================================
 | |
| // FILENAME : tagutils-opus.c
 | |
| // DESCRIPTION  : Opus metadata reader
 | |
| //=========================================================================
 | |
| 
 | |
| static int
 | |
| _get_opusfileinfo(char *filename, struct song_metadata *psong)
 | |
| {
 | |
|     OggOpusFile *opusfile;
 | |
|     const OpusTags *tags;
 | |
|     char **comment;
 | |
|     int *commentlen;
 | |
|     int j, e;
 | |
| 
 | |
| 
 | |
|     opusfile = op_open_file (filename, &e);
 | |
|     if(!opusfile)
 | |
|     {
 | |
|         DPRINTF(E_WARN, L_SCANNER,
 | |
|             "Error opening input file \"%s\": %s\n", filename, opus_strerror(e));
 | |
|         return -1;
 | |
|     }
 | |
| 
 | |
|     DPRINTF(E_MAXDEBUG, L_SCANNER, "Processing file \"%s\"...\n", filename);
 | |
| 
 | |
|     psong->song_length = op_pcm_total (opusfile, -1);
 | |
|     if (psong->song_length < 0)
 | |
|     {
 | |
|         DPRINTF(E_WARN, L_SCANNER,
 | |
|                 "Unable to obtain length of %s\n", filename);
 | |
|         psong->song_length = 0;
 | |
|     } else
 | |
|         /* Sample rate is always 48k, so length in ms is just samples/48 */
 | |
|         psong->song_length /= 48;
 | |
| 
 | |
|     /* Note that this gives only the first link's channel count. */
 | |
|     psong->channels = op_channel_count (opusfile, -1);
 | |
| 
 | |
|     psong->samplerate = 48000;
 | |
|     psong->bitrate = op_bitrate (opusfile, -1);
 | |
| 
 | |
|     tags = op_tags (opusfile, -1);
 | |
| 
 | |
|     if (!tags)
 | |
|     {
 | |
|         DPRINTF(E_WARN, L_SCANNER, "Unable to obtain tags from %s\n",
 | |
|                 filename);
 | |
|         return -1;
 | |
|     }
 | |
| 
 | |
|     comment = tags->user_comments;
 | |
|     commentlen = tags->comment_lengths; 
 | |
| 
 | |
|     for (j = 0; j < tags->comments; j++)
 | |
|         vc_scan (psong, *(comment++), *(commentlen++));
 | |
| 
 | |
|     op_free (opusfile);
 | |
|     return 0;
 | |
| }
 |