diff options
author | Michiel Van Der Kolk <not.valid@email.address> | 2005-07-11 15:42:37 +0000 |
---|---|---|
committer | Michiel Van Der Kolk <not.valid@email.address> | 2005-07-11 15:42:37 +0000 |
commit | 9fee0ec4ca0c5b7a334cc29dbb58e76c7a4c736e (patch) | |
tree | 4c304cd4151020bd5494d279ee68a105ae3a5a3a /songdbj/de/jarnbjo/ogg/LogicalOggStreamImpl.java | |
parent | dfa8ecbe609ca8ea194d08560a44fb9a92e94b4b (diff) | |
download | rockbox-9fee0ec4ca0c5b7a334cc29dbb58e76c7a4c736e.tar.gz rockbox-9fee0ec4ca0c5b7a334cc29dbb58e76c7a4c736e.zip |
Songdb java version, source. only 1.5 compatible
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7101 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'songdbj/de/jarnbjo/ogg/LogicalOggStreamImpl.java')
-rw-r--r-- | songdbj/de/jarnbjo/ogg/LogicalOggStreamImpl.java | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/songdbj/de/jarnbjo/ogg/LogicalOggStreamImpl.java b/songdbj/de/jarnbjo/ogg/LogicalOggStreamImpl.java new file mode 100644 index 0000000000..1a503e91ca --- /dev/null +++ b/songdbj/de/jarnbjo/ogg/LogicalOggStreamImpl.java | |||
@@ -0,0 +1,213 @@ | |||
1 | /* | ||
2 | * $ProjectName$ | ||
3 | * $ProjectRevision$ | ||
4 | * ----------------------------------------------------------- | ||
5 | * $Id$ | ||
6 | * ----------------------------------------------------------- | ||
7 | * | ||
8 | * $Author$ | ||
9 | * | ||
10 | * Description: | ||
11 | * | ||
12 | * Copyright 2002-2003 Tor-Einar Jarnbjo | ||
13 | * ----------------------------------------------------------- | ||
14 | * | ||
15 | * Change History | ||
16 | * ----------------------------------------------------------- | ||
17 | * $Log$ | ||
18 | * Revision 1.1 2005/07/11 15:42:36 hcl | ||
19 | * Songdb java version, source. only 1.5 compatible | ||
20 | * | ||
21 | * Revision 1.1.1.1 2004/04/04 22:09:12 shred | ||
22 | * First Import | ||
23 | * | ||
24 | * Revision 1.3 2003/03/31 00:23:04 jarnbjo | ||
25 | * no message | ||
26 | * | ||
27 | * Revision 1.2 2003/03/16 01:11:26 jarnbjo | ||
28 | * no message | ||
29 | * | ||
30 | * Revision 1.1 2003/03/03 21:02:20 jarnbjo | ||
31 | * no message | ||
32 | * | ||
33 | */ | ||
34 | |||
35 | package de.jarnbjo.ogg; | ||
36 | |||
37 | import java.io.*; | ||
38 | import java.util.*; | ||
39 | |||
40 | public class LogicalOggStreamImpl implements LogicalOggStream { | ||
41 | |||
42 | private PhysicalOggStream source; | ||
43 | private int serialNumber; | ||
44 | |||
45 | private ArrayList pageNumberMapping=new ArrayList(); | ||
46 | private ArrayList granulePositions=new ArrayList(); | ||
47 | |||
48 | private int pageIndex=0; | ||
49 | private OggPage currentPage; | ||
50 | private int currentSegmentIndex; | ||
51 | |||
52 | private boolean open=true; | ||
53 | |||
54 | private String format=FORMAT_UNKNOWN; | ||
55 | |||
56 | public LogicalOggStreamImpl(PhysicalOggStream source, int serialNumber) { | ||
57 | this.source=source; | ||
58 | this.serialNumber=serialNumber; | ||
59 | } | ||
60 | |||
61 | public void addPageNumberMapping(int physicalPageNumber) { | ||
62 | pageNumberMapping.add(new Integer(physicalPageNumber)); | ||
63 | } | ||
64 | |||
65 | public void addGranulePosition(long granulePosition) { | ||
66 | granulePositions.add(new Long(granulePosition)); | ||
67 | } | ||
68 | |||
69 | public synchronized void reset() throws OggFormatException, IOException { | ||
70 | currentPage=null; | ||
71 | currentSegmentIndex=0; | ||
72 | pageIndex=0; | ||
73 | } | ||
74 | |||
75 | public synchronized OggPage getNextOggPage() throws EndOfOggStreamException, OggFormatException, IOException { | ||
76 | if(source.isSeekable()) { | ||
77 | currentPage=source.getOggPage(((Integer)pageNumberMapping.get(pageIndex++)).intValue()); | ||
78 | } | ||
79 | else { | ||
80 | currentPage=source.getOggPage(-1); | ||
81 | } | ||
82 | return currentPage; | ||
83 | } | ||
84 | |||
85 | public synchronized byte[] getNextOggPacket() throws EndOfOggStreamException, OggFormatException, IOException { | ||
86 | ByteArrayOutputStream res=new ByteArrayOutputStream(); | ||
87 | int segmentLength=0; | ||
88 | |||
89 | if(currentPage==null) { | ||
90 | currentPage=getNextOggPage(); | ||
91 | } | ||
92 | |||
93 | do { | ||
94 | if(currentSegmentIndex>=currentPage.getSegmentOffsets().length) { | ||
95 | currentSegmentIndex=0; | ||
96 | |||
97 | if(!currentPage.isEos()) { | ||
98 | if(source.isSeekable() && pageNumberMapping.size()<=pageIndex) { | ||
99 | while(pageNumberMapping.size()<=pageIndex+10) { | ||
100 | try { | ||
101 | Thread.sleep(1000); | ||
102 | } | ||
103 | catch (InterruptedException ex) { | ||
104 | } | ||
105 | } | ||
106 | } | ||
107 | currentPage=getNextOggPage(); | ||
108 | |||
109 | if(res.size()==0 && currentPage.isContinued()) { | ||
110 | boolean done=false; | ||
111 | while(!done) { | ||
112 | if(currentPage.getSegmentLengths()[currentSegmentIndex++]!=255) { | ||
113 | done=true; | ||
114 | } | ||
115 | if(currentSegmentIndex>currentPage.getSegmentTable().length) { | ||
116 | currentPage=source.getOggPage(((Integer)pageNumberMapping.get(pageIndex++)).intValue()); | ||
117 | } | ||
118 | } | ||
119 | } | ||
120 | } | ||
121 | else { | ||
122 | throw new EndOfOggStreamException(); | ||
123 | } | ||
124 | } | ||
125 | segmentLength=currentPage.getSegmentLengths()[currentSegmentIndex]; | ||
126 | res.write(currentPage.getData(), currentPage.getSegmentOffsets()[currentSegmentIndex], segmentLength); | ||
127 | currentSegmentIndex++; | ||
128 | } while(segmentLength==255); | ||
129 | |||
130 | return res.toByteArray(); | ||
131 | } | ||
132 | |||
133 | public boolean isOpen() { | ||
134 | return open; | ||
135 | } | ||
136 | |||
137 | public void close() throws IOException { | ||
138 | open=false; | ||
139 | } | ||
140 | |||
141 | public long getMaximumGranulePosition() { | ||
142 | Long mgp=(Long)granulePositions.get(granulePositions.size()-1); | ||
143 | return mgp.longValue(); | ||
144 | } | ||
145 | |||
146 | public synchronized long getTime() { | ||
147 | return currentPage!=null?currentPage.getAbsoluteGranulePosition():-1; | ||
148 | } | ||
149 | |||
150 | public synchronized void setTime(long granulePosition) throws IOException { | ||
151 | |||
152 | int page=0; | ||
153 | for(page=0; page<granulePositions.size(); page++) { | ||
154 | Long gp=(Long)granulePositions.get(page); | ||
155 | if(gp.longValue()>granulePosition) { | ||
156 | break; | ||
157 | } | ||
158 | } | ||
159 | |||
160 | pageIndex=page; | ||
161 | currentPage=source.getOggPage(((Integer)pageNumberMapping.get(pageIndex++)).intValue()); | ||
162 | currentSegmentIndex=0; | ||
163 | int segmentLength=0; | ||
164 | do { | ||
165 | if(currentSegmentIndex>=currentPage.getSegmentOffsets().length) { | ||
166 | currentSegmentIndex=0; | ||
167 | if(pageIndex>=pageNumberMapping.size()) { | ||
168 | throw new EndOfOggStreamException(); | ||
169 | } | ||
170 | currentPage=source.getOggPage(((Integer)pageNumberMapping.get(pageIndex++)).intValue()); | ||
171 | } | ||
172 | segmentLength=currentPage.getSegmentLengths()[currentSegmentIndex]; | ||
173 | currentSegmentIndex++; | ||
174 | } while(segmentLength==255); | ||
175 | } | ||
176 | |||
177 | public void checkFormat(OggPage page) { | ||
178 | byte[] data=page.getData(); | ||
179 | |||
180 | if(data.length>=7 && | ||
181 | data[1]==0x76 && | ||
182 | data[2]==0x6f && | ||
183 | data[3]==0x72 && | ||
184 | data[4]==0x62 && | ||
185 | data[5]==0x69 && | ||
186 | data[6]==0x73) { | ||
187 | |||
188 | format=FORMAT_VORBIS; | ||
189 | } | ||
190 | else if(data.length>=7 && | ||
191 | data[1]==0x74 && | ||
192 | data[2]==0x68 && | ||
193 | data[3]==0x65 && | ||
194 | data[4]==0x6f && | ||
195 | data[5]==0x72 && | ||
196 | data[6]==0x61) { | ||
197 | |||
198 | format=FORMAT_THEORA; | ||
199 | } | ||
200 | else if (data.length==4 && | ||
201 | data[0]==0x66 && | ||
202 | data[1]==0x4c && | ||
203 | data[2]==0x61 && | ||
204 | data[3]==0x43) { | ||
205 | |||
206 | format=FORMAT_FLAC; | ||
207 | } | ||
208 | } | ||
209 | |||
210 | public String getFormat() { | ||
211 | return format; | ||
212 | } | ||
213 | } \ No newline at end of file | ||