Audio transcoding works correctly. Added a bunch of cleanup functions

This commit is contained in:
Jaime Thomas 2008-06-04 01:12:34 +00:00
parent 8e69faf23e
commit 4601df797e
11 changed files with 106 additions and 14 deletions

View File

@ -1,3 +1,4 @@
CD Burner CD Burner
INFO++; INFO++;
Needs to be installed for audio transcoding to work correctly

View File

@ -38,9 +38,9 @@ main(int argc, char **argv)
ecdb_burn_init(); ecdb_burn_init();
/* Start testing */ /* Start testing */
Ecdb_Burn_Project *proj; Ecdb_Audio_Project *proj;
Ecdb_Source *src; Ecdb_Source *src;
proj = ecdb_burn_project_new(); proj = ecdb_audio_project_new();
i = 1; i = 1;
while ((i < argc) && (argv)) while ((i < argc) && (argv))
@ -48,20 +48,22 @@ main(int argc, char **argv)
/* No trailing slashes */ /* No trailing slashes */
if (ecore_file_exists(argv[i])) if (ecore_file_exists(argv[i]))
{ {
if (ecore_file_is_dir(argv[i])) if (!ecore_file_is_dir(argv[i]))
ret = 1; {
src = ecdb_source_new(); src = ecdb_source_new();
ecdb_source_data_set(src, argv[i], ret); ecdb_source_data_set(src, argv[i], 0);
ecdb_source_child_append(proj->files, src); ecdb_source_child_append(proj->tracks, src);
}
ret = 0;
} }
i++; i++;
} }
ecdb_audio_project_start(proj);
/*
proj->publisher_id = proj->data_preparer_id = proj->system_id = proj->publisher_id = proj->data_preparer_id = proj->system_id =
proj->application_id = proj->copywrite_id = proj->application_id = proj->copywrite_id =
proj->abstract_id = proj->biblio_id = "ecdb"; proj->abstract_id = proj->biblio_id = strdup("ecdb");
if (!ecdb_aquire_drive(ECDB_PROJECT(proj), 0)) if (!ecdb_aquire_drive(ECDB_PROJECT(proj), 0))
{ {
@ -77,6 +79,8 @@ main(int argc, char **argv)
goto SHUTDOWN; goto SHUTDOWN;
} }
*/
ecore_main_loop_begin(); ecore_main_loop_begin();
/* End testing */ /* End testing */
@ -98,6 +102,9 @@ ecdb_setup(void)
em->drives = NULL; em->drives = NULL;
em->projects = ecore_list_new(); em->projects = ecore_list_new();
if (!ecore_file_mkdir("/tmp/ecdb"))
printf("Creation of temporary directory failed!\n");
ECDB_DRIVE_ACTION_FINISHED = ecore_event_type_new(); ECDB_DRIVE_ACTION_FINISHED = ecore_event_type_new();
ECDB_DRIVE_ACTION_BEGUN = ecore_event_type_new(); ECDB_DRIVE_ACTION_BEGUN = ecore_event_type_new();
ECDB_DRIVE_ACTION_UPDATE = ecore_event_type_new(); ECDB_DRIVE_ACTION_UPDATE = ecore_event_type_new();

View File

@ -33,22 +33,33 @@ ecdb_audio_project_init(Ecdb_Audio_Project *proj)
return TRUE; return TRUE;
} }
void
ecdb_audio_project_destroy(Ecdb_Audio_Project *proj)
{
ecdb_source_destroy(proj->tracks);
ecdb_project_destroy(ECDB_PROJECT(proj));
free(proj);
}
void void
ecdb_audio_project_start(Ecdb_Audio_Project *proj) ecdb_audio_project_start(Ecdb_Audio_Project *proj)
{ {
char cmd[PATH_MAX]; //<-- + 20ish? char cmd[PATH_MAX]; //<-- + 20ish?
int i; int i;
/* Fork off the gstreamer program for every file to be added */ /* Fork off the gstreamer program for every file to be added
* Depending on the number of files, this can be pretty system intensive, so
* is there a way to reduce/control this ?
*/
for (i = 0; proj->tracks->children[i]; i++) for (i = 0; proj->tracks->children[i]; i++)
{ {
snprintf(cmd, PATH_MAX, "ecdb_transcode_helper %s", snprintf(cmd, PATH_MAX, "ecdb_transcode_helper %s",
proj->tracks->children[i]->dst); proj->tracks->children[i]->dst);
ecore_exe_pipe_run(cmd, ECORE_EXE_PIPE_READ | ecore_exe_pipe_run(cmd, ECORE_EXE_PIPE_READ |
ECORE_EXE_PIPE_AUTO, NULL); ECORE_EXE_PIPE_READ_LINE_BUFFERED, NULL);
} }
proj->num_tracks = i - 1; proj->num_tracks = i;
ecore_event_handler_add(ECORE_EXE_EVENT_DATA, transcode_data_cb, proj); ecore_event_handler_add(ECORE_EXE_EVENT_DATA, transcode_data_cb, proj);
} }
@ -60,6 +71,7 @@ transcode_data_cb(void *data, int type, void *event)
Ecdb_Audio_Project *proj = data; Ecdb_Audio_Project *proj = data;
rec = ev->data; rec = ev->data;
proj->num_transcode_complete++;
printf("Message: %s\n", rec); printf("Message: %s\n", rec);
@ -74,7 +86,12 @@ transcode_data_cb(void *data, int type, void *event)
printf("Error!\n"); printf("Error!\n");
if (proj->num_tracks == proj->num_transcode_complete) if (proj->num_tracks == proj->num_transcode_complete)
{
printf("Hurrah, transcoding is done!\n"); printf("Hurrah, transcoding is done!\n");
/* Change to another event later */
ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, NULL, NULL, NULL);
}
return 1; return 1;
} }

View File

@ -3,5 +3,6 @@
Ecdb_Audio_Project *ecdb_audio_project_new(void); Ecdb_Audio_Project *ecdb_audio_project_new(void);
void ecdb_audio_project_start(Ecdb_Audio_Project *proj); void ecdb_audio_project_start(Ecdb_Audio_Project *proj);
void ecdb_audio_project_destroy(Ecdb_Audio_Project *proj);
#endif #endif

View File

@ -81,6 +81,29 @@ ecdb_erase_project_init(Ecdb_Erase_Project *proj)
return TRUE; return TRUE;
} }
void
ecdb_burn_project_destroy(Ecdb_Burn_Project *proj)
{
ecdb_source_destroy(proj->files);
FREE(proj->volume_id);
FREE(proj->publisher_id);
FREE(proj->data_preparer_id);
FREE(proj->system_id);
FREE(proj->application_id);
FREE(proj->copywrite_id);
FREE(proj->abstract_id);
FREE(proj->biblio_id);
ecdb_project_destroy(ECDB_PROJ(proj));
free(proj);
}
void
ecdb_erase_project_destroy(Ecdb_Erase_Project *proj)
{
ecdb_project_destroy(ECDB_PROJ(proj));
free(proj);
}
/* Erase and Burn Function */ /* Erase and Burn Function */
int int
ecdb_burn_project(Ecdb_Burn_Project *proj) ecdb_burn_project(Ecdb_Burn_Project *proj)

View File

@ -5,5 +5,7 @@ int ecdb_burn_project(Ecdb_Burn_Project *proj);
int ecdb_erase_disc(Ecdb_Erase_Project *proj); int ecdb_erase_disc(Ecdb_Erase_Project *proj);
Ecdb_Burn_Project *ecdb_burn_project_new(void); Ecdb_Burn_Project *ecdb_burn_project_new(void);
Ecdb_Erase_Project *ecdb_erase_project_new(void); Ecdb_Erase_Project *ecdb_erase_project_new(void);
void ecdb_burn_project_destroy(Ecdb_Burn_Project *proj);
void ecdb_erase_project_destroy(Ecdb_Erase_Project *proj);
#endif #endif

View File

@ -31,6 +31,26 @@ ecdb_source_init(Ecdb_Source *src)
return TRUE; return TRUE;
} }
void
ecdb_source_destroy(Ecdb_Source *src)
{
int i;
Ecdb_Source *child;
/* free the non-recursive stuff */
FREE(src->dst);
if (src->node)
iso_node_unref(src->node);
for (i = 0; src->children[i]; i++)
{
child = src->children[i];
ecdb_source_destroy(child);
}
free(src);
}
void void
ecdb_source_data_set(Ecdb_Source *src, const char *dst, unsigned char rec) ecdb_source_data_set(Ecdb_Source *src, const char *dst, unsigned char rec)
{ {

View File

@ -2,6 +2,7 @@
#define ECDB_IMAGE_H #define ECDB_IMAGE_H
Ecdb_Source *ecdb_source_new(void); Ecdb_Source *ecdb_source_new(void);
void ecdb_source_destroy(Ecdb_Source *src);
void ecdb_source_data_set(Ecdb_Source *src, const char *dst, void ecdb_source_data_set(Ecdb_Source *src, const char *dst,
unsigned char rec); unsigned char rec);
void ecdb_source_child_append(Ecdb_Source *src, Ecdb_Source *child); void ecdb_source_child_append(Ecdb_Source *src, Ecdb_Source *child);

View File

@ -24,6 +24,13 @@ ecdb_project_init(Ecdb_Project *proj)
return TRUE; return TRUE;
} }
void
ecdb_project_destroy(Ecdb_Project *proj)
{
ecdb_lose_drive_info(proj);
free(proj);
}
int int
ecdb_shutdown(void *data, int type, void *event) ecdb_shutdown(void *data, int type, void *event)
{ {
@ -32,6 +39,9 @@ ecdb_shutdown(void *data, int type, void *event)
if (em->drives) if (em->drives)
ecore_list_destroy(em->drives); ecore_list_destroy(em->drives);
free(em); free(em);
if (!ecore_file_recursive_rm("/tmp/ecdb"))
printf("Removal of temporary directory failed!\n");
ecore_main_loop_quit(); ecore_main_loop_quit();
return FALSE; return FALSE;
} }

View File

@ -3,6 +3,7 @@
Ecdb_Project *ecdb_project_new(void); Ecdb_Project *ecdb_project_new(void);
int ecdb_project_init(Ecdb_Project *proj); int ecdb_project_init(Ecdb_Project *proj);
void ecdb_project_destroy(void);
int ecdb_shutdown(void *data, int type, void *event); int ecdb_shutdown(void *data, int type, void *event);
void ecdb_burn_init(void); void ecdb_burn_init(void);
void ecdb_image_init(void); void ecdb_image_init(void);

View File

@ -71,6 +71,7 @@ main (int argc, char ** argv)
GstCaps *filtercaps; GstCaps *filtercaps;
GstPad *audiopad; GstPad *audiopad;
GstBus *bus; GstBus *bus;
gchar *path, *filename;
gst_init (&argc, &argv); gst_init (&argc, &argv);
loop = g_main_loop_new (NULL, FALSE); loop = g_main_loop_new (NULL, FALSE);
@ -113,7 +114,15 @@ main (int argc, char ** argv)
audiopad = gst_element_get_static_pad(conv, "sink"); audiopad = gst_element_get_static_pad(conv, "sink");
sink = gst_element_factory_make ("filesink", NULL); sink = gst_element_factory_make ("filesink", NULL);
g_object_set(G_OBJECT(sink), "location", "/home/jaime/test.wav", NULL);
/* Generate filename */
filename = g_path_get_basename(argv[1]);
path = g_strconcat("/tmp/ecdb/", filename, ".wav", NULL);
g_object_set(G_OBJECT(sink), "location", path, NULL);
free(filename);
free(path);
gst_bin_add_many(GST_BIN (audio), conv, resample, filter, sink, NULL); gst_bin_add_many(GST_BIN (audio), conv, resample, filter, sink, NULL);
gst_element_link_many(conv, resample, filter, sink, NULL); gst_element_link_many(conv, resample, filter, sink, NULL);
gst_element_add_pad (audio, gst_ghost_pad_new ("sink", audiopad)); gst_element_add_pad (audio, gst_ghost_pad_new ("sink", audiopad));