⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plugin.c

📁 编译后直接运行的MP3播放器全部C语言源代码 一个包含FAT文件系统、系统引导 Boot、FLASH Driver等内容的
💻 C
字号:
/*************************************************************************** *             __________               __   ___. *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  / *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  < *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \ *                     \/            \/     \/    \/            \/ * $Id: plugin.c,v 1.15 2004/02/03 23:56:25 hohensoh Exp $ * * Copyright (C) 2002 Bj鰎n Stenberg * * All files in this archive are subject to the GNU General Public License. * See the file COPYING in the source tree root for full license agreement. * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * ****************************************************************************/#include <stdbool.h>#include <string.h>#include <stdio.h>#include <atoi.h>#include <timefuncs.h>#include "button.h"#include "lcd.h"#include "dir.h"#include "file.h"#include "kernel.h"#include "sprintf.h"#include "screens.h"#include "misc.h"#include "mas.h"#include "plugin.h"#include "lang.h"#include "keyboard.h"#include "mpeg.h"#include "buffer.h"#include "mp3_playback.h"#include "backlight.h"#include "ata.h"#ifdef HAVE_LCD_BITMAP#include "widgets.h"#endif#ifdef SIMULATOR  #include <debug.h>  #ifdef WIN32    #include "plugin-win32.h"    #define PREFIX(_x_) _x_  #else    #include <dlfcn.h>    #define PREFIX(_x_) x11_ ## _x_  #endif#else#define PREFIX(_x_) _x_#endif#define PLUGIN_BUFFER_SIZE 0x8000#ifdef SIMULATORstatic unsigned char pluginbuf[PLUGIN_BUFFER_SIZE];#elseextern unsigned char pluginbuf[];extern void bitswap(unsigned char *data, int length);#endifstatic bool plugin_loaded = false;static int  plugin_size = 0;static int plugin_test(int api_version, int model, int memsize);static struct plugin_api rockbox_api = {    PLUGIN_API_VERSION,    plugin_test,        /* lcd */    lcd_clear_display,    lcd_puts,    lcd_puts_scroll,    lcd_stop_scroll,#ifdef HAVE_LCD_CHARCELLS    lcd_define_pattern,    lcd_get_locked_pattern,    lcd_unlock_pattern,    lcd_putc,#else    lcd_putsxy,    lcd_bitmap,    lcd_drawline,    lcd_clearline,    lcd_drawpixel,    lcd_clearpixel,    lcd_setfont,    lcd_clearrect,    lcd_fillrect,    lcd_drawrect,    lcd_invertrect,    lcd_getstringsize,    lcd_update,    lcd_update_rect,    progressbar,    slidebar,    scrollbar,#ifndef SIMULATOR    lcd_roll,#endif#endif    /* button */    button_get,    button_get_w_tmo,    /* file */    (open_func)PREFIX(open),    PREFIX(close),    (read_func)read,    lseek,    (creat_func)PREFIX(creat),    (write_func)write,    remove,    rename,    ftruncate,    PREFIX(filesize),    fprintf,    read_line,    /* dir */    PREFIX(opendir),    PREFIX(closedir),    PREFIX(readdir),    /* kernel */    PREFIX(sleep),    usb_screen,    &current_tick,    /* strings and memory */    snprintf,    strcpy,    strlen,    memset,    memcpy,    /* sound */#ifndef SIMULATOR#ifdef HAVE_MAS3587F    mas_codec_readreg,#endif#endif        /* misc */    srand,    rand,    splash,    (qsort_func)qsort,    kbd_input,    mpeg_current_track,    atoi,    get_time,    plugin_get_buffer,    /* new stuff at the end, sort into place next time the API gets incompatible */#ifndef HAVE_LCD_CHARCELLS    &lcd_framebuffer[0][0],    lcd_blit,#endif    yield,    plugin_get_mp3_buffer,    mpeg_sound_set,#ifndef SIMULATOR    mp3_play_init,    mp3_play_data,    mp3_play_pause,    mp3_play_stop,    mp3_is_playing,    bitswap,#endif    &global_settings,    backlight_set_timeout,#ifndef SIMULATOR    ata_sleep,#endif};int plugin_load(char* plugin, void* parameter){    enum plugin_status (*plugin_start)(struct plugin_api* api, void* param);    int rc;    char buf[64];#ifdef SIMULATOR    void* pd;    char path[256];#else    int fd;#endif#ifdef HAVE_LCD_BITMAP    int xm,ym;    lcd_clear_display();    xm = lcd_getxmargin();    ym = lcd_getymargin();    lcd_setmargins(0,0);    lcd_update();#else    lcd_clear_display();#endif#ifdef SIMULATOR#ifdef WIN32    snprintf(path, sizeof path, "%s", plugin);#else    snprintf(path, sizeof path, "archos%s", plugin);#endif    pd = dlopen(path, RTLD_NOW);    if (!pd) {        snprintf(buf, sizeof buf, "Can't open %s", plugin);        splash(HZ*2, true, buf);        DEBUGF("dlopen(%s): %s\n",path,dlerror());        dlclose(pd);        return -1;    }    plugin_start = dlsym(pd, "plugin_start");    if (!plugin_start) {        plugin_start = dlsym(pd, "_plugin_start");        if (!plugin_start) {            splash(HZ*2, true, "Can't find entry point");            dlclose(pd);            return -1;        }    }#else    fd = open(plugin, O_RDONLY);    if (fd < 0) {        snprintf(buf, sizeof buf, str(LANG_PLUGIN_CANT_OPEN), plugin);        splash(HZ*2, true, buf);        return fd;    }    plugin_start = (void*)&pluginbuf;    plugin_size = read(fd, plugin_start, PLUGIN_BUFFER_SIZE);    close(fd);    if (plugin_size < 0) {        /* read error */        snprintf(buf, sizeof buf, str(LANG_READ_FAILED), plugin);        splash(HZ*2, true, buf);        return -1;    }    if (plugin_size == 0) {        /* loaded a 0-byte plugin, implying it's not for this model */        splash(HZ*2, true, str(LANG_PLUGIN_WRONG_MODEL));        return -1;    }#endif    plugin_loaded = true;    rc = plugin_start(&rockbox_api, parameter);    plugin_loaded = false;    switch (rc) {        case PLUGIN_OK:            break;        case PLUGIN_USB_CONNECTED:            return PLUGIN_USB_CONNECTED;        case PLUGIN_WRONG_API_VERSION:            splash(HZ*2, true, str(LANG_PLUGIN_WRONG_VERSION));            break;        case PLUGIN_WRONG_MODEL:            splash(HZ*2, true, str(LANG_PLUGIN_WRONG_MODEL));            break;        default:            splash(HZ*2, true, str(LANG_PLUGIN_ERROR));            break;    }#ifdef SIMULATOR    dlclose(pd);#endif#ifdef HAVE_LCD_BITMAP    /* restore margins */    lcd_setmargins(xm,ym);#endif    return PLUGIN_OK;}/* Returns a pointer to the portion of the plugin buffer that is not already   being used.  If no plugin is loaded, returns the entire plugin buffer */void* plugin_get_buffer(int* buffer_size){    int buffer_pos;    if (plugin_loaded)    {        if (plugin_size >= PLUGIN_BUFFER_SIZE)            return NULL;                *buffer_size = PLUGIN_BUFFER_SIZE-plugin_size;        buffer_pos = plugin_size;    }    else    {        *buffer_size = PLUGIN_BUFFER_SIZE;        buffer_pos = 0;    }    return &pluginbuf[buffer_pos];}/* Returns a pointer to the mp3 buffer.    Playback gets stopped, to avoid conflicts. */void* plugin_get_mp3_buffer(int* buffer_size){#ifdef SIMULATOR    static unsigned char buf[1700*1024];    *buffer_size = sizeof(buf);    return buf;#else    mpeg_stop();    *buffer_size = mp3end - mp3buf;    return mp3buf;#endif }static int plugin_test(int api_version, int model, int memsize){    if (api_version < PLUGIN_MIN_API_VERSION ||        api_version > PLUGIN_API_VERSION)        return PLUGIN_WRONG_API_VERSION;    if (model != MODEL)        return PLUGIN_WRONG_MODEL;    if (memsize != MEM)        return PLUGIN_WRONG_MODEL;        return PLUGIN_OK;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -