On 07/11/2010 10:07 PM, Sebastian Vater wrote:
Updated patch for instrument.h.

/*
 * AVSequencer instrument management
 * Copyright (c) 2010 Sebastian Vater <[email protected]>
 *
 * 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_INSTR_H
#define AVSEQUENCER_INSTR_H

#include "libavformat/avformat.h"
#include "libavsequencer/sample.h"

/**
 * Envelope structure used by instruments to apply volume / panning
 * or pitch manipulation according to an user defined waveform.
 * 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 AVSequencerEnvelope {

Why not just

typedef struct {

?

    /** The actual node data of this envelope as signed 16-bit integer.

The comment is cryptic for someone who doesn't know what the node data of the envelope might be.

       For a volume envelope, we have a default scale range of -32767
       to +32767, for panning envelopes the scale range is between -8191
       to +8191. For slide, vibrato, tremolo, pannolo (and their auto
       versions), the scale range is between -256 to +256.  */
    int16_t *data;
#define AVSEQ_ENVELOPE_SCALE_MAX        0x7FFF
#define AVSEQ_ENVELOPE_SCALE_INVALID    ((FF_AVSEQ_ENVELOPE_SCALE_MAX) + 1)
#define AVSEQ_ENVELOPE_VOLUME_SCALE     0x7FFF
#define AVSEQ_ENVELOPE_PANNING_SCALE    0x1FFF
#define AVSEQ_ENVELOPE_SLIDE_SCALE      0x0100
#define AVSEQ_ENVELOPE_VIBRATO_SCALE    0x0100
#define AVSEQ_ENVELOPE_VIBRATO_SCALE    0x0100

    /** The node points values or 0 if the envelope is empty.  */
    uint16_t *node_points;

    /** Number of dragable nodes of this envelope (defaults to 12).  */
    uint16_t nodes;
#define AVSEQ_ENVELOPE_NODES    12

    /** Number of envelope points, i.e. node data values which
       defaults to 64.  */
    uint16_t points;
#define AVSEQ_ENVELOPE_POINTS   64

    /** Instrument envelope flags. Some sequencers feature
       loop points of various kinds, which have to be taken
       care specially in the internal playback engine.  */
    uint16_t flags;
#define AVSEQ_ENVELOPE_LOOP             0x0001 ///< Envelope uses loop nodes
#define AVSEQ_ENVELOPE_SUSTAIN          0x0002 ///< Envelope uses sustain nodes
#define AVSEQ_ENVELOPE_PINGPONG         0x0004 ///< Envelope loop is in ping 
pong mode
#define AVSEQ_ENVELOPE_SUSTAIN_PINGPONG 0x0008 ///< Envelope sustain loop is in 
ping pong mode

    /** Envelope tempo in ticks (defaults to 1, i.e. change envelope
       at every frame / tick).  */
    uint16_t tempo;
#define AVSEQ_ENVELOPE_TEMPO    1

    /** Envelope sustain loop start point.  */
    uint16_t sustain_start;

    /** Envelope sustain loop end point.  */
    uint16_t sustain_end;

    /** Envelope sustain loop repeat counter for loop range.  */
    uint16_t sustain_count;

    /** Envelope loop repeat start point.  */
    uint16_t loop_start;

    /** Envelope loop repeat end point.  */
    uint16_t loop_end;

    /** Envelope loop repeat counter for loop range.  */
    uint16_t loop_count;

    /** Randomized lowest value allowed.  */
    int16_t value_min;

    /** Randomized highest value allowed.  */
    int16_t value_max;

    /** Array of pointers containing every unknown data field where
       the last element is indicated by a NULL pointer reference. The
       first 64-bit of the unknown data contains an unique identifier
       for this chunk and the second 64-bit data is actual unsigned
       length of the following raw data. Some formats are chunk based
       and can store information, which can't be handled by some
       other, in case of a transition the unknown data is kept as is.
       Some programs write editor settings for envelopes in those
       chunks, which then won't get lost in that case.  */
    uint8_t **unknown_data;
} AVSequencerEnvelope;

/**
 * Keyboard definitions structure used by instruments to map
 * note to samples. C-0 is first key. B-9 is 120th key.
 * 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 AVSequencerKeyboard {
    struct AVSequencerKeyboardEntry {
        /** Sample number for this keyboard note.  */
        uint16_t sample;

        /** Octave value for this keyboard note.  */
        uint8_t octave;

        /** Note value for this keyboard note.  */
        uint8_t note;
    } key[120];
} AVSequencerKeyboard;

/**
 * Arpeggio data structure, This structure is actually for one tick
 * and therefore actually pointed as an array with the amount of
 * different ticks handled by the arpeggio control.
 * 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 AVSequencerArpeggioData {
    /** Packed note or 0 if this is an arpeggio note.  */
    uint8_t tone;

    /** Transpose for this arpeggio tick.  */
    int8_t transpose;

    /** Instrument number to switch to or 0 for original instrument.  */
    uint16_t instrument;

    /** The four effect command bytes which are executed.  */
    uint8_t command[4];

    /** The four data word values of the four effect command bytes.  */
    uint16_t data[4];
} AVSequencerArpeggioData;

/**
 * Arpeggio control envelope used by all instrumental stuff.
 * 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 AVSequencerArpeggio {
    /** AVSequencerArpeggioData pointer to arpeggio data structure.  */
    AVSequencerArpeggioData *data;

    /** Instrument arpeggio control flags. Some sequencers feature
       customized arpeggio command control.which have to be taken
       care specially in the internal playback engine.  */
    uint16_t flags;
#define AVSEQ_ARPEGGIO_FLAG_LOOP                0x0001   ///< Arpeggio control 
is looped
#define AVSEQ_ARPEGGIO_FLAG_SUSTAIN             0x0002   ///< Arpeggio control 
has a sustain loop
#define AVSEQ_ARPEGGIO_FLAG_PINGPONG            0x0004   ///< Arpeggio control 
will be looped in ping pong mpde
#define AVSEQ_ARPEGGIO_FLAG_SUSTAIN_PINGPONG    0x0008   ///< Arpeggio control 
will have sustain loop ping pong mode enabled

    /** Number of arpeggio ticks handled by this arpeggio control
       (defaults to 3 points as in normal arpeggio command).  */
    uint16_t entries;
#define AVSEQ_ARPEGGIO_FLAG_ENTRIES 3

    /** Sustain loop start tick of arpeggio control.  */
    uint16_t sustain_start;

    /** Sustain loop end tick of arpeggio control.  */
    uint16_t sustain_end;

    /** Sustain loop count number of how often to repeat loop
       of arpeggio control.  */
    uint16_t sustain_count;

    /** Loop start tick of arpeggio control.  */
    uint16_t loop_start;

    /** Loop end tick of arpeggio control.  */
    uint16_t loop_end;

    /** Loop count number of how often to repeat loop of arpeggio
       control.  */
    uint16_t loop_count;

This look repeated frequently. Why not a struct for loops?

-Vitor
_______________________________________________
FFmpeg-soc mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/ffmpeg-soc

Reply via email to