12 FileAC3::FileAC3(Asset *asset, File *file)
13 : FileBase(asset, file)
23 int FileAC3::reset_parameters_derived()
30 temp_raw_allocated = 0;
32 compressed_allocated = 0;
35 void FileAC3::get_parameters(BC_WindowBase *parent_window,
37 BC_WindowBase* &format_window,
44 AC3ConfigAudio *window = new AC3ConfigAudio(parent_window, asset);
45 format_window = window;
46 window->create_objects();
52 int FileAC3::check_sig()
54 // Libmpeg3 does this in FileMPEG.
58 int FileAC3::open_file(int rd, int wr)
67 avcodec_register_all();
68 codec = avcodec_find_encoder(CODEC_ID_AC3);
72 "FileAC3::open_file codec not found.\n");
75 codec_context = avcodec_alloc_context();
76 codec_context->bit_rate = asset->ac3_bitrate * 1000;
77 codec_context->sample_rate = asset->sample_rate;
78 codec_context->channels = asset->channels;
79 if(avcodec_open(codec_context, codec))
82 "FileAC3::open_file failed to open codec.\n");
86 if(!(fd = fopen(asset->path, "w")))
88 perror("FileAC3::open_file");
94 if(!(fd = fopen(asset->path, "r")))
96 perror("FileAC3::open_file");
107 int FileAC3::close_file()
111 avcodec_close(codec_context);
128 delete [] temp_compressed;
132 FileBase::close_file();
135 int FileAC3::write_samples(double **buffer, int64_t len)
137 // Convert buffer to encoder format
138 if(temp_raw_size + len > temp_raw_allocated)
140 int new_allocated = temp_raw_size + len;
141 int16_t *new_raw = new int16_t[new_allocated * asset->channels];
146 sizeof(int16_t) * temp_raw_size * asset->channels);
150 temp_raw_allocated = new_allocated;
153 // Allocate compressed data buffer
154 if(temp_raw_allocated * asset->channels * 2 > compressed_allocated)
156 compressed_allocated = temp_raw_allocated * asset->channels * 2;
157 delete [] temp_compressed;
158 temp_compressed = new unsigned char[compressed_allocated];
161 // Append buffer to temp raw
162 int16_t *out_ptr = temp_raw + temp_raw_size * asset->channels;
163 for(int i = 0; i < len; i++)
165 for(int j = 0; j < asset->channels; j++)
167 int sample = (int)(buffer[j][i] * 32767);
168 CLAMP(sample, -32768, 32767);
172 temp_raw_size += len;
174 int frame_size = codec_context->frame_size;
176 int current_sample = 0;
177 for(current_sample = 0;
178 current_sample + frame_size <= temp_raw_size;
179 current_sample += frame_size)
181 int compressed_size = avcodec_encode_audio(
183 temp_compressed + output_size,
184 compressed_allocated - output_size,
185 temp_raw + current_sample * asset->channels);
186 output_size += compressed_size;
191 temp_raw + current_sample * asset->channels,
192 (temp_raw_size - current_sample) * sizeof(int16_t) * asset->channels);
193 temp_raw_size -= current_sample;
195 int bytes_written = fwrite(temp_compressed, 1, output_size, fd);
196 if(bytes_written < output_size)
198 perror("FileAC3::write_samples");
210 AC3ConfigAudio::AC3ConfigAudio(BC_WindowBase *parent_window,
212 : BC_Window(PROGRAM_NAME ": Audio Compression",
213 parent_window->get_abs_cursor_x(1),
214 parent_window->get_abs_cursor_y(1),
216 BC_OKButton::calculate_h() + 100,
218 BC_OKButton::calculate_h() + 100,
223 this->parent_window = parent_window;
227 void AC3ConfigAudio::create_objects()
231 add_tool(new BC_Title(x, y, "Bitrate (kbps):"));
232 AC3ConfigAudioBitrate *bitrate;
234 new AC3ConfigAudioBitrate(this,
237 bitrate->create_objects();
239 add_subwindow(new BC_OKButton(this));
244 int AC3ConfigAudio::close_event()
255 AC3ConfigAudioBitrate::AC3ConfigAudioBitrate(AC3ConfigAudio *gui,
261 AC3ConfigAudioBitrate::bitrate_to_string(gui->string, gui->asset->ac3_bitrate))
266 char* AC3ConfigAudioBitrate::bitrate_to_string(char *string, int bitrate)
268 sprintf(string, "%d", bitrate);
272 void AC3ConfigAudioBitrate::create_objects()
274 add_item(new BC_MenuItem("32"));
275 add_item(new BC_MenuItem("40"));
276 add_item(new BC_MenuItem("48"));
277 add_item(new BC_MenuItem("56"));
278 add_item(new BC_MenuItem("64"));
279 add_item(new BC_MenuItem("80"));
280 add_item(new BC_MenuItem("96"));
281 add_item(new BC_MenuItem("112"));
282 add_item(new BC_MenuItem("128"));
283 add_item(new BC_MenuItem("160"));
284 add_item(new BC_MenuItem("192"));
285 add_item(new BC_MenuItem("224"));
286 add_item(new BC_MenuItem("256"));
287 add_item(new BC_MenuItem("320"));
288 add_item(new BC_MenuItem("384"));
289 add_item(new BC_MenuItem("448"));
290 add_item(new BC_MenuItem("512"));
291 add_item(new BC_MenuItem("576"));
292 add_item(new BC_MenuItem("640"));
295 int AC3ConfigAudioBitrate::handle_event()
297 gui->asset->ac3_bitrate = atol(get_text());