private final void genAudioPreviewClips(final int id) {
		File inputFile = this.getAudioFileSource();
		if (inputFile == null) return;

		final Videncode self = this;
		String filename = (id == PREVIEW_FIRST ? "preview.start" : "preview.end");
		double[] time = this.getAudioFileSourceEncodeDuration();
		Bitrate bitrate = this.getAudioFileTempBitrate();
		AudioChannelCount channelCount = this.getAudioFileTempChannels();
		AudioSampleRate sampleRate = this.getAudioFileTempSampleRate();
		double maxlen = this.getAudioPreviewTempLength();
		double length = time[1] - time[0];
		if (length > maxlen) length = maxlen;
		double start = (id == PREVIEW_FIRST ? time[0] : time[1] - length);

		if (this.audioPreviewTempClipGenerators[id] != null) {
			this.audioPreviewTempClipGenerators[id].cancel();
		}
		if (this.deleteAudioFileTempFilePreview(id)) {
			this.signalChange(new VidencodeChangeEvent(
				this,
				VidencodeChangeEvent.EventType.AUDIO_PREVIEW_CHANGED,
				VidencodeChangeEvent.TEMPORARY | VidencodeChangeEvent.UPDATING | (id == PREVIEW_FIRST ? VidencodeChangeEvent.FIRST : VidencodeChangeEvent.LAST)
			));
		}

		this.audioPreviewTempClipGenerators[id] = new AudioClipGenerator(
			this,
			inputFile,
			filename,
			this.getTempDir(),
			start,
			length,
			bitrate,
			channelCount,
			sampleRate,
			null,
			true,
			this.parseCommandOptions(this.extraFFmpegOptions[1])
		) {
			@Override
			public void onAudioGet(File f, Sound snd) {
				self.onAudioPreviewCompleted(f, snd, id);
			}
		};
		this.audioPreviewTempClipGenerators[id].start();
	}