[soc] libavsequencer [PATCH 06/08] Instrument sample handling public API header file.
-- Best regards, :-) Basty/CDGS (-:
New patch attached removing AVTreeNode stuff and some small updates. -- Best regards, :-) Basty/CDGS (-:
Updated patch. -- Best regards, :-) Basty/CDGS (-:
Sebastian Vater a écrit :
Updated patch.
Hi I have excellent news! libavsequencer now flawlessly integrates into FFmpeg, just check out my latest git. Please do a git pull --rebase, Stefano had problems without using it. Here are the sample.[ch] part of the BSS to review. This version compiles perfectly. -- Best regards, :-) Basty/CDGS (-:
On 08/07/2010 09:56 PM, Sebastian Vater wrote:
Sebastian Vater a écrit :
Updated patch.
Hi I have excellent news!
libavsequencer now flawlessly integrates into FFmpeg, just check out my latest git. Please do a git pull --rebase, Stefano had problems without using it.
Here are the sample.[ch] part of the BSS to review.
This version compiles perfectly.
sample.h_20100807.patch
diff --git a/libavsequencer/sample.h b/libavsequencer/sample.h new file mode 100755 index 0000000..2da365f --- /dev/null +++ b/libavsequencer/sample.h @@ -0,0 +1,302 @@ +/* + * AVSequencer samples management + * Copyright (c) 2010 Sebastian Vater <cdgs.basty@googlemail.com> + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVSEQUENCER_SAMPLE_H +#define AVSEQUENCER_SAMPLE_H + +#include "libavutil/log.h" +#include "libavformat/avformat.h" +#include "libavsequencer/synth.h" + +/** AVSequencerSample->compat_flags bitfield. */ +enum AVSequencerSampleCompatFlags { + AVSEQ_SAMPLE_COMPAT_FLAG_AFFECT_CHANNEL_PAN = 0x01, ///< Sample panning affects channel panning (IT compatibility) + AVSEQ_SAMPLE_COMPAT_FLAG_VOLUME_ONLY = 0x02, ///< If a note without a sample is played, only the sample volume will be left unchanged + AVSEQ_SAMPLE_COMPAT_FLAG_START_TONE_PORTAMENTO = 0x04, ///< If a tone portamento with a note is executed but no note is currently played, the tone portamento will be ignored and start playing the note normally + AVSEQ_SAMPLE_COMPAT_FLAG_PLAY_BEGIN_TONE_PORTA = 0x08, ///< If you change a sample within a tone portamento the sample will be played from beginning +}; + +/** AVSequencerSample->flags bitfield. */ +enum AVSequencerSampleFlags { + AVSEQ_SAMPLE_FLAG_REDIRECT = 0x01, ///< Sample is a redirection (symbolic link) + AVSEQ_SAMPLE_FLAG_LOOP = 0x02, ///< Use normal loop points + AVSEQ_SAMPLE_FLAG_SUSTAIN_LOOP = 0x04, ///< Use sustain loop points + AVSEQ_SAMPLE_FLAG_SAMPLE_PANNING = 0x08, ///< Use sample panning + AVSEQ_SAMPLE_FLAG_SURROUND_PANNING = 0x10, ///< Sample panning is surround panning + AVSEQ_SAMPLE_FLAG_REVERSE = 0x40, ///< Sample will be initially played backwards +}; + +/** AVSequencerSample->repeat_mode bitfield. */ +enum AVSequencerSampleRepMode { + AVSEQ_SAMPLE_REP_MODE_BACKWARDS = 0x01, ///< Use always backward instead of always forward loop + AVSEQ_SAMPLE_REP_MODE_PINGPONG = 0x02, ///< Use ping-pong loop mode, i.e. forward <-> backward +}; + +/** AVSequencerSample->sustain_repeat_mode bitfield. */ +enum AVSequencerSampleSustainRepMode { + AVSEQ_SAMPLE_SUSTAIN_REP_MODE_BACKWARDS = 0x01, ///< Use always backward instead of always forward loop + AVSEQ_SAMPLE_SUSTAIN_REP_MODE_PINGPONG = 0x02, ///< Use ping-pong loop mode, i.e. forward <-> backward +}; + +/** AVSequencerSample->env_usage_flags bitfield. */ +enum AVSequencerSampleEnvUsageFlags { + AVSEQ_SAMPLE_FLAG_USE_AUTO_VIBRATO_ENV = 0x01, ///< Use (reload) auto vibrato envelope + AVSEQ_SAMPLE_FLAG_USE_AUTO_TREMOLO_ENV = 0x02, ///< Use (reload) auto tremolo envelope + AVSEQ_SAMPLE_FLAG_USE_AUTO_PANNOLO_ENV = 0x04, ///< Use (reload) auto pannolo envelope +}; + +/** AVSequencerSample->env_proc_flags bitfield. */ +enum AVSequencerSampleEnvProcFlags { + AVSEQ_SAMPLE_FLAG_PROC_AUTO_VIBRATO_ENV = 0x01, ///< Add first, then get auto vibrato envelope value + AVSEQ_SAMPLE_FLAG_PROC_AUTO_TREMOLO_ENV = 0x02, ///< Add first, then get auto tremolo envelope value + AVSEQ_SAMPLE_FLAG_PROC_AUTO_PANNOLO_ENV = 0x04, ///< Add first, then get auto pannolo envelope value + AVSEQ_SAMPLE_FLAG_PROC_LINEAR_AUTO_VIB = 0x80, ///< Use linear frequency table for auto vibrato +}; + +/** AVSequencerSample->env_retrig_flags bitfield. */ +enum AVSequencerSampleEnvRetrigFlags { + AVSEQ_SAMPLE_FLAG_RETRIG_AUTO_VIBRATO_ENV = 0x01, ///< Not retrigger auto vibrato envelope + AVSEQ_SAMPLE_FLAG_RETRIG_AUTO_TREMOLO_ENV = 0x02, ///< Not retrigger auto tremolo envelope + AVSEQ_SAMPLE_FLAG_RETRIG_AUTO_PANNOLO_ENV = 0x04, ///< Not retrigger auto pannolo envelope +}; + +/** AVSequencerSample->env_random_flags bitfield. */ +enum AVSequencerSampleEnvRandomFlags { + AVSEQ_SAMPLE_FLAG_RANDOM_AUTO_VIBRATO_ENV = 0x01, ///< Randomize auto vibrato envelope + AVSEQ_SAMPLE_FLAG_RANDOM_AUTO_TREMOLO_ENV = 0x02, ///< Randomize auto tremolo envelope + AVSEQ_SAMPLE_FLAG_RANDOM_AUTO_PANNOLO_ENV = 0x04, ///< Randomize auto pannolo envelope +}; + +/** + * Sample structure used by all instruments which are either + * have samples attached or are hybrids. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + */ +typedef struct AVSequencerSample { + /** + * information on struct for av_log + * - set by avseq_alloc_context + */ + const AVClass *av_class; + + /** Metadata information: Original sample file name, sample name, + * artist and comment. */ + AVMetadata *metadata; + + /** AVSequencerSynth pointer to synth sound structure or NULL + if this is neither a synth nor a hybrid. */ + AVSequencerSynth *synth;
+ /** Pointer to raw sample data, must be padded for + perfect perfomance gain when accessing sample data.
? Padded with how many bytes? What do you mean with "perfect performance gain"?
+ This can be NULL in case if this is a MIDI instrument + or a synth sound instead. */ + int16_t *data;
+ /** Number of bytes the raw sample data occupies. 0 for + MIDI instruments and synth sounds. */ + uint32_t size; + + /** Number of samples of the raw sample data or 0 for + MIDI instruments and synth sounds. */ + uint32_t samples; + + /** Sample repeat starting loop point. If looping is enabled, this + will be used as restart point. */ + uint32_t repeat; + + /** Sample repeat length. End loop point is repeat + rep_len. */ + uint32_t rep_len; + + /** Sample repeat count. Some sequencers allow to not only define + an infinite repeat count but specify that more precisely. + In that case, set this to a non zero value indicating the + number of loop counts. */ + uint32_t rep_count; + + /** Sample sustain repeat starting loop point. If sustain looping is + enabled, this will be used as sustain restart point. + Sustain loop is triggered by a note keyoff event. */ + uint32_t sustain_repeat; + + /** Sample sustain repeat length. End sustain loop point is + sustain_repeat + sustain_rep_len. */ + uint32_t sustain_rep_len; + + /** Sample sustain repeat count. Some sequencers allow to not only + define an infinite sustain repeat count but specify that more + precisely. In that case, this has to be set to a non-zero value + indicating the number of sustain loop counts. */ + uint32_t sustain_rep_count; + + /** Sampling rate (frequency) in Hz to play C-4 at which defaults + to 8363 (NTSC base frequency used by 60Hz sequencers). */ + uint32_t rate;
+ /** Lower sample rate limit (the sample can never exceed this + minimum allowed frequency rate during playback). */ + uint32_t rate_min; + + /** Upper sample rate limit (the sample can never exceed this + maximum allowed frequency rate during playback). */ + uint32_t rate_max;
Where is this specified? Again, which code _reads_ this values?
+ /** Initial sample offset to start playback at (usually 0). */ + uint32_t start_offset; + + /** Sample bit depth (currently samples having bit depths from + 1 to 32 are supported, default is 8-bit sample). */ + uint8_t bits_per_sample; + + /** Sample transpose. This is a relative number of half-tones to + be added to the note calculation (defaults to 0). */ + int8_t transpose; + + /** Sample fine-tuning control. This is a relative number in + one of 128th a half-tone for fine sampling rate adjustments + (default is 0 = no fine-tuning). */ + int8_t finetune;
+ /** Compatibility flags for playback. There are rare cases + where sample loop control has to be handled a different + way, or a different policy for no sample specified cases. */ + uint8_t compat_flags; + + /** Sample playback flags. Some sequencers feature + surround panning or allow different types of loop control + differend types of frequency tables which have to be taken + care specially in the internal playback engine. */ + uint8_t flags;
enum? -Vitor
Vitor Sessak a écrit :
On 08/07/2010 09:56 PM, Sebastian Vater wrote:
Sebastian Vater a écrit :
Updated patch.
Hi I have excellent news!
libavsequencer now flawlessly integrates into FFmpeg, just check out my latest git. Please do a git pull --rebase, Stefano had problems without using it.
Here are the sample.[ch] part of the BSS to review.
This version compiles perfectly.
sample.h_20100807.patch
diff --git a/libavsequencer/sample.h b/libavsequencer/sample.h new file mode 100755 index 0000000..2da365f --- /dev/null +++ b/libavsequencer/sample.h @@ -0,0 +1,302 @@ +/* + * AVSequencer samples management + * Copyright (c) 2010 Sebastian Vater <cdgs.basty@googlemail.com> + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVSEQUENCER_SAMPLE_H +#define AVSEQUENCER_SAMPLE_H + +#include "libavutil/log.h" +#include "libavformat/avformat.h" +#include "libavsequencer/synth.h" + +/** AVSequencerSample->compat_flags bitfield. */ +enum AVSequencerSampleCompatFlags { + AVSEQ_SAMPLE_COMPAT_FLAG_AFFECT_CHANNEL_PAN = 0x01, ///< Sample panning affects channel panning (IT compatibility) + AVSEQ_SAMPLE_COMPAT_FLAG_VOLUME_ONLY = 0x02, ///< If a note without a sample is played, only the sample volume will be left unchanged + AVSEQ_SAMPLE_COMPAT_FLAG_START_TONE_PORTAMENTO = 0x04, ///< If a tone portamento with a note is executed but no note is currently played, the tone portamento will be ignored and start playing the note normally + AVSEQ_SAMPLE_COMPAT_FLAG_PLAY_BEGIN_TONE_PORTA = 0x08, ///< If you change a sample within a tone portamento the sample will be played from beginning +}; + +/** AVSequencerSample->flags bitfield. */ +enum AVSequencerSampleFlags { + AVSEQ_SAMPLE_FLAG_REDIRECT = 0x01, ///< Sample is a redirection (symbolic link) + AVSEQ_SAMPLE_FLAG_LOOP = 0x02, ///< Use normal loop points + AVSEQ_SAMPLE_FLAG_SUSTAIN_LOOP = 0x04, ///< Use sustain loop points + AVSEQ_SAMPLE_FLAG_SAMPLE_PANNING = 0x08, ///< Use sample panning + AVSEQ_SAMPLE_FLAG_SURROUND_PANNING = 0x10, ///< Sample panning is surround panning + AVSEQ_SAMPLE_FLAG_REVERSE = 0x40, ///< Sample will be initially played backwards +}; + +/** AVSequencerSample->repeat_mode bitfield. */ +enum AVSequencerSampleRepMode { + AVSEQ_SAMPLE_REP_MODE_BACKWARDS = 0x01, ///< Use always backward instead of always forward loop + AVSEQ_SAMPLE_REP_MODE_PINGPONG = 0x02, ///< Use ping-pong loop mode, i.e. forward <-> backward +}; + +/** AVSequencerSample->sustain_repeat_mode bitfield. */ +enum AVSequencerSampleSustainRepMode { + AVSEQ_SAMPLE_SUSTAIN_REP_MODE_BACKWARDS = 0x01, ///< Use always backward instead of always forward loop + AVSEQ_SAMPLE_SUSTAIN_REP_MODE_PINGPONG = 0x02, ///< Use ping-pong loop mode, i.e. forward <-> backward +}; + +/** AVSequencerSample->env_usage_flags bitfield. */ +enum AVSequencerSampleEnvUsageFlags { + AVSEQ_SAMPLE_FLAG_USE_AUTO_VIBRATO_ENV = 0x01, ///< Use (reload) auto vibrato envelope + AVSEQ_SAMPLE_FLAG_USE_AUTO_TREMOLO_ENV = 0x02, ///< Use (reload) auto tremolo envelope + AVSEQ_SAMPLE_FLAG_USE_AUTO_PANNOLO_ENV = 0x04, ///< Use (reload) auto pannolo envelope +}; + +/** AVSequencerSample->env_proc_flags bitfield. */ +enum AVSequencerSampleEnvProcFlags { + AVSEQ_SAMPLE_FLAG_PROC_AUTO_VIBRATO_ENV = 0x01, ///< Add first, then get auto vibrato envelope value + AVSEQ_SAMPLE_FLAG_PROC_AUTO_TREMOLO_ENV = 0x02, ///< Add first, then get auto tremolo envelope value + AVSEQ_SAMPLE_FLAG_PROC_AUTO_PANNOLO_ENV = 0x04, ///< Add first, then get auto pannolo envelope value + AVSEQ_SAMPLE_FLAG_PROC_LINEAR_AUTO_VIB = 0x80, ///< Use linear frequency table for auto vibrato +}; + +/** AVSequencerSample->env_retrig_flags bitfield. */ +enum AVSequencerSampleEnvRetrigFlags { + AVSEQ_SAMPLE_FLAG_RETRIG_AUTO_VIBRATO_ENV = 0x01, ///< Not retrigger auto vibrato envelope + AVSEQ_SAMPLE_FLAG_RETRIG_AUTO_TREMOLO_ENV = 0x02, ///< Not retrigger auto tremolo envelope + AVSEQ_SAMPLE_FLAG_RETRIG_AUTO_PANNOLO_ENV = 0x04, ///< Not retrigger auto pannolo envelope +}; + +/** AVSequencerSample->env_random_flags bitfield. */ +enum AVSequencerSampleEnvRandomFlags { + AVSEQ_SAMPLE_FLAG_RANDOM_AUTO_VIBRATO_ENV = 0x01, ///< Randomize auto vibrato envelope + AVSEQ_SAMPLE_FLAG_RANDOM_AUTO_TREMOLO_ENV = 0x02, ///< Randomize auto tremolo envelope + AVSEQ_SAMPLE_FLAG_RANDOM_AUTO_PANNOLO_ENV = 0x04, ///< Randomize auto pannolo envelope +}; + +/** + * Sample structure used by all instruments which are either + * have samples attached or are hybrids. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + */ +typedef struct AVSequencerSample { + /** + * information on struct for av_log + * - set by avseq_alloc_context + */ + const AVClass *av_class; + + /** Metadata information: Original sample file name, sample name, + * artist and comment. */ + AVMetadata *metadata; + + /** AVSequencerSynth pointer to synth sound structure or NULL + if this is neither a synth nor a hybrid. */ + AVSequencerSynth *synth;
+ /** Pointer to raw sample data, must be padded for + perfect perfomance gain when accessing sample data.
? Padded with how many bytes? What do you mean with "perfect performance gain"?
As anything else in FFmpeg which is considered to be run by MMX/etc. optimized code. Thought, that would be clear.
+ This can be NULL in case if this is a MIDI instrument + or a synth sound instead. */ + int16_t *data;
+ /** Number of bytes the raw sample data occupies. 0 for + MIDI instruments and synth sounds. */ + uint32_t size; + + /** Number of samples of the raw sample data or 0 for + MIDI instruments and synth sounds. */ + uint32_t samples; + + /** Sample repeat starting loop point. If looping is enabled, this + will be used as restart point. */ + uint32_t repeat; + + /** Sample repeat length. End loop point is repeat + rep_len. */ + uint32_t rep_len; + + /** Sample repeat count. Some sequencers allow to not only define + an infinite repeat count but specify that more precisely. + In that case, set this to a non zero value indicating the + number of loop counts. */ + uint32_t rep_count; + + /** Sample sustain repeat starting loop point. If sustain looping is + enabled, this will be used as sustain restart point. + Sustain loop is triggered by a note keyoff event. */ + uint32_t sustain_repeat; + + /** Sample sustain repeat length. End sustain loop point is + sustain_repeat + sustain_rep_len. */ + uint32_t sustain_rep_len; + + /** Sample sustain repeat count. Some sequencers allow to not only + define an infinite sustain repeat count but specify that more + precisely. In that case, this has to be set to a non-zero value + indicating the number of sustain loop counts. */ + uint32_t sustain_rep_count; + + /** Sampling rate (frequency) in Hz to play C-4 at which defaults + to 8363 (NTSC base frequency used by 60Hz sequencers). */ + uint32_t rate;
+ /** Lower sample rate limit (the sample can never exceed this + minimum allowed frequency rate during playback). */ + uint32_t rate_min; + + /** Upper sample rate limit (the sample can never exceed this + maximum allowed frequency rate during playback). */ + uint32_t rate_max;
Where is this specified? Again, which code _reads_ this values?
Again, user and/or demuxer choosed values. See my details in song.[ch] for this. This is either set by the demuxer and/or by the user if (s)he wishes to restrict these values. Defaults are, anyway, no limits, i.e. full 32-bit range.
+ /** Initial sample offset to start playback at (usually 0). */ + uint32_t start_offset; + + /** Sample bit depth (currently samples having bit depths from + 1 to 32 are supported, default is 8-bit sample). */ + uint8_t bits_per_sample; + + /** Sample transpose. This is a relative number of half-tones to + be added to the note calculation (defaults to 0). */ + int8_t transpose; + + /** Sample fine-tuning control. This is a relative number in + one of 128th a half-tone for fine sampling rate adjustments + (default is 0 = no fine-tuning). */ + int8_t finetune;
+ /** Compatibility flags for playback. There are rare cases + where sample loop control has to be handled a different + way, or a different policy for no sample specified cases. */ + uint8_t compat_flags; + + /** Sample playback flags. Some sequencers feature + surround panning or allow different types of loop control + differend types of frequency tables which have to be taken + care specially in the internal playback engine. */ + uint8_t flags;
enum?
And again, what's meant with enum? -- Best regards, :-) Basty/CDGS (-:
On 08/13/2010 10:43 PM, Sebastian Vater wrote:
Vitor Sessak a écrit :
On 08/07/2010 09:56 PM, Sebastian Vater wrote:
Sebastian Vater a écrit :
Updated patch.
Hi I have excellent news!
libavsequencer now flawlessly integrates into FFmpeg, just check out my latest git. Please do a git pull --rebase, Stefano had problems without using it.
Here are the sample.[ch] part of the BSS to review.
This version compiles perfectly.
sample.h_20100807.patch
diff --git a/libavsequencer/sample.h b/libavsequencer/sample.h new file mode 100755 index 0000000..2da365f --- /dev/null +++ b/libavsequencer/sample.h @@ -0,0 +1,302 @@ +/* + * AVSequencer samples management + * Copyright (c) 2010 Sebastian Vater<cdgs.basty@googlemail.com> + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVSEQUENCER_SAMPLE_H +#define AVSEQUENCER_SAMPLE_H + +#include "libavutil/log.h" +#include "libavformat/avformat.h" +#include "libavsequencer/synth.h" + +/** AVSequencerSample->compat_flags bitfield. */ +enum AVSequencerSampleCompatFlags { + AVSEQ_SAMPLE_COMPAT_FLAG_AFFECT_CHANNEL_PAN = 0x01, ///< Sample panning affects channel panning (IT compatibility) + AVSEQ_SAMPLE_COMPAT_FLAG_VOLUME_ONLY = 0x02, ///< If a note without a sample is played, only the sample volume will be left unchanged + AVSEQ_SAMPLE_COMPAT_FLAG_START_TONE_PORTAMENTO = 0x04, ///< If a tone portamento with a note is executed but no note is currently played, the tone portamento will be ignored and start playing the note normally + AVSEQ_SAMPLE_COMPAT_FLAG_PLAY_BEGIN_TONE_PORTA = 0x08, ///< If you change a sample within a tone portamento the sample will be played from beginning +}; + +/** AVSequencerSample->flags bitfield. */ +enum AVSequencerSampleFlags { + AVSEQ_SAMPLE_FLAG_REDIRECT = 0x01, ///< Sample is a redirection (symbolic link) + AVSEQ_SAMPLE_FLAG_LOOP = 0x02, ///< Use normal loop points + AVSEQ_SAMPLE_FLAG_SUSTAIN_LOOP = 0x04, ///< Use sustain loop points + AVSEQ_SAMPLE_FLAG_SAMPLE_PANNING = 0x08, ///< Use sample panning + AVSEQ_SAMPLE_FLAG_SURROUND_PANNING = 0x10, ///< Sample panning is surround panning + AVSEQ_SAMPLE_FLAG_REVERSE = 0x40, ///< Sample will be initially played backwards +}; + +/** AVSequencerSample->repeat_mode bitfield. */ +enum AVSequencerSampleRepMode { + AVSEQ_SAMPLE_REP_MODE_BACKWARDS = 0x01, ///< Use always backward instead of always forward loop + AVSEQ_SAMPLE_REP_MODE_PINGPONG = 0x02, ///< Use ping-pong loop mode, i.e. forward<-> backward +}; + +/** AVSequencerSample->sustain_repeat_mode bitfield. */ +enum AVSequencerSampleSustainRepMode { + AVSEQ_SAMPLE_SUSTAIN_REP_MODE_BACKWARDS = 0x01, ///< Use always backward instead of always forward loop + AVSEQ_SAMPLE_SUSTAIN_REP_MODE_PINGPONG = 0x02, ///< Use ping-pong loop mode, i.e. forward<-> backward +}; + +/** AVSequencerSample->env_usage_flags bitfield. */ +enum AVSequencerSampleEnvUsageFlags { + AVSEQ_SAMPLE_FLAG_USE_AUTO_VIBRATO_ENV = 0x01, ///< Use (reload) auto vibrato envelope + AVSEQ_SAMPLE_FLAG_USE_AUTO_TREMOLO_ENV = 0x02, ///< Use (reload) auto tremolo envelope + AVSEQ_SAMPLE_FLAG_USE_AUTO_PANNOLO_ENV = 0x04, ///< Use (reload) auto pannolo envelope +}; + +/** AVSequencerSample->env_proc_flags bitfield. */ +enum AVSequencerSampleEnvProcFlags { + AVSEQ_SAMPLE_FLAG_PROC_AUTO_VIBRATO_ENV = 0x01, ///< Add first, then get auto vibrato envelope value + AVSEQ_SAMPLE_FLAG_PROC_AUTO_TREMOLO_ENV = 0x02, ///< Add first, then get auto tremolo envelope value + AVSEQ_SAMPLE_FLAG_PROC_AUTO_PANNOLO_ENV = 0x04, ///< Add first, then get auto pannolo envelope value + AVSEQ_SAMPLE_FLAG_PROC_LINEAR_AUTO_VIB = 0x80, ///< Use linear frequency table for auto vibrato +}; + +/** AVSequencerSample->env_retrig_flags bitfield. */ +enum AVSequencerSampleEnvRetrigFlags { + AVSEQ_SAMPLE_FLAG_RETRIG_AUTO_VIBRATO_ENV = 0x01, ///< Not retrigger auto vibrato envelope + AVSEQ_SAMPLE_FLAG_RETRIG_AUTO_TREMOLO_ENV = 0x02, ///< Not retrigger auto tremolo envelope + AVSEQ_SAMPLE_FLAG_RETRIG_AUTO_PANNOLO_ENV = 0x04, ///< Not retrigger auto pannolo envelope +}; + +/** AVSequencerSample->env_random_flags bitfield. */ +enum AVSequencerSampleEnvRandomFlags { + AVSEQ_SAMPLE_FLAG_RANDOM_AUTO_VIBRATO_ENV = 0x01, ///< Randomize auto vibrato envelope + AVSEQ_SAMPLE_FLAG_RANDOM_AUTO_TREMOLO_ENV = 0x02, ///< Randomize auto tremolo envelope + AVSEQ_SAMPLE_FLAG_RANDOM_AUTO_PANNOLO_ENV = 0x04, ///< Randomize auto pannolo envelope +}; + +/** + * Sample structure used by all instruments which are either + * have samples attached or are hybrids. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + */ +typedef struct AVSequencerSample { + /** + * information on struct for av_log + * - set by avseq_alloc_context + */ + const AVClass *av_class; + + /** Metadata information: Original sample file name, sample name, + * artist and comment. */ + AVMetadata *metadata; + + /** AVSequencerSynth pointer to synth sound structure or NULL + if this is neither a synth nor a hybrid. */ + AVSequencerSynth *synth;
+ /** Pointer to raw sample data, must be padded for + perfect perfomance gain when accessing sample data.
? Padded with how many bytes? What do you mean with "perfect performance gain"?
As anything else in FFmpeg which is considered to be run by MMX/etc. optimized code. Thought, that would be clear.
Just request it to be aligned, should be enough.
+ This can be NULL in case if this is a MIDI instrument + or a synth sound instead. */ + int16_t *data;
+ /** Number of bytes the raw sample data occupies. 0 for + MIDI instruments and synth sounds. */ + uint32_t size; + + /** Number of samples of the raw sample data or 0 for + MIDI instruments and synth sounds. */ + uint32_t samples; + + /** Sample repeat starting loop point. If looping is enabled, this + will be used as restart point. */ + uint32_t repeat; + + /** Sample repeat length. End loop point is repeat + rep_len. */ + uint32_t rep_len; + + /** Sample repeat count. Some sequencers allow to not only define + an infinite repeat count but specify that more precisely. + In that case, set this to a non zero value indicating the + number of loop counts. */ + uint32_t rep_count; + + /** Sample sustain repeat starting loop point. If sustain looping is + enabled, this will be used as sustain restart point. + Sustain loop is triggered by a note keyoff event. */ + uint32_t sustain_repeat; + + /** Sample sustain repeat length. End sustain loop point is + sustain_repeat + sustain_rep_len. */ + uint32_t sustain_rep_len; + + /** Sample sustain repeat count. Some sequencers allow to not only + define an infinite sustain repeat count but specify that more + precisely. In that case, this has to be set to a non-zero value + indicating the number of sustain loop counts. */ + uint32_t sustain_rep_count; + + /** Sampling rate (frequency) in Hz to play C-4 at which defaults + to 8363 (NTSC base frequency used by 60Hz sequencers). */ + uint32_t rate;
+ /** Lower sample rate limit (the sample can never exceed this + minimum allowed frequency rate during playback). */ + uint32_t rate_min; + + /** Upper sample rate limit (the sample can never exceed this + maximum allowed frequency rate during playback). */ + uint32_t rate_max;
Where is this specified? Again, which code _reads_ this values?
Again, user and/or demuxer choosed values. See my details in song.[ch] for this. This is either set by the demuxer and/or by the user if (s)he wishes to restrict these values. Defaults are, anyway, no limits, i.e. full 32-bit range.
Is there any format that specifies such cutoff? -Vitor
Vitor Sessak a écrit :
On 08/13/2010 10:43 PM, Sebastian Vater wrote:
Vitor Sessak a écrit :
On 08/07/2010 09:56 PM, Sebastian Vater wrote:
Sebastian Vater a écrit :
Updated patch.
Hi I have excellent news!
libavsequencer now flawlessly integrates into FFmpeg, just check out my latest git. Please do a git pull --rebase, Stefano had problems without using it.
Here are the sample.[ch] part of the BSS to review.
This version compiles perfectly.
sample.h_20100807.patch
diff --git a/libavsequencer/sample.h b/libavsequencer/sample.h new file mode 100755 index 0000000..2da365f --- /dev/null +++ b/libavsequencer/sample.h @@ -0,0 +1,302 @@ +/* + * AVSequencer samples management + * Copyright (c) 2010 Sebastian Vater<cdgs.basty@googlemail.com> + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVSEQUENCER_SAMPLE_H +#define AVSEQUENCER_SAMPLE_H + +#include "libavutil/log.h" +#include "libavformat/avformat.h" +#include "libavsequencer/synth.h" + +/** AVSequencerSample->compat_flags bitfield. */ +enum AVSequencerSampleCompatFlags { + AVSEQ_SAMPLE_COMPAT_FLAG_AFFECT_CHANNEL_PAN = 0x01, ///< Sample panning affects channel panning (IT compatibility) + AVSEQ_SAMPLE_COMPAT_FLAG_VOLUME_ONLY = 0x02, ///< If a note without a sample is played, only the sample volume will be left unchanged + AVSEQ_SAMPLE_COMPAT_FLAG_START_TONE_PORTAMENTO = 0x04, ///< If a tone portamento with a note is executed but no note is currently played, the tone portamento will be ignored and start playing the note normally + AVSEQ_SAMPLE_COMPAT_FLAG_PLAY_BEGIN_TONE_PORTA = 0x08, ///< If you change a sample within a tone portamento the sample will be played from beginning +}; + +/** AVSequencerSample->flags bitfield. */ +enum AVSequencerSampleFlags { + AVSEQ_SAMPLE_FLAG_REDIRECT = 0x01, ///< Sample is a redirection (symbolic link) + AVSEQ_SAMPLE_FLAG_LOOP = 0x02, ///< Use normal loop points + AVSEQ_SAMPLE_FLAG_SUSTAIN_LOOP = 0x04, ///< Use sustain loop points + AVSEQ_SAMPLE_FLAG_SAMPLE_PANNING = 0x08, ///< Use sample panning + AVSEQ_SAMPLE_FLAG_SURROUND_PANNING = 0x10, ///< Sample panning is surround panning + AVSEQ_SAMPLE_FLAG_REVERSE = 0x40, ///< Sample will be initially played backwards +}; + +/** AVSequencerSample->repeat_mode bitfield. */ +enum AVSequencerSampleRepMode { + AVSEQ_SAMPLE_REP_MODE_BACKWARDS = 0x01, ///< Use always backward instead of always forward loop + AVSEQ_SAMPLE_REP_MODE_PINGPONG = 0x02, ///< Use ping-pong loop mode, i.e. forward<-> backward +}; + +/** AVSequencerSample->sustain_repeat_mode bitfield. */ +enum AVSequencerSampleSustainRepMode { + AVSEQ_SAMPLE_SUSTAIN_REP_MODE_BACKWARDS = 0x01, ///< Use always backward instead of always forward loop + AVSEQ_SAMPLE_SUSTAIN_REP_MODE_PINGPONG = 0x02, ///< Use ping-pong loop mode, i.e. forward<-> backward +}; + +/** AVSequencerSample->env_usage_flags bitfield. */ +enum AVSequencerSampleEnvUsageFlags { + AVSEQ_SAMPLE_FLAG_USE_AUTO_VIBRATO_ENV = 0x01, ///< Use (reload) auto vibrato envelope + AVSEQ_SAMPLE_FLAG_USE_AUTO_TREMOLO_ENV = 0x02, ///< Use (reload) auto tremolo envelope + AVSEQ_SAMPLE_FLAG_USE_AUTO_PANNOLO_ENV = 0x04, ///< Use (reload) auto pannolo envelope +}; + +/** AVSequencerSample->env_proc_flags bitfield. */ +enum AVSequencerSampleEnvProcFlags { + AVSEQ_SAMPLE_FLAG_PROC_AUTO_VIBRATO_ENV = 0x01, ///< Add first, then get auto vibrato envelope value + AVSEQ_SAMPLE_FLAG_PROC_AUTO_TREMOLO_ENV = 0x02, ///< Add first, then get auto tremolo envelope value + AVSEQ_SAMPLE_FLAG_PROC_AUTO_PANNOLO_ENV = 0x04, ///< Add first, then get auto pannolo envelope value + AVSEQ_SAMPLE_FLAG_PROC_LINEAR_AUTO_VIB = 0x80, ///< Use linear frequency table for auto vibrato +}; + +/** AVSequencerSample->env_retrig_flags bitfield. */ +enum AVSequencerSampleEnvRetrigFlags { + AVSEQ_SAMPLE_FLAG_RETRIG_AUTO_VIBRATO_ENV = 0x01, ///< Not retrigger auto vibrato envelope + AVSEQ_SAMPLE_FLAG_RETRIG_AUTO_TREMOLO_ENV = 0x02, ///< Not retrigger auto tremolo envelope + AVSEQ_SAMPLE_FLAG_RETRIG_AUTO_PANNOLO_ENV = 0x04, ///< Not retrigger auto pannolo envelope +}; + +/** AVSequencerSample->env_random_flags bitfield. */ +enum AVSequencerSampleEnvRandomFlags { + AVSEQ_SAMPLE_FLAG_RANDOM_AUTO_VIBRATO_ENV = 0x01, ///< Randomize auto vibrato envelope + AVSEQ_SAMPLE_FLAG_RANDOM_AUTO_TREMOLO_ENV = 0x02, ///< Randomize auto tremolo envelope + AVSEQ_SAMPLE_FLAG_RANDOM_AUTO_PANNOLO_ENV = 0x04, ///< Randomize auto pannolo envelope +}; + +/** + * Sample structure used by all instruments which are either + * have samples attached or are hybrids. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + */ +typedef struct AVSequencerSample { + /** + * information on struct for av_log + * - set by avseq_alloc_context + */ + const AVClass *av_class; + + /** Metadata information: Original sample file name, sample name, + * artist and comment. */ + AVMetadata *metadata; + + /** AVSequencerSynth pointer to synth sound structure or NULL + if this is neither a synth nor a hybrid. */ + AVSequencerSynth *synth;
+ /** Pointer to raw sample data, must be padded for + perfect perfomance gain when accessing sample data.
? Padded with how many bytes? What do you mean with "perfect performance gain"?
As anything else in FFmpeg which is considered to be run by MMX/etc. optimized code. Thought, that would be clear.
Just request it to be aligned, should be enough.
Fixed.
+ This can be NULL in case if this is a MIDI instrument + or a synth sound instead. */ + int16_t *data;
+ /** Number of bytes the raw sample data occupies. 0 for + MIDI instruments and synth sounds. */ + uint32_t size; + + /** Number of samples of the raw sample data or 0 for + MIDI instruments and synth sounds. */ + uint32_t samples; + + /** Sample repeat starting loop point. If looping is enabled, this + will be used as restart point. */ + uint32_t repeat; + + /** Sample repeat length. End loop point is repeat + rep_len. */ + uint32_t rep_len; + + /** Sample repeat count. Some sequencers allow to not only define + an infinite repeat count but specify that more precisely. + In that case, set this to a non zero value indicating the + number of loop counts. */ + uint32_t rep_count; + + /** Sample sustain repeat starting loop point. If sustain looping is + enabled, this will be used as sustain restart point. + Sustain loop is triggered by a note keyoff event. */ + uint32_t sustain_repeat; + + /** Sample sustain repeat length. End sustain loop point is + sustain_repeat + sustain_rep_len. */ + uint32_t sustain_rep_len; + + /** Sample sustain repeat count. Some sequencers allow to not only + define an infinite sustain repeat count but specify that more + precisely. In that case, this has to be set to a non-zero value + indicating the number of sustain loop counts. */ + uint32_t sustain_rep_count; + + /** Sampling rate (frequency) in Hz to play C-4 at which defaults + to 8363 (NTSC base frequency used by 60Hz sequencers). */ + uint32_t rate;
+ /** Lower sample rate limit (the sample can never exceed this + minimum allowed frequency rate during playback). */ + uint32_t rate_min; + + /** Upper sample rate limit (the sample can never exceed this + maximum allowed frequency rate during playback). */ + uint32_t rate_max;
Where is this specified? Again, which code _reads_ this values?
Again, user and/or demuxer choosed values. See my details in song.[ch] for this. This is either set by the demuxer and/or by the user if (s)he wishes to restrict these values. Defaults are, anyway, no limits, i.e. full 32-bit range.
Is there any format that specifies such cutoff?
Original MOD does, and the player reads and enforces these values, this also prevents vibratos and portamentos to go out of control. This is not, however a hard specification in the sense that it's declared in the file format description. It's just that I encountered modules which won't playback correctly when this value is not i.e. set to 28375. -- Best regards, :-) Basty/CDGS (-:
participants (2)
-
Sebastian Vater -
Vitor Sessak