-void KThumb::getAudioThumbs(int channel, double frame, double frameLength, int arrayWidth){
-
- if ((thumbProducer.isRunning () && thumbProducer.isWorking()) || channel == 0) {
- return;
- }
-
- QMap <int, QMap <int, QByteArray> > storeIn;
- //FIXME: Hardcoded!!!
- int m_frequency = 48000;
- int m_channels = channel;
-
- QFile f(m_thumbFile);
- if (f.open( QIODevice::ReadOnly )) {
- QByteArray channelarray = f.readAll();
- f.close();
- if (channelarray.size() != arrayWidth*(frame+frameLength)*m_channels) {
- kDebug()<<"--- BROKEN THUMB FOR: "<<m_url.fileName()<<" ---------------------- "<<endl;
- f.remove();
- return;
- }
- kDebug() << "reading audio thumbs from file";
- for (int z=(int) frame;z<(int) (frame+frameLength);z++) {
- for (int c=0;c< m_channels;c++){
- QByteArray m_array(arrayWidth,'\x00');
- for (int i = 0; i < arrayWidth; i++)
- m_array[i] = channelarray[z*arrayWidth*m_channels + c*arrayWidth + i];
- storeIn[z][c] = m_array;
- }
- }
- emit audioThumbReady(storeIn);
- }
- else {
- if (thumbProducer.isRunning()) return;
- thumbProducer.init(m_url, m_thumbFile, frame, frameLength, m_frequency, m_channels, arrayWidth);
- thumbProducer.start(QThread::LowestPriority );
- }
+void KThumb::getAudioThumbs(int channel, double frame, double frameLength, int arrayWidth)
+{
+ if (channel == 0) {
+ slotAudioThumbOver();
+ return;
+ }
+ if (m_audioThumbProducer.isRunning()) {
+ return;
+ }
+
+ QMap <int, QMap <int, QByteArray> > storeIn;
+ //FIXME: Hardcoded!!!
+ m_frequency = 48000;
+ m_channels = channel;
+
+ QFile f(m_thumbFile);
+ if (f.open(QIODevice::ReadOnly)) {
+ QByteArray channelarray = f.readAll();
+ f.close();
+ if (channelarray.size() != arrayWidth*(frame + frameLength)*m_channels) {
+ kDebug() << "--- BROKEN THUMB FOR: " << m_url.fileName() << " ---------------------- " << endl;
+ f.remove();
+ slotAudioThumbOver();
+ return;
+ }
+
+ kDebug() << "reading audio thumbs from file";
+
+ int h1 = arrayWidth * m_channels;
+ int h2 = (int) frame * h1;
+ int h3;
+ for (int z = (int) frame; z < (int)(frame + frameLength); z++) {
+ h2 += h1;
+ h3 = 0;
+ for (int c = 0; c < m_channels; c++) {
+ h3 += arrayWidth;
+ QByteArray m_array(arrayWidth, '\x00');
+ for (int i = 0; i < arrayWidth; i++)
+ m_array[i] = channelarray[h2 + h3 + i];
+ storeIn[z][c] = m_array;
+ }
+ }
+ emit audioThumbReady(storeIn);
+ slotAudioThumbOver();
+ } else {
+ if (m_audioThumbProducer.isRunning()) return;
+ m_audioThumbFile.setFileName(m_thumbFile);
+ m_frame = frame;
+ m_frameLength = frameLength;
+ m_arrayWidth = arrayWidth;
+ m_audioThumbProducer = QtConcurrent::run(this, &KThumb::slotCreateAudioThumbs);
+ /*m_audioThumbProducer.init(m_url, m_thumbFile, frame, frameLength, m_frequency, m_channels, arrayWidth);
+ m_audioThumbProducer.start(QThread::LowestPriority);*/
+ // kDebug() << "STARTING GENERATE THMB FOR: " <<m_id<<", URL: "<< m_url << " ................................";
+ }
+}
+
+void KThumb::slotCreateAudioThumbs()
+{
+ Mlt::Profile prof((char*) KdenliveSettings::current_profile().toUtf8().data());
+ Mlt::Producer m_producer(prof, m_url.path().toUtf8().data());
+ if (!m_producer.is_valid()) {
+ kDebug() << "++++++++ INVALID CLIP: " << m_url.path();
+ return;
+ }
+ if (!m_audioThumbFile.open(QIODevice::WriteOnly)) {
+ kDebug() << "++++++++ ERROR WRITING TO FILE: " << m_audioThumbFile.fileName();
+ kDebug() << "++++++++ DISABLING AUDIO THUMBS";
+ KdenliveSettings::setAudiothumbnails(false);
+ return;
+ }
+
+ if (KdenliveSettings::normaliseaudiothumbs()) {
+ Mlt::Filter m_convert(prof, "volume");
+ m_convert.set("gain", "normalise");
+ m_producer.attach(m_convert);
+ }
+
+ int last_val = 0;
+ int val = 0;
+ //kDebug() << "for " << m_frame << " " << m_frameLength << " " << m_producer.is_valid();
+ for (int z = (int) m_frame; z < (int)(m_frame + m_frameLength) && m_producer.is_valid(); z++) {
+ if (m_stopAudioThumbs) break;
+ val = (int)((z - m_frame) / (m_frame + m_frameLength) * 100.0);
+ if (last_val != val && val > 1) {
+ m_clipManager->setThumbsProgress(i18n("Creating thumbnail for %1", m_url.fileName()), val);
+ last_val = val;
+ }
+ m_producer.seek(z);
+ Mlt::Frame *mlt_frame = m_producer.get_frame();
+ if (mlt_frame && mlt_frame->is_valid()) {
+ double m_framesPerSecond = mlt_producer_get_fps(m_producer.get_producer());
+ int m_samples = mlt_sample_calculator(m_framesPerSecond, m_frequency, mlt_frame_get_position(mlt_frame->get_frame()));
+ mlt_audio_format m_audioFormat = mlt_audio_pcm;
+ qint16* m_pcm = static_cast<qint16*>(mlt_frame->get_audio(m_audioFormat, m_frequency, m_channels, m_samples));
+
+ for (int c = 0; c < m_channels; c++) {
+ QByteArray m_array;
+ m_array.resize(m_arrayWidth);
+ for (int i = 0; i < m_array.size(); i++) {
+ m_array[i] = ((*(m_pcm + c + i * m_samples / m_array.size())) >> 9) + 127 / 2 ;
+ }
+ m_audioThumbFile.write(m_array);
+
+ }
+ } else {
+ m_audioThumbFile.write(QByteArray(m_arrayWidth, '\x00'));
+ }
+ delete mlt_frame;
+ }
+ m_audioThumbFile.close();
+ if (m_stopAudioThumbs) {
+ m_audioThumbFile.remove();
+ } else {
+ slotAudioThumbOver();
+ }
+}
+
+void KThumb::slotAudioThumbOver()
+{
+ m_clipManager->setThumbsProgress(i18n("Creating thumbnail for %1", m_url.fileName()), -1);
+ m_clipManager->endAudioThumbsGeneration(m_id);
+}
+
+void KThumb::askForAudioThumbs(const QString &id)
+{
+ m_clipManager->askForAudioThumb(id);