Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}