add generic synthesizer clip option and biquad lpf
[vg.git] / vg_audio.h
index dbc6ff69b425cab9f6cee26d49c751fb0f23523b..38290ff129f95c4ce00658303ef1f75bb9f7a45d 100644 (file)
@@ -61,7 +61,7 @@ enum audio_format
    k_audio_format_none4  = 0xE00u,
 
    k_audio_format_bird   = 0x1000u,
-   k_audio_format_none5  = 0x1200u,
+   k_audio_format_gen    = 0x1200u,
    k_audio_format_none6  = 0x1400u,
    k_audio_format_none7  = 0x1600u,
    k_audio_format_none8  = 0x1800u,
@@ -82,6 +82,7 @@ struct audio_clip{
    union {              /* TODO oof.. */
       u64 _p64_;
       const char *path;
+      void *func;
    };
 
    u32 flags;
@@ -329,8 +330,8 @@ static void vg_audio_free(void)
 #define AUDIO_EDIT_OWNERSHIP      0x40
 #define AUDIO_EDIT_SAMPLING_RATE  0x80
 
-static void audio_channel_init( audio_channel *ch, audio_clip *clip, u32 flags )
-{
+static void audio_channel_init( audio_channel *ch, audio_clip *clip, 
+                                u32 flags ){
    audio_require_lock();
    ch->group = 0;
    ch->world_id = 0;
@@ -340,6 +341,8 @@ static void audio_channel_init( audio_channel *ch, audio_clip *clip, u32 flags )
 
    if( (ch->source->flags & AUDIO_FLAG_FORMAT) == k_audio_format_bird )
       strcpy( ch->name, "[array]" );
+   else if( (ch->source->flags & AUDIO_FLAG_FORMAT) == k_audio_format_gen )
+      strcpy( ch->name, "[program]" );
    else
       vg_strncpy( clip->path, ch->name, 32, k_strncpy_always_add_null );
 
@@ -636,6 +639,9 @@ static int audio_channel_load_source( audio_channel *ch )
    else if( format == k_audio_format_stereo ){
       ch->source_length = ch->source->size / 2;
    }
+   else if( format == k_audio_format_gen ){
+      ch->source_length = 0xffffffff;
+   }
    else{
       ch->source_length = ch->source->size;
    }
@@ -798,6 +804,10 @@ static void audio_channel_get_samples( audio_channel *ch,
       else if( format == k_audio_format_bird ){
          synth_bird_generate_samples( ch->bird_handle, dst, samples_this_run );
       }
+      else if( format == k_audio_format_gen ){
+         void (*fn)( void *data, f32 *buf, u32 count ) = ch->source->func;
+         fn( ch->source->data, dst, samples_this_run );
+      }
       else{
          i16 *src_buffer = ch->source->data,
              *src        = &src_buffer[ch->cursor];