GeglAudioFragment: add defaults to construction

parent 4348db94
......@@ -1032,7 +1032,7 @@ static void gegl_ui (Mrg *mrg, void *data)
gegl_node_get (o->load, "audio", &audio, "frame-rate", &fps, NULL);
if (audio)
{
if (audio->samples > 0)
if (audio->xsample_count > 0)
{
int i;
if (!audio_started)
......@@ -1041,7 +1041,7 @@ static void gegl_ui (Mrg *mrg, void *data)
SDL_PauseAudio(0);
audio_started = 1;
}
for (i = 0; i < audio->samples; i++)
for (i = 0; i < audio->xsample_count; i++)
{
sdl_add_audio_sample (0, audio->data[0][i], audio->data[1][i]);
}
......
......@@ -280,7 +280,7 @@ main (gint argc,
gegl_node_get (load, "audio", &audio,
"frame-rate", &fps, NULL);
if (audio->samples > 0)
if (audio->xsample_count > 0)
{
int i;
if (!audio_started)
......@@ -288,7 +288,7 @@ main (gint argc,
SDL_PauseAudio(0);
audio_started = 1;
}
for (i = 0; i < audio->samples; i++)
for (i = 0; i < audio->xsample_count; i++)
{
audio_data[audio_len/2 + 0] = audio->data[0][i] * 32767.0;
audio_data[audio_len/2 + 1] = audio->data[1][i] * 32767.0;
......@@ -362,11 +362,11 @@ gegl_meta_set_audio (const char *path,
if (gexiv2_metadata_has_tag (e2m, "Xmp.xmp.GEGL"))
gexiv2_metadata_clear_tag (e2m, "Xmp.xmp.GEGL");
g_string_append_printf (str, "%i %i %i %i", audio->sample_rate, audio->channels,
audio->channel_layout, audio->samples);
g_string_append_printf (str, "%i %i %i %i", audio->sample_rate, audio->xchannels,
audio->xchannel_layout, audio->xsample_count);
for (i = 0; i < audio->samples; i++)
for (c = 0; c < audio->channels; c++)
for (i = 0; i < audio->xsample_count; i++)
for (c = 0; c < audio->xchannels; c++)
g_string_append_printf (str, " %0.5f", audio->data[c][i]);
gexiv2_metadata_set_tag_string (e2m, "Xmp.xmp.GeglAudio", str->str);
......
......@@ -695,7 +695,7 @@ gegl_op_constructor (GType type,
#define property_curve(name, label, def_val)
#define property_audio_fragment(name, label, def_val)\
if (properties->name == NULL) \
{properties->name = gegl_audio_fragment_new();}
{properties->name = gegl_audio_fragment_new(48000, 2, 0, 8192);}
#define property_color(name, label, def_val)\
if (properties->name == NULL) \
{properties->name = gegl_color_new(def_val?def_val:"black");}
......
......@@ -48,6 +48,7 @@ static void
gegl_audio_fragment_init (GeglAudioFragment *self)
{
self->priv = G_TYPE_INSTANCE_GET_PRIVATE ((self), GEGL_TYPE_AUDIO_FRAGMENT, GeglAudioFragmentPrivate);
self->max_samples = GEGL_MAX_AUDIO_SAMPLES;
}
static void
......@@ -101,20 +102,21 @@ get_property (GObject *gobject,
}
GeglAudioFragment *
gegl_audio_fragment_new (void)
gegl_audio_fragment_new (int sample_rate, int channels, int channel_layout, int max_samples)
{
void *string = NULL;
if (string)
return g_object_new (GEGL_TYPE_AUDIO_FRAGMENT, "string", string, NULL);
return g_object_new (GEGL_TYPE_AUDIO_FRAGMENT, NULL);
GeglAudioFragment *ret = g_object_new (GEGL_TYPE_AUDIO_FRAGMENT, NULL);
gegl_audio_fragment_set_max_samples (ret, max_samples);
gegl_audio_fragment_set_sample_rate (ret, sample_rate);
gegl_audio_fragment_set_channels (ret, channels);
gegl_audio_fragment_set_channel_layout (ret, channel_layout);
return ret;
}
void
gegl_audio_fragment_set_max_samples (GeglAudioFragment *audio,
int max_samples)
{
// still a define
audio->max_samples = max_samples;
}
void
......@@ -128,21 +130,21 @@ void
gegl_audio_fragment_set_channels (GeglAudioFragment *audio,
int channels)
{
audio->channels = channels;
audio->xchannels = channels;
}
void
gegl_audio_fragment_set_channel_layput (GeglAudioFragment *audio,
gegl_audio_fragment_set_channel_layout (GeglAudioFragment *audio,
int channel_layout)
{
audio->channel_layout = channel_layout;
audio->xchannel_layout = channel_layout;
}
void
gegl_audio_fragment_set_samples (GeglAudioFragment *audio,
int samples)
gegl_audio_fragment_set_sample_count (GeglAudioFragment *audio,
int samples)
{
audio->samples = samples;
audio->xsample_count = samples;
}
void
......@@ -155,7 +157,7 @@ gegl_audio_fragment_set_pos (GeglAudioFragment *audio,
int
gegl_audio_fragment_get_max_samples (GeglAudioFragment *audio)
{
return GEGL_MAX_AUDIO_SAMPLES;
return audio->max_samples;
}
......@@ -168,13 +170,13 @@ gegl_audio_fragment_get_sample_rate (GeglAudioFragment *audio)
int
gegl_audio_fragment_get_channels (GeglAudioFragment *audio)
{
return audio->channels;
return audio->xchannels;
}
int
gegl_audio_fragment_get_samples (GeglAudioFragment *audio)
gegl_audio_fragment_get_sample_count (GeglAudioFragment *audio)
{
return audio->samples;
return audio->xsample_count;
}
int
......@@ -184,9 +186,9 @@ gegl_audio_fragment_get_pos (GeglAudioFragment *audio)
}
int
gegl_audio_fragment_get_channel_layput (GeglAudioFragment *audio)
gegl_audio_fragment_get_channel_layout (GeglAudioFragment *audio)
{
return audio->channel_layout;
return audio->xchannel_layout;
}
/* --------------------------------------------------------------------------
......
......@@ -40,11 +40,12 @@ typedef struct _GeglAudioFragmentPrivate GeglAudioFragmentPrivate;
struct _GeglAudioFragment
{
GObject parent_instance;
int max_samples;
int xsample_count;
int xchannels;
int xchannel_layout;/* unused - assumed channels = 1 is mono 2 stereo */
int sample_rate;
int samples;
int pos;
int channels;
int channel_layout;/* unused - assumed channels = 1 is mono 2 stereo */
float data[GEGL_MAX_AUDIO_CHANNELS][GEGL_MAX_AUDIO_SAMPLES];
GeglAudioFragmentPrivate *priv;
};
......@@ -56,21 +57,21 @@ struct _GeglAudioFragmentClass
GType gegl_audio_fragment_get_type (void) G_GNUC_CONST;
GeglAudioFragment * gegl_audio_fragment_new (void);
GeglAudioFragment * gegl_audio_fragment_new (int sample_rate, int channels, int channel_layout, int max_samples);
void gegl_audio_fragment_set_max_samples (GeglAudioFragment *audio, int max_samples);
void gegl_audio_fragment_set_sample_rate (GeglAudioFragment *audio, int sample_rate);
void gegl_audio_fragment_set_channels (GeglAudioFragment *audio, int channels);
void gegl_audio_fragment_set_channel_layput (GeglAudioFragment *audio, int channel_layout);
void gegl_audio_fragment_set_samples (GeglAudioFragment *audio, int samples);
void gegl_audio_fragment_set_channel_layout (GeglAudioFragment *audio, int channel_layout);
void gegl_audio_fragment_set_sample_count (GeglAudioFragment *audio, int sample_count);
void gegl_audio_fragment_set_pos (GeglAudioFragment *audio, int pos);
int gegl_audio_fragment_get_max_samples (GeglAudioFragment *audio);
int gegl_audio_fragment_get_sample_rate (GeglAudioFragment *audio);
int gegl_audio_fragment_get_channels (GeglAudioFragment *audio);
int gegl_audio_fragment_get_samples (GeglAudioFragment *audio);
int gegl_audio_fragment_get_sample_count (GeglAudioFragment *audio);
int gegl_audio_fragment_get_pos (GeglAudioFragment *audio);
int gegl_audio_fragment_get_channel_layput (GeglAudioFragment *audio);
int gegl_audio_fragment_get_channel_layout (GeglAudioFragment *audio);
......
......@@ -228,51 +228,52 @@ decode_audio (GeglOperation *operation,
while (samples_left)
{
int sample_count = MIN (samples_left, GEGL_MAX_AUDIO_SAMPLES);
GeglAudioFragment *af = gegl_audio_fragment_new ();
af->channels = MIN(p->audio_stream->codec->channels, GEGL_MAX_AUDIO_CHANNELS);
int channels = MIN(p->audio_stream->codec->channels, GEGL_MAX_AUDIO_CHANNELS);
GeglAudioFragment *af = gegl_audio_fragment_new (o->audio_sample_rate, channels,
AV_CH_LAYOUT_STEREO, GEGL_MAX_AUDIO_SAMPLES); // XXX : use samples_left directly?
//);
//af->channels = MIN(p->audio_stream->codec->channels, GEGL_MAX_AUDIO_CHANNELS);
switch (p->audio_stream->codec->sample_fmt)
{
case AV_SAMPLE_FMT_FLT:
for (gint i = 0; i < sample_count; i++)
for (gint c = 0; c < af->channels; c++)
af->data[c][i] = ((int16_t *)frame.data[0])[(i + si) * af->channels + c];
for (gint c = 0; c < channels; c++)
af->data[c][i] = ((int16_t *)frame.data[0])[(i + si) * channels + c];
break;
case AV_SAMPLE_FMT_FLTP:
for (gint i = 0; i < sample_count; i++)
for (gint c = 0; c < af->channels; c++)
for (gint c = 0; c < channels; c++)
{
af->data[c][i] = ((float *)frame.data[c])[i + si];
}
break;
case AV_SAMPLE_FMT_S16:
for (gint i = 0; i < sample_count; i++)
for (gint c = 0; c < af->channels; c++)
af->data[c][i] = ((int16_t *)frame.data[0])[(i + si) * af->channels + c] / 32768.0;
for (gint c = 0; c < channels; c++)
af->data[c][i] = ((int16_t *)frame.data[0])[(i + si) * channels + c] / 32768.0;
break;
case AV_SAMPLE_FMT_S16P:
for (gint i = 0; i < sample_count; i++)
for (gint c = 0; c < af->channels; c++)
for (gint c = 0; c < channels; c++)
af->data[c][i] = ((int16_t *)frame.data[c])[i + si] / 32768.0;
break;
case AV_SAMPLE_FMT_S32:
for (gint i = 0; i < sample_count; i++)
for (gint c = 0; c < af->channels; c++)
af->data[c][i] = ((int32_t *)frame.data[0])[(i + si) * af->channels + c] / 2147483648.0;
for (gint c = 0; c < channels; c++)
af->data[c][i] = ((int32_t *)frame.data[0])[(i + si) * channels + c] / 2147483648.0;
break;
case AV_SAMPLE_FMT_S32P:
for (gint i = 0; i < sample_count; i++)
for (gint c = 0; c < af->channels; c++)
for (gint c = 0; c < channels; c++)
af->data[c][i] = ((int32_t *)frame.data[c])[i + si] / 2147483648.0;
break;
default:
g_warning ("undealt with sample format\n");
}
af->samples = sample_count;
af->xsample_count = sample_count;
af->pos = p->audio_pos;
p->audio_pos += af->samples;
p->audio_pos += af->xsample_count;
p->audio_track = g_list_append (p->audio_track, af);
samples_left -= sample_count;
......@@ -568,17 +569,17 @@ static void get_sample_data (Priv *p, long sample_no, float *left, float *right)
for (; l; l = l->next)
{
GeglAudioFragment *af = l->data;
if (sample_no > af->pos + af->samples)
if (sample_no > af->pos + af->xsample_count)
{
to_remove ++;
}
if (af->pos <= sample_no &&
sample_no < af->pos + af->samples)
sample_no < af->pos + af->xsample_count)
{
int i = sample_no - af->pos;
*left = af->data[0][i];
if (af->channels == 1)
if (af->xchannels == 1)
*right = af->data[0][i];
else
*right = af->data[1][i];
......@@ -589,7 +590,7 @@ static void get_sample_data (Priv *p, long sample_no, float *left, float *right)
for (l = p->audio_track; l; l = l->next)
{
GeglAudioFragment *af = l->data;
if (sample_no > af->pos + af->samples)
if (sample_no > af->pos + af->xsample_count)
{
p->audio_track = g_list_remove (p->audio_track, af);
g_object_unref (af);
......@@ -626,15 +627,19 @@ process (GeglOperation *operation,
if (p->audio_stream && p->audio_stream->codec) // XXX: remove second clause
{
o->audio->sample_rate = p->audio_stream->codec->sample_rate;
o->audio->channels = 2;
o->audio->channel_layout = AV_CH_LAYOUT_STEREO;
o->audio->samples = samples_per_frame (o->frame,
o->audio->xchannels = 2;
o->audio->xchannel_layout = AV_CH_LAYOUT_STEREO;
/* XXX: should compare against max and fix if going over */
o->audio->xsample_count = samples_per_frame (o->frame,
o->frame_rate, o->audio->sample_rate,
&sample_start);
decode_audio (operation, p->prevpts, p->prevpts + 5.0);
{
int i;
for (i = 0; i < o->audio->samples; i++)
for (i = 0; i < o->audio->xsample_count; i++)
{
get_sample_data (p, sample_start + i, &o->audio->data[0][i],
&o->audio->data[1][i]);
......
......@@ -125,17 +125,17 @@ static void get_sample_data (Priv *p, long sample_no, float *left, float *right)
for (; l; l = l->next)
{
GeglAudioFragment *af = l->data;
if (sample_no > af->pos + af->samples)
if (sample_no > af->pos + af->xsample_count)
{
to_remove ++;
}
if (af->pos <= sample_no &&
sample_no < af->pos + af->samples)
sample_no < af->pos + af->xsample_count)
{
int i = sample_no - af->pos;
*left = af->data[0][i];
if (af->channels == 1)
if (af->xchannels == 1)
*right = af->data[0][i];
else
*right = af->data[1][i];
......@@ -146,7 +146,7 @@ static void get_sample_data (Priv *p, long sample_no, float *left, float *right)
for (l = p->audio_track; l; l = l->next)
{
GeglAudioFragment *af = l->data;
if (sample_no > af->pos + af->samples)
if (sample_no > af->pos + af->xsample_count)
{
p->audio_track = g_list_remove (p->audio_track, af);
g_object_unref (af);
......@@ -326,16 +326,14 @@ write_audio_frame (GeglProperties *o, AVFormatContext * oc, AVStream * st)
/* first we add incoming frames audio samples */
{
int i;
GeglAudioFragment *af = gegl_audio_fragment_new ();
af->channels = 2; //o->audio->channels;
af->samples = o->audio->samples;
for (i = 0; i < af->samples; i++)
GeglAudioFragment *af = gegl_audio_fragment_new (o->audio->sample_rate, o->audio->xchannels, o->audio->xchannel_layout, o->audio->xsample_count);
for (i = 0; i < af->xsample_count; i++)
{
af->data[0][i] = o->audio->data[0][i];
af->data[1][i] = o->audio->data[1][i];
}
af->pos = p->audio_pos;
p->audio_pos += af->samples;
p->audio_pos += af->xsample_count;
p->audio_track = g_list_append (p->audio_track, af);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment