View Single Post
Old 11-30-2014, 10:01 AM   #76
Argitoth
Human being with feelings
 
Argitoth's Avatar
 
Join Date: Feb 2008
Location: Mesa, AZ
Posts: 2,057
Default

Thanks Xenakios! question stream continues...

I'm trying to use audioaccessor

Code:
// audio accessor
double* buffer = new double[samples];
CreateTakeAudioAccessor(take);
GetAudioAccessorSamples(take, samplerate, channels, skipTime, samples, buffer);
DestroyAudioAccessor(take);

but it seems that CreateTakeAudioAccessor does not return an audioaccessor object, and at the same time if I type "AudioAccessor* accessor" the class AudioAccessor does not exist. So I tried

Code:
PCM_source_transfer_t buffer={0,};
buffer.samplerate = source->GetSampleRate();
buffer.nch = source->GetNumChannels();
buffer.length = source->GetLength();
buffer.samples = new ReaSample[buffer.length * buffer.nch];
buffer.time_s = offset;
source->GetSamples(&buffer);
but i just get an error when running the action.

Code:
Unhandled exception at 0x00007FFEA89A38EC (reaper_extension_example.dll) in reaper.exe: 0xC0000005: Access violation reading location 0x000000000044F000.
The error seems to happen when I try to access the samples.
Code:
v = abs(buffer.samples[s]);
here's the full code:
Code:
void ActionTrimSilence()
{
	items = CountSelectedMediaItems(0) ;
  if (!items) return;

	const u_int n_items = 3;
	const char *csv_names = "threshold(dB),threshold(sec),skip first x sec";
	char csv_capture[FNLEN] = "-100,.5,.05";
	if (GetUserInputs("Trim Silence",n_items,csv_names,csv_capture,FNLEN)) {		
		vector<string> Input = split(csv_capture, ',');

		u_int samplerate, channels, numsamps, speederupper, t, s;
		double position, trimSilencePos, length, offset, minAmp, maxTime, skipTime, v;

		sprintf(charbuf,"Removing silence of %i items...", items); ShowConsoleMsg(charbuf);

		for (i = 0; i < items; ++i) {
			// get item info
			item       = GetSelectedMediaItem(0, i);
			position   = GetMediaItemInfo_Value(item, "D_POSITION");
			length     = GetMediaItemInfo_Value(item, "D_LENGTH");      
			offset     = GetMediaItemTakeInfo_Value(take, "D_STARTOFFS");
			take       = GetActiveTake(item);
			source     = GetMediaItemTake_Source(take);
      
			// audio accessor
			//double* buffer = new double[samples];
			//CreateTakeAudioAccessor(take);
		 // GetAudioAccessorSamples(take, samplerate, channels, skipTime, samples, buffer);
			//DestroyAudioAccessor(take);

			// Init local transfer block "t" and sum of squares
			PCM_source_transfer_t buffer={0,};
			buffer.samplerate = source->GetSampleRate();
			buffer.nch = source->GetNumChannels();
			buffer.length = source->GetLength();
			buffer.samples = new ReaSample[buffer.length * buffer.nch];
			buffer.time_s = offset;
			source->GetSamples(&buffer);

			// user values   
			speederupper = 1;
			minAmp       = pow(2,stod(Input[0]))/6; 
			maxTime      = stod(Input[1])*buffer.samplerate/speederupper;
			skipTime     = stod(Input[2]);
			numsamps     = (length-offset-skipTime)*buffer.samplerate*buffer.nch;
			       
			s=0;//sample
			t=0;//time
			v=0;//value
      
			while (s < numsamps) {
				v = abs(buffer.samples[s]);
				if (v < minAmp) t+=1;
				else t=0;
				if (t > maxTime) break;
				s+=speederupper;
			}
			delete[] buffer.samples;

			//trimSilencePos = (s-maxTime)/samplerate+offset
			trimSilencePos = s/samplerate+offset;
			SetMediaItemLength(item, trimSilencePos, 1);
		}
		ShowConsoleMsg("COMPLETE!\n\n");
	}
}
__________________
Soundemote - Home of the chaosfly and pretty oscilloscope.
MyReaperPlugin - Easy-to-use cross-platform C++ REAPER extension template

Last edited by Argitoth; 11-30-2014 at 10:07 AM.
Argitoth is offline