История изменений
Исправление
stevejobs,
(текущая версия)
:
в кресты не умею, поэтому считай псевдокодом =)
это аудио-плеер, который под конкретный файл подгружает плагин, могущий этот файл проиграть, проигрывает, и потом выгружает плагин
если апи поменялось, должен упасть
int playlist_play_next_file(char* filename)
{
void* plugin_handle;
void* (*play_func)(char*);
char* error;
char plugin_path[100] = "";
//Получаем расширение файла
char* file_extension = get_filename_ext(filename);
//На его основе получаем путь до dllки
sprintf(plugin_path,"/lib/amarok-codec-%s.so", file_extension);
//Сосем плагин для проигрывания
plugin_handle = dlopen (plugin_path, RTLD_LAZY);
if (!plugin_handle) {
fputs (dlerror(), stderr);
exit(1);
}
//Из плагина сосем функцию для проигрывания
play_func = dlsym(plugin_handle, "play_file");
if ((error = dlerror()) != NULL) {
fputs(error, stderr);
exit(1);
}
//Проигрываем файл
void* playing_file_handle = (*play_func)(filename);
//Ждем пока проигрывание закончится
wait_file_played(playing_file_handle);
//Выплёвываем поюзаный плагин
dlclose(plugin_handle);
}
const char* get_filename_ext(const char *filename) {
const char *dot = strrchr(filename, '.');
if(!dot || dot == filename) return "";
return dot + 1;
}
Исходная версия
stevejobs,
:
в кресты не умею, поэтому считай псевдокодом =)
это аудио-плеер, который под конкретный файл подгружает плагин, могущий этот файл проиграть, проигрывает, и потом выгружает плагин
если апи поменялось, должен упасть
int playlist_play_next_file(char* filename)
{
void* plugin_handle;
void* (*play_func)(char*);
char* error;
char plugin_path[100] = "";
//Получаем расширение файла
char* file_extension = get_filename_ext(filename);
//На его основе получаем путь до dllки
sprintf(plugin_path,"/lib/amarok-codec-%s.so", file_extension);
//Сосем плагин для проигрывания
plugin_handle = dlopen (plugin_path, RTLD_LAZY);
if (!plugin_handle) {
fputs (dlerror(), stderr);
exit(1);
}
//Из плагина сосем функцию для проигрывания
play_func = dlsym(handle, "play_file");
if ((error = dlerror()) != NULL) {
fputs(error, stderr);
exit(1);
}
//Проигрываем файл
void* playing_file_handle = (*play_func)(filename);
//Ждем пока проигрывание закончится
wait_file_played(playing_file_handle);
//Выплёвываем поюзаный плагин
dlclose(plugin_handle);
}
const char* get_filename_ext(const char *filename) {
const char *dot = strrchr(filename, '.');
if(!dot || dot == filename) return "";
return dot + 1;
}