MVH/NAudio-2.2.1/Docs/OffsetSampleProvider.md
2024-06-07 00:47:07 +02:00

58 lines
2.8 KiB
Markdown

# Using OffsetSampleProvider
`OffsetSampleProvider` allows you to extract a sub-section of another `ISampleProvider`. You can skip over the start of the source `ISampleProvider` with `SkipOver` and limit how much audio you play from the source with `Take`. You can also insert leading and trailing silence with `DelayBy` and `LeadOut`.
`Take` is especially useful when working with never-ending `ISampleProvider` sources such as `SignalGenerator`.
Let's look at an example. Here, the `OffsetSampleProvider` uses a `SignalGenerator` as its source. It inserts 1 second of silence before playing for 5 seconds and then inserts 1 extra second of silence at the end:
```c#
// the source ISampleProvider
var sineWave = new SignalGenerator() {
Gain = 0.2,
Frequency = 500,
Type = SignalGeneratorType.Sin};
var trimmed = new OffsetSampleProvider(sineWave) {
DelayBy = TimeSpan.FromSeconds(1),
Take = TimeSpan.FromSeconds(5),
LeadOut = TimeSpan.FromSeconds(1)
};
```
For another example, let's say we have an audio file and we want to skip over the first one minute, and then take a 30 second excerpt and write it to a WAV file:
```c#
var source = new AudioFileReader("example.mp3");
var trimmed = new OffsetSampleProvider(source) {
SkipOver = TimeSpan.FromSeconds(30),
Take = TimeSpan.FromSeconds(60),
WaveFileWriter.CreateWaveFile16(outputFilePath, trimmed);
```
## Skip and Take Extension Methods
NAudio also offers some helpful extension methods to simplify the above task. Skip and Take are extension methods on `ISampleProvider` and create an `OffsetSampleProvider` behind the scenes. So the previous example could be rewritten:
```c#
var trimmed = new AudioFileReader("example.mp3")
.Skip(TimeSpan.FromSeconds(30))
.Take(TimeSpan.FromSeconds(60));
WaveFileWriter.CreateWaveFile16(outputFilePath, trimmed);
```
## Optimizing SkipOver
Note that `SkipOver` is implemented by simply reading that amount of audio from the source and discarding it. Obviously if the source is a file as in this example, it would be more efficient just to position it to the desired starting point:
```c#
var source = new AudioFileReader("example.mp3");
source.CurrentTime = TimeSpan.FromSeconds(30);
var trimmed = source.Take(TimeSpan.FromSeconds(60));
WaveFileWriter.CreateWaveFile16(outputFilePath, trimmed);
```
## Sample Accurate Trimming
As well as the TimeSpan based versions of the `SkipOver`, `DelayBy` `Take` and `LeadOut` properties, there are sample based ones, for when you need accurate control over exactly how many samples of audio to skip and take. These are called `SkipOverSamples`, `DelayBySamples`, `TakeSamples` and `LeadOutSamples`. They're calculated automatically for you when you use the `TimeSpan` based properties, but you can set them directly yourself.