LINUX.ORG.RU

История изменений

Исправление 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;
}