+int Render::getLowestNonMutedAudioTrack(Mlt::Tractor tractor)
+{
+ for (int i = 1; i < tractor.count(); i++) {
+ Mlt::Producer trackProducer(tractor.track(i));
+ if (trackProducer.get_int("hide") < 2) return i;
+ }
+ return tractor.count() - 1;
+}
+
+void Render::fixAudioMixing(Mlt::Tractor tractor)
+{
+ // Make sure the audio mixing transitions are applied to the lowest audible (non muted) track
+ int lowestTrack = getLowestNonMutedAudioTrack(tractor);
+
+ mlt_service serv = m_mltProducer->parent().get_service();
+ Mlt::Field *field = tractor.field();
+ mlt_service_lock(serv);
+ m_isBlocked++;
+
+ mlt_service nextservice = mlt_service_get_producer(serv);
+ mlt_properties properties = MLT_SERVICE_PROPERTIES(nextservice);
+ QString mlt_type = mlt_properties_get(properties, "mlt_type");
+ QString resource = mlt_properties_get(properties, "mlt_service");
+
+ mlt_service nextservicetodisconnect;
+ // Delete all audio mixing transitions
+ while (mlt_type == "transition") {
+ if (resource == "mix") {
+ nextservicetodisconnect = nextservice;
+ nextservice = mlt_service_producer(nextservice);
+ mlt_field_disconnect_service(field->get_field(), nextservicetodisconnect);
+ }
+ else nextservice = mlt_service_producer(nextservice);
+ if (nextservice == NULL) break;
+ properties = MLT_SERVICE_PROPERTIES(nextservice);
+ mlt_type = mlt_properties_get(properties, "mlt_type");
+ resource = mlt_properties_get(properties, "mlt_service");
+ }
+
+ // Re-add correct audio transitions
+ for (int i = lowestTrack + 1; i < tractor.count(); i++) {
+ Mlt::Transition *transition = new Mlt::Transition(*m_mltProfile, "mix");
+ transition->set("always_active", 1);
+ transition->set("combine", 1);
+ transition->set("internal_added", 237);
+ field->plant_transition(*transition, lowestTrack, i);
+ }
+ mlt_service_unlock(serv);
+ m_isBlocked--;
+}