void RMSNormalizeAll(double dTargetDb, double dWindowSize) { WDL_TypedBuf<MediaItem*> items; SWS_GetSelectedMediaItems(&items); double dMaxRMS = -DBL_MAX; ANALYZE_PCM a; memset(&a, 0, sizeof(a)); a.dWindowSize = dWindowSize; for (int i = 0; i < items.GetSize(); i++) { MediaItem* mi = items.Get()[i]; MediaItem_Take* take = GetMediaItemTake(mi, -1); if (take && AnalyzeItem(mi, &a) && a.dRMS != 0.0 && a.dRMS > dMaxRMS) dMaxRMS = a.dRMS; } if (dMaxRMS > -DBL_MAX) { for (int i = 0; i < items.GetSize(); i++) { MediaItem* mi = items.Get()[i]; MediaItem_Take* take = GetMediaItemTake(mi, -1); if (take) { double dVol = *(double*)GetSetMediaItemTakeInfo(take, "D_VOL", NULL); dVol *= DB2VAL(dTargetDb) / dMaxRMS; GetSetMediaItemTakeInfo(take, "D_VOL", &dVol); } } UpdateTimeline(); Undo_OnStateChangeEx(__LOCALIZE("Normalize items to RMS","sws_undo"), UNDO_STATE_ITEMS, -1); } }
void RegionsFromItems(COMMAND_T* ct) { // Ignore the fact that the user may have items selected with the exact same times. Just blindly create regions! WDL_TypedBuf<MediaItem*> items; SWS_GetSelectedMediaItems(&items); bool bUndo = false; for (int i = 0; i < items.GetSize(); i++) { MediaItem_Take* take = GetActiveTake(items.Get()[i]); if (take) { char* cName = (char*)GetSetMediaItemTakeInfo(take, "P_NAME", NULL); double dStart = *(double*)GetSetMediaItemInfo(items.Get()[i], "D_POSITION", NULL); double dEnd = *(double*)GetSetMediaItemInfo(items.Get()[i], "D_LENGTH", NULL) + dStart; AddProjectMarker(NULL, true, dStart, dEnd, cName, -1); bUndo = true; } else if (!CountTakes(items.Get()[i])) /* In case of an empty item there is no take so process item instead */ { double dStart = *(double*)GetSetMediaItemInfo(items.Get()[i], "D_POSITION", NULL); double dEnd = *(double*)GetSetMediaItemInfo(items.Get()[i], "D_LENGTH", NULL) + dStart; AddProjectMarker(NULL, true, dStart, dEnd, NULL, -1); bUndo = true; } } if (bUndo) { UpdateTimeline(); Undo_OnStateChangeEx(SWS_CMD_SHORTNAME(ct), UNDO_STATE_MISCCFG, -1); } }
void DoAnalyzeItem(COMMAND_T*) { WDL_TypedBuf<MediaItem*> items; SWS_GetSelectedMediaItems(&items); bool bDidWork = false; for (int i = 0; i < items.GetSize(); i++) { MediaItem* mi = items.Get()[i]; int iChannels = ((PCM_source*)mi)->GetNumChannels(); if (iChannels) { bDidWork = true; ANALYZE_PCM a; memset(&a, 0, sizeof(a)); a.iChannels = iChannels; a.dPeakVals = new double[iChannels]; a.dRMSs = new double[iChannels]; if (AnalyzeItem(mi, &a)) { WDL_String str; str.Set(__LOCALIZE("Peak level:","sws_analysis")); for (int i = 0; i < iChannels; i++) { str.Append(" "); str.AppendFormatted(50, __LOCALIZE_VERFMT("Channel %d = %.2f dB","sws_analysis"), i+1, VAL2DB(a.dPeakVals[i])); } str.Append("\n"); str.Append(__LOCALIZE("RMS level:","sws_analysis")); for (int i = 0; i < iChannels; i++) { str.Append(" "); str.AppendFormatted(50, __LOCALIZE_VERFMT("Channel %d = %.2f dB","sws_analysis"), i+1, VAL2DB(a.dRMSs[i])); } MessageBox(g_hwndParent, str.Get(), __LOCALIZE("Item analysis","sws_analysis"), MB_OK); } delete [] a.dPeakVals; delete [] a.dRMSs; } } if (!bDidWork) { MessageBox(NULL, __LOCALIZE("No items selected to analyze.","sws_analysis"), __LOCALIZE("SWS - Error","sws_analysis"), MB_OK); return; } }