4 * Copyright (C) 2009 Adam Williams <broadcast at earthling dot net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 #include "indexstate.h"
27 #include "indexstate.inc"
33 IndexState::IndexState()
38 IndexState::~IndexState()
40 delete [] index_offsets;
41 delete [] index_sizes;
42 // Don't delete index buffer since it is shared with the index thread.
45 void IndexState::reset()
47 index_status = INDEX_NOTTESTED;
48 index_start = old_index_end = index_end = 0;
57 void IndexState::dump()
59 printf("IndexState::dump this=%p\n", this);
60 printf(" channels=%d index_status=%d index_zoom=" _LD
61 " index_bytes=" _LD " index_offsets=%p\n",
62 channels, index_status, index_zoom,
63 index_bytes, index_offsets);
66 printf(" index_sizes=");
67 for(int i = 0; i < channels; i++)
68 printf(_LD " ", index_sizes[i]);
73 void IndexState::copy_from(IndexState *src)
75 if(this == src) return;
77 delete [] index_offsets;
78 delete [] index_sizes;
82 //printf("Asset::update_index 1 %d\n", index_status);
83 index_status = src->index_status;
84 index_zoom = src->index_zoom; // zoom factor of index data
85 index_start = src->index_start; // byte start of index data in the index file
86 index_bytes = src->index_bytes; // Total bytes in source file for comparison before rebuilding the index
87 index_end = src->index_end;
88 old_index_end = src->old_index_end; // values for index build
89 channels = src->channels;
91 if(src->index_offsets)
93 index_offsets = new int64_t[channels];
94 index_sizes = new int64_t[channels];
97 for(i = 0; i < channels; i++)
99 // offsets of channels in index file in floats
100 index_offsets[i] = src->index_offsets[i];
101 index_sizes[i] = src->index_sizes[i];
106 index_buffer = src->index_buffer;
109 void IndexState::write_xml(FileXML *file)
111 file->tag.set_title("INDEX");
112 file->tag.set_property("ZOOM", index_zoom);
113 file->tag.set_property("BYTES", index_bytes);
115 file->append_newline();
119 for(int i = 0; i < channels; i++)
121 file->tag.set_title("OFFSET");
122 file->tag.set_property("FLOAT", index_offsets[i]);
124 file->tag.set_title("SIZE");
125 file->tag.set_property("FLOAT", index_sizes[i]);
130 file->append_newline();
131 file->tag.set_title("/INDEX");
133 file->append_newline();
136 void IndexState::read_xml(FileXML *file, int channels)
138 this->channels = channels;
140 delete [] index_offsets;
141 delete [] index_sizes;
142 index_offsets = new int64_t[channels];
143 index_sizes = new int64_t[channels];
145 for(int i = 0; i < channels; i++)
147 index_offsets[i] = 0;
151 int current_offset = 0;
152 int current_size = 0;
155 index_zoom = file->tag.get_property("ZOOM", 1);
156 index_bytes = file->tag.get_property("BYTES", (int64_t)0);
160 result = file->read_tag();
163 if(file->tag.title_is("/INDEX"))
168 if(file->tag.title_is("OFFSET"))
170 if(current_offset < channels)
172 index_offsets[current_offset++] = file->tag.get_property("FLOAT", 0);
173 //printf("Asset::read_index %d %d\n", current_offset - 1, index_offsets[current_offset - 1]);
177 if(file->tag.title_is("SIZE"))
179 if(current_size < channels)
181 index_sizes[current_size++] = file->tag.get_property("FLOAT", 0);
188 int IndexState::write_index(const char *path,
191 int64_t length_source)
195 if(!(file = fopen(path, "wb")))
197 // failed to create it
198 printf(_("IndexState::write_index Couldn't write index file %s to disk.\n"),
204 // Pad index start position
205 fwrite((char*)&(index_start), sizeof(int64_t), 1, file);
207 index_status = INDEX_READY;
209 // Write asset encoding information in index file.
210 // This also calls back into index_state to write it.
219 // Must write index_state directly.
223 xml.write_to_file(file);
224 index_start = ftell(file);
225 fseek(file, 0, SEEK_SET);
227 fwrite((char*)&(index_start), sizeof(int64_t), 1, file);
228 fseek(file, index_start, SEEK_SET);
238 // Force reread of header
239 index_status = INDEX_NOTTESTED;
240 index_end = length_source;
246 int64_t IndexState::get_index_offset(int channel)
248 return channel < channels && index_offsets ? index_offsets[channel] : 0;
251 int64_t IndexState::get_index_size(int channel)
253 return channel < channels && index_sizes ? index_sizes[channel] : 0;