void KprSoundSetup() { FskErr err = kFskErrNone; FskMediaPropertyValueRecord ambientAudio = {kFskMediaPropertyTypeInteger, {kFskAudioOutCategoryAmbient}}; #if FSK_EXTENSION_EMBED #else char* applicationPath = NULL; char* libraryPath = NULL; #if TARGET_OS_WIN32 char* libraryName = "mediareader.dll"; #else char* libraryName = "mediareader.so"; #endif FskLibrary library = NULL; #endif if (gSoundChannel) goto bail; #if FSK_EXTENSION_EMBED FskMediaReaderNewProc = FskMediaReaderNew; FskMediaReaderDisposeProc = FskMediaReaderDispose; FskMediaReaderExtractProc = FskMediaReaderExtract; FskMediaReaderGetPropertyProc = FskMediaReaderGetProperty; FskMediaReaderGetTrackProc = FskMediaReaderGetTrack; FskMediaReaderStartProc = FskMediaReaderStart; FskMediaReaderStopProc = FskMediaReaderStop; FskMediaReaderTrackGetPropertyProc = FskMediaReaderTrackGetProperty; #else applicationPath = FskGetApplicationPath(); bailIfNULL(applicationPath); bailIfError(FskMemPtrNewClear(FskStrLen(applicationPath) + FskStrLen(libraryName) + 1, &libraryPath)); FskStrCopy(libraryPath, applicationPath); FskStrCat(libraryPath, libraryName); bailIfError(FskLibraryLoad(&library, libraryPath)); bailIfError(FskLibraryGetSymbolAddress(library, "FskMediaReaderNew", &FskMediaReaderNewProc)); bailIfError(FskLibraryGetSymbolAddress(library, "FskMediaReaderDispose", &FskMediaReaderDisposeProc)); bailIfError(FskLibraryGetSymbolAddress(library, "FskMediaReaderExtract", &FskMediaReaderExtractProc)); bailIfError(FskLibraryGetSymbolAddress(library, "FskMediaReaderGetProperty", &FskMediaReaderGetPropertyProc)); bailIfError(FskLibraryGetSymbolAddress(library, "FskMediaReaderGetTrack", &FskMediaReaderGetTrackProc)); bailIfError(FskLibraryGetSymbolAddress(library, "FskMediaReaderStart", &FskMediaReaderStartProc)); bailIfError(FskLibraryGetSymbolAddress(library, "FskMediaReaderStop", &FskMediaReaderStopProc)); bailIfError(FskLibraryGetSymbolAddress(library, "FskMediaReaderTrackGetProperty", &FskMediaReaderTrackGetPropertyProc)); #endif bailIfError(FskSndChannelNew(&gSoundChannel, 0, kFskAudioFormatUndefined, 0)); FskTimeCallbackNew(&gSoundTimer); FskSndChannelSetProperty(gSoundChannel, kFskMediaPropertyAudioCategory, &ambientAudio); bail: #if FSK_EXTENSION_EMBED #else if (err) FskLibraryUnload(library); else FskMemPtrDispose(library); FskMemPtrDispose(libraryPath); FskMemPtrDispose(applicationPath); #endif return; }
FskErr FskECMAScriptLoadLibrary(const char *name) { FskErr err = kFskErrBadData; FskLibraryLoadProc libLoad; char *extension = NULL, *symbolName = NULL, *dot, *slash, *fullPath = NULL, *temp = NULL; FskLibrary library = NULL; char* root = NULL; FskFileInfo itemInfo; FskDebugStr("FskECMAScriptLoadLibrary: %s", name); dot = FskStrRChr(name, '.'); slash = FskStrRChr(name, '/'); if ((NULL == dot) || (slash && (slash > dot))) { #if TARGET_OS_WIN32 extension = ".dll"; #elif TARGET_OS_MAC || TARGET_OS_LINUX extension = ".so"; #elif TARGET_OS_KPL extension = (char*)KplECMAScriptGetExtension(); #endif } if (extension) fullPath = FskStrDoCat(name, extension); else fullPath = FskStrDoCopy(name); if (kFskErrNone != FskFileGetFileInfo(fullPath, &itemInfo)) { #if TARGET_OS_ANDROID char *libDir; libDir = FskStrDoCat(gAndroidCallbacks->getStaticDataDirCB(), "../lib/lib"); temp = FskStrDoCat(libDir, fullPath); FskMemPtrDispose(libDir); #else root = FskGetApplicationPath(); temp = FskStrDoCat(root, fullPath); FskMemPtrDispose(root); #endif if (kFskErrNone != FskFileGetFileInfo(temp, &itemInfo)) { FskDebugStr(" - no file: %s", temp); goto bail; } FskMemPtrDispose(fullPath); fullPath = temp; temp = NULL; } err = FskLibraryLoad(&library, fullPath); FskDebugStr(" - try: %s -> %d", fullPath, err); if (err) goto bail; symbolName = FskStrDoCat(name, "_fskLoad"); if ((kFskErrNone == FskLibraryGetSymbolAddress(library, symbolName, &libLoad)) || (kFskErrNone == FskLibraryGetSymbolAddress(library, "fskLoad", &libLoad))) { err = (libLoad)(library); FskDebugStr(" - symbolName: %x -> %d", libLoad, err); if (err) goto bail; err = kFskErrNone; } bail: if (err) { FskLibraryUnload(library); } FskMemPtrDispose(symbolName); FskMemPtrDispose(fullPath); return err; }
void* fxMapArchive(txString base, txCallbackAt callbackAt) { FskErr err = kFskErrNone; txArchive* archive = NULL; txString p; Atom atom; int c, i; txString* symbol; txScript* script; bailIfError(FskMemPtrNewClear(sizeof(txArchive), &archive)); c_strcpy(archive->base, base); bailIfError(FskFileMap(base, (unsigned char**)&(archive->address), &(archive->size), 0, &(archive->map))); p = archive->address; p = fxMapAtom(p, &atom); bailAssert(atom.atomType == XS_ATOM_ARCHIVE); p = fxMapAtom(p, &atom); bailAssert(atom.atomType == XS_ATOM_VERSION); bailAssert(*p++ == XS_MAJOR_VERSION); bailAssert(*p++ == XS_MINOR_VERSION); bailAssert(*p++ == XS_PATCH_VERSION); if ((*p++) && !callbackAt) { char* dot; dot = c_strrchr(archive->base, '.'); if (dot) *dot = 0; #if mxWindows c_strcat(archive->base, ".dll"); #else c_strcat(archive->base, ".so"); #endif bailIfError(FskLibraryLoad(&(archive->library), archive->base)); bailIfError(FskLibraryGetSymbolAddress(archive->library, "xsHostModuleAt", &callbackAt)); archive->keys = callbackAt(0); } p = fxMapAtom(p, &atom); bailAssert(atom.atomType == XS_ATOM_SYMBOLS); mxDecode2(p, archive->symbolCount); c = archive->symbolCount; if (c) { bailIfError(FskMemPtrNew(c * sizeof(txString), &(archive->symbols))); symbol = archive->symbols; for (i = 0; i < c; i++) { *symbol = p; p += c_strlen(p) + 1; symbol++; } } p = fxMapAtom(p, &atom); bailAssert(atom.atomType == XS_ATOM_PATHS); mxDecode2(p, archive->scriptCount); c = archive->scriptCount; bailIfError(FskMemPtrNewClear(c * sizeof(txScript), &(archive->scripts))); script = archive->scripts; for (i = 1; i <= c; i++) { if (callbackAt) script->callback = callbackAt(i); script->path = p; bailIfNULL(script->path); p += c_strlen(p) + 1; script++; } script = archive->scripts; for (i = 0; i < c; i++) { p = fxMapAtom(p, &atom); bailAssert(atom.atomType == XS_ATOM_CODE); script->codeSize = atom.atomSize - sizeof(atom); script->codeBuffer = (txS1*)p; p += script->codeSize; script++; } p = c_strrchr(archive->base, '/'); if (p) { p++; *p = 0; archive->baseLength = p - archive->base; } bail: if (err) { fxUnmapArchive(archive); archive = NULL; } return archive; }