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");
}
}