/* * Entagged Audio Tag library * Copyright (c) 2003-2005 Raphaƫl Slinckx <raphael@slinckx.net> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package org.jaudiotagger.audio.ogg; import org.jaudiotagger.audio.exceptions.CannotReadException; import org.jaudiotagger.audio.generic.AudioFileReader; import org.jaudiotagger.audio.generic.GenericAudioHeader; import org.jaudiotagger.audio.ogg.util.OggInfoReader; import org.jaudiotagger.audio.ogg.util.OggPageHeader; import org.jaudiotagger.tag.Tag; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.util.logging.Logger; /** * Read Ogg File Tag and Encoding information * <p/> * Only implemented for ogg files containing a vorbis stream with vorbis comments */ public class OggFileReader extends AudioFileReader { // Logger Object public static Logger logger = Logger.getLogger("org.jaudiotagger.audio.ogg"); private OggInfoReader ir; private OggVorbisTagReader vtr; public OggFileReader() { ir = new OggInfoReader(); vtr = new OggVorbisTagReader(); } protected GenericAudioHeader getEncodingInfo(RandomAccessFile raf) throws CannotReadException, IOException { return ir.read(raf); } protected Tag getTag(RandomAccessFile raf) throws CannotReadException, IOException { return vtr.read(raf); } /** * Return count Ogg Page header, count starts from zero * <p/> * count=0; should return PageHeader that contains Vorbis Identification Header * count=1; should return Pageheader that contains VorbisComment and possibly SetupHeader * count>=2; should return PageHeader containing remaining VorbisComment,SetupHeader and/or Audio * * @param raf * @param count * @return * @throws CannotReadException * @throws IOException */ public OggPageHeader readOggPageHeader(RandomAccessFile raf, int count) throws CannotReadException, IOException { OggPageHeader pageHeader = OggPageHeader.read(raf); while (count > 0) { raf.seek(raf.getFilePointer() + pageHeader.getPageLength()); pageHeader = OggPageHeader.read(raf); count--; } return pageHeader; } /** * Summarize all the ogg headers in a file * <p/> * A useful utility function * * @param oggFile * @throws CannotReadException * @throws IOException */ public void summarizeOggPageHeaders(File oggFile) throws CannotReadException, IOException { RandomAccessFile raf = new RandomAccessFile(oggFile, "r"); while (raf.getFilePointer() < raf.length()) { System.out.println("pageHeader starts at absolute file position:" + raf.getFilePointer()); OggPageHeader pageHeader = OggPageHeader.read(raf); System.out.println("pageHeader finishes at absolute file position:" + raf.getFilePointer()); System.out.println(pageHeader + "\n"); raf.seek(raf.getFilePointer() + pageHeader.getPageLength()); } System.out.println("Raf File Pointer at:" + raf.getFilePointer() + "File Size is:" + raf.length()); raf.close(); } /** * Summarizes the first five pages, normally all we are interested in * * @param oggFile * @throws CannotReadException * @throws IOException */ public void shortSummarizeOggPageHeaders(File oggFile) throws CannotReadException, IOException { RandomAccessFile raf = new RandomAccessFile(oggFile, "r"); int i = 0; while (raf.getFilePointer() < raf.length()) { System.out.println("pageHeader starts at absolute file position:" + raf.getFilePointer()); OggPageHeader pageHeader = OggPageHeader.read(raf); System.out.println("pageHeader finishes at absolute file position:" + raf.getFilePointer()); System.out.println(pageHeader + "\n"); raf.seek(raf.getFilePointer() + pageHeader.getPageLength()); i++; if (i >= 5) { break; } } System.out.println("Raf File Pointer at:" + raf.getFilePointer() + "File Size is:" + raf.length()); raf.close(); } }