diff --git a/basis/alien/libraries/libraries-docs.factor b/basis/alien/libraries/libraries-docs.factor index 245565d9ed..59142733b9 100644 --- a/basis/alien/libraries/libraries-docs.factor +++ b/basis/alien/libraries/libraries-docs.factor @@ -60,6 +60,10 @@ $nl } "Note the parse time evaluation with " { $link POSTPONE: << } "." } ; +HELP: deploy-library +{ $values { "name" string } } +{ $description "Specifies that the logical library named " { $snippet "name" } " should be included during " { $link "tools.deploy" } ". " { $snippet "name" } " must be the name of a library previously loaded with " { $link add-library } "." } ; + HELP: remove-library { $values { "name" string } } { $description "Unloads a library and removes it from the internal list of libraries. The " { $snippet "name" } " parameter should be a name that was previously passed to " { $link add-library } ". If no library with that name exists, this word does nothing." } ; @@ -72,4 +76,9 @@ ARTICLE: "loading-libs" "Loading native libraries" } "Once a library has been defined, you can try loading it to see if the path name is correct:" { $subsections load-library } -"If the compiler cannot load a library, or cannot resolve a symbol in a library, a linkage error is reported using the compiler error mechanism (see " { $link "compiler-errors" } "). Once you install the right library, reload the source file containing the " { $link add-library } " form to force the compiler to try loading the library again." ; +"If the compiler cannot load a library, or cannot resolve a symbol in a library, a linkage error is reported using the compiler error mechanism (see " { $link "compiler-errors" } "). Once you install the right library, reload the source file containing the " { $link add-library } " form to force the compiler to try loading the library again." +$nl +"Libraries that do not come standard with the operating system need to be included with deployed applications that use them. A word is provided to instruct " { $link "tools.deploy" } " that a library must be so deployed:" +{ $subsections + deploy-library +} ; diff --git a/basis/alien/libraries/libraries.factor b/basis/alien/libraries/libraries.factor index 0d255b8d07..6f80900da0 100644 --- a/basis/alien/libraries/libraries.factor +++ b/basis/alien/libraries/libraries.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: accessors alien alien.strings assocs io.backend -kernel namespaces destructors ; +kernel namespaces destructors sequences system io.pathnames ; IN: alien.libraries : dlopen ( path -- dll ) native-string>alien (dlopen) ; @@ -9,11 +9,15 @@ IN: alien.libraries : dlsym ( name dll -- alien ) [ string>symbol ] dip (dlsym) ; SYMBOL: libraries +SYMBOL: deploy-libraries libraries [ H{ } clone ] initialize +deploy-libraries [ V{ } clone ] initialize TUPLE: library path abi dll ; +ERROR: no-library name ; + : library ( name -- library ) libraries get at ; : ( path abi -- library ) @@ -31,4 +35,20 @@ M: library dispose dll>> [ dispose ] when* ; : add-library ( name path abi -- ) [ 2drop remove-library ] - [ swap libraries get set-at ] 3bi ; \ No newline at end of file + [ swap libraries get set-at ] 3bi ; + +: deploy-library ( name -- ) + dup libraries get key? + [ deploy-libraries get 2dup member? [ 2drop ] [ push ] if ] + [ no-library ] if ; + +deployed-library-path os ( path -- path' ) + +M: windows >deployed-library-path + file-name ; +M: unix >deployed-library-path + file-name "$ORIGIN" prepend-path ; +M: macosx >deployed-library-path + file-name "@executable_path/../Frameworks" prepend-path ; +PRIVATE> diff --git a/basis/globs/globs-tests.factor b/basis/globs/globs-tests.factor old mode 100644 new mode 100755 index c9903b1633..b2432754b1 --- a/basis/globs/globs-tests.factor +++ b/basis/globs/globs-tests.factor @@ -30,7 +30,7 @@ IN: globs.tests [ t ] [ "fo\\*" glob-pattern? ] unit-test [ t ] [ "fo{o,bro}" glob-pattern? ] unit-test -"foo" "bar" append-path 1array +{ "foo" "bar" } path-separator join 1array [ { "foo" "bar" "ba?" } path-separator join glob-parent-directory ] unit-test [ "foo" ] diff --git a/basis/globs/globs.factor b/basis/globs/globs.factor index 72b686c3b1..9cd6a73891 100644 --- a/basis/globs/globs.factor +++ b/basis/globs/globs.factor @@ -1,11 +1,11 @@ ! Copyright (C) 2007, 2009 Slava Pestov, Daniel Ehrenberg. ! See http://factorcode.org/license.txt for BSD license. USING: sequences io.pathnames kernel regexp.combinators -strings unicode.case peg.ebnf regexp arrays ; +strings splitting system unicode.case peg.ebnf regexp arrays ; IN: globs : not-path-separator ( -- sep ) - "[^" path-separator "]" 3append ; foldable + os windows? R! [^/\\]! R! [^/]! ? ; foldable EBNF: @@ -48,5 +48,5 @@ Main = Concatenation End [ "\\*?[{" member? ] any? ; : glob-parent-directory ( glob -- parent-directory ) - path-components dup [ glob-pattern? ] find drop head + path-separator split harvest dup [ glob-pattern? ] find drop head path-separator join ; diff --git a/basis/math/blas/config/config-docs.factor b/basis/math/blas/config/config-docs.factor index 5c6cef83b8..826f26c646 100644 --- a/basis/math/blas/config/config-docs.factor +++ b/basis/math/blas/config/config-docs.factor @@ -6,20 +6,25 @@ ARTICLE: "math.blas.config" "Configuring the BLAS interface" { $subsections blas-library blas-fortran-abi + deploy-blas? } "The interface attempts to set default values based on the ones encountered on the Factor project's build machines. If these settings don't work with your system's BLAS, or you wish to use a commercial BLAS, you may change the global values of those variables in your " { $link "factor-rc" } ". For example, to use AMD's ACML library on Windows with " { $snippet "math.blas" } ", your " { $snippet "factor-rc" } " would look like this:" { $code """ USING: math.blas.config namespaces ; "X:\\path\\to\\acml.dll" blas-library set-global intel-windows-abi blas-fortran-abi set-global +t deploy-blas? set-global """ } "To take effect, the " { $snippet "blas-library" } " and " { $snippet "blas-fortran-abi" } " variables must be set before any other " { $snippet "math.blas" } " vocabularies are loaded." ; HELP: blas-library -{ $description "The name of the shared library containing the BLAS interface to load. The value of this variable must be a valid shared library name that can be passed to " { $link add-fortran-library } ". To take effect, this variable must be set before any other " { $snippet "math.blas" } " vocabularies are loaded. See " { $link "math.blas.config" } " for details and examples." } ; +{ $var-description "The name of the shared library containing the BLAS interface to load. The value of this variable must be a valid shared library name that can be passed to " { $link add-fortran-library } ". To take effect, this variable must be set before any other " { $snippet "math.blas" } " vocabularies are loaded. See " { $link "math.blas.config" } " for details and examples." } ; HELP: blas-fortran-abi -{ $description "The Fortran ABI used by the BLAS interface specified in the " { $link blas-library } " variable. The value of " { $snippet "blas-fortran-abi" } " must be one of the " { $link "alien.fortran-abis" } " that can be passed to " { $link add-fortran-library } ". To take effect, this variable must be set before any other " { $snippet "math.blas" } " vocabularies are loaded. See " { $link "math.blas.config" } " for details and examples." } ; +{ $var-description "The Fortran ABI used by the BLAS interface specified in the " { $link blas-library } " variable. The value of " { $snippet "blas-fortran-abi" } " must be one of the " { $link "alien.fortran-abis" } " that can be passed to " { $link add-fortran-library } ". To take effect, this variable must be set before any other " { $snippet "math.blas" } " vocabularies are loaded. See " { $link "math.blas.config" } " for details and examples." } ; + +HELP: deploy-blas? +{ $var-description "If set to a true value, the BLAS library will be configured to deploy with applications that use it. To take effect, this variable must be set before any other " { $snippet "math.blas" } " vocabularies are loaded. See " { $link "math.blas.config" } " for details and examples." } ; ABOUT: "math.blas.config" diff --git a/basis/math/blas/config/config.factor b/basis/math/blas/config/config.factor index bce6e663af..76524d80ee 100644 --- a/basis/math/blas/config/config.factor +++ b/basis/math/blas/config/config.factor @@ -1,7 +1,7 @@ USING: alien.fortran combinators kernel namespaces system ; IN: math.blas.config -SYMBOLS: blas-library blas-fortran-abi ; +SYMBOLS: blas-library blas-fortran-abi deploy-blas? ; blas-library [ { @@ -21,3 +21,5 @@ blas-fortran-abi [ [ f2c-abi ] } cond ] initialize + +deploy-blas? [ os macosx? not ] initialize diff --git a/basis/math/blas/ffi/ffi.factor b/basis/math/blas/ffi/ffi.factor index b7748f500f..5cc6a18b6d 100644 --- a/basis/math/blas/ffi/ffi.factor +++ b/basis/math/blas/ffi/ffi.factor @@ -1,9 +1,12 @@ USING: alien.fortran kernel math.blas.config namespaces ; +FROM: alien.libraries => deploy-library ; IN: math.blas.ffi << "blas" blas-library blas-fortran-abi [ get ] bi@ add-fortran-library + +deploy-blas? get [ "blas" deploy-library ] when >> LIBRARY: blas diff --git a/basis/tools/deploy/backend/backend.factor b/basis/tools/deploy/backend/backend.factor index 9d6b8d4c08..fe63071998 100644 --- a/basis/tools/deploy/backend/backend.factor +++ b/basis/tools/deploy/backend/backend.factor @@ -8,14 +8,27 @@ io.streams.c io.files io.files.temp io.pathnames io.directories io.directories.hierarchy io.backend quotations io.launcher tools.deploy.config tools.deploy.config.editor bootstrap.image io.encodings.utf8 destructors accessors hashtables -vocabs.metadata.resources ; +tools.deploy.libraries vocabs.metadata.resources ; IN: tools.deploy.backend : copy-vm ( executable bundle-name -- vm ) prepend-path vm over copy-file ; +TUPLE: vocab-manifest vocabs libraries ; + : copy-resources ( manifest name dir -- ) - append-path swap [ copy-vocab-resources ] with each ; + append-path swap vocabs>> [ copy-vocab-resources ] with each ; + +ERROR: cant-deploy-library-file library ; + + +: copy-libraries ( manifest name dir -- ) + append-path swap libraries>> [ copy-library ] with each ; : image-name ( vocab bundle-name -- str ) prepend-path ".image" append ; @@ -99,10 +112,16 @@ DEFER: ?make-staging-image ] { } make ] bind ; +: parse-vocab-manifest-file ( path -- vocab-manifest ) + utf8 file-lines + dup first "VOCABS:" = + [ { "LIBRARIES:" } split1 vocab-manifest boa ] + [ "invalid vocab manifest!" throw ] if ; + : make-deploy-image ( vm image vocab config -- manifest ) make-boot-image over "vocab-manifest-" prepend temp-file [ swap deploy-command-line run-factor ] - [ utf8 file-lines ] bi ; + [ parse-vocab-manifest-file ] bi ; HOOK: deploy* os ( vocab -- ) diff --git a/basis/tools/deploy/libraries/libraries.factor b/basis/tools/deploy/libraries/libraries.factor new file mode 100644 index 0000000000..36fe3037de --- /dev/null +++ b/basis/tools/deploy/libraries/libraries.factor @@ -0,0 +1,11 @@ +! (c)2010 Joe Groff bsd license +USING: alien.libraries io.pathnames io.pathnames.private kernel +system vocabs.loader ; +IN: tools.deploy.libraries + +HOOK: find-library-file os ( file -- path ) + +os windows? +"tools.deploy.libraries.windows" +"tools.deploy.libraries.unix" ? require + diff --git a/extra/openal/macosx/tags.txt b/basis/tools/deploy/libraries/tags.txt similarity index 100% rename from extra/openal/macosx/tags.txt rename to basis/tools/deploy/libraries/tags.txt diff --git a/basis/tools/deploy/libraries/unix/tags.txt b/basis/tools/deploy/libraries/unix/tags.txt new file mode 100644 index 0000000000..6bf68304bb --- /dev/null +++ b/basis/tools/deploy/libraries/unix/tags.txt @@ -0,0 +1 @@ +unportable diff --git a/basis/tools/deploy/libraries/unix/unix.factor b/basis/tools/deploy/libraries/unix/unix.factor new file mode 100644 index 0000000000..db3e9fa134 --- /dev/null +++ b/basis/tools/deploy/libraries/unix/unix.factor @@ -0,0 +1,16 @@ +! (c)2010 Joe Groff bsd license +USING: io.files io.pathnames io.pathnames.private kernel +sequences system tools.deploy.libraries ; +IN: tools.deploy.libraries.unix + +! stupid hack. better ways to find the library name would be open the library, +! note a symbol address found in the library, then call dladdr (or use +: ?exists ( path -- path/f ) + dup exists? [ drop f ] unless ; inline + +M: unix find-library-file + dup absolute-path? [ ?exists ] [ + { "/lib" "/usr/lib" "/usr/local/lib" "/opt/local/lib" "resource:" } + [ prepend-path ?exists ] with map-find drop + ] if ; + diff --git a/basis/tools/deploy/libraries/windows/windows.factor b/basis/tools/deploy/libraries/windows/windows.factor new file mode 100644 index 0000000000..4698754f07 --- /dev/null +++ b/basis/tools/deploy/libraries/windows/windows.factor @@ -0,0 +1,16 @@ +! (c)2010 Joe Groff bsd license +USING: alien.strings byte-arrays io.encodings.utf16n kernel +specialized-arrays system tools.deploy.libraries windows.kernel32 +windows.types ; +FROM: alien.c-types => ushort ; +SPECIALIZED-ARRAY: ushort +IN: tools.deploy.libraries.windows + +M: windows find-library-file + f DONT_RESOLVE_DLL_REFERENCES LoadLibraryEx [ + [ + 32768 (ushort-array) [ 32768 GetModuleFileName drop ] keep + utf16n alien>string + ] [ FreeLibrary drop ] bi + ] [ f ] if* ; + diff --git a/basis/tools/deploy/macosx/macosx.factor b/basis/tools/deploy/macosx/macosx.factor index 8bd3749093..c02642ba1d 100644 --- a/basis/tools/deploy/macosx/macosx.factor +++ b/basis/tools/deploy/macosx/macosx.factor @@ -81,7 +81,9 @@ M: macosx deploy* ( vocab -- ) [ bundle-name create-app-dir ] keep [ bundle-name deploy.app-image ] keep namespace make-deploy-image - bundle-name "Contents/Resources" copy-resources + bundle-name + [ "Contents/Resources" copy-resources ] + [ "Contents/Frameworks" copy-libraries ] 2bi bundle-name show-in-finder ] bind ] with-directory ; diff --git a/basis/tools/deploy/shaker/shaker.factor b/basis/tools/deploy/shaker/shaker.factor index d8a653c021..54058f1b0d 100755 --- a/basis/tools/deploy/shaker/shaker.factor +++ b/basis/tools/deploy/shaker/shaker.factor @@ -1,6 +1,6 @@ ! Copyright (C) 2007, 2010 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: arrays accessors io.backend io.encodings.utf8 io.files +USING: arrays alien.libraries accessors io.backend io.encodings.utf8 io.files io.streams.c init fry namespaces math make assocs kernel parser parser.notes lexer strings.parser vocabs sequences sequences.deep sequences.private words memory kernel.private continuations io @@ -19,6 +19,7 @@ QUALIFIED: layouts QUALIFIED: source-files QUALIFIED: source-files.errors QUALIFIED: vocabs +FROM: alien.libraries.private => >deployed-library-path ; IN: tools.deploy.shaker ! This file is some hairy shit. @@ -505,11 +506,28 @@ SYMBOL: deploy-vocab : write-vocab-manifest ( vocab-manifest-out -- ) "Writing vocabulary manifest to " write dup print flush - vocabs swap utf8 set-file-lines ; + vocabs "VOCABS:" prefix + deploy-libraries get [ libraries get at path>> ] map prune "LIBRARIES:" prefix append + swap utf8 set-file-lines ; + +: prepare-deploy-libraries ( -- ) + "Preparing deployed libraries" show + deploy-libraries get [ + libraries get [ + [ path>> >deployed-library-path ] [ abi>> ] bi + ] change-at + ] each + + [ + "deploy-libraries" "alien.libraries" lookup forget + "deploy-library" "alien.libraries" lookup forget + ">deployed-library-path" "alien.libraries.private" lookup forget + ] with-compilation-unit ; : strip ( vocab-manifest-out -- ) [ write-vocab-manifest ] when* startup-stripper + prepare-deploy-libraries strip-libc strip-destructors strip-call diff --git a/basis/tools/deploy/unix/unix.factor b/basis/tools/deploy/unix/unix.factor index 2646f2d5a4..1b6b8596e2 100644 --- a/basis/tools/deploy/unix/unix.factor +++ b/basis/tools/deploy/unix/unix.factor @@ -19,7 +19,7 @@ M: unix deploy* ( vocab -- ) [ bundle-name create-app-dir ] keep [ bundle-name image-name ] keep namespace make-deploy-image - bundle-name "" copy-resources + bundle-name "" [ copy-resources ] [ copy-libraries ] 3bi bundle-name normalize-path [ "Binary deployed to " % % "." % ] "" make print ] bind ] with-directory ; diff --git a/basis/tools/deploy/windows/windows.factor b/basis/tools/deploy/windows/windows.factor index 9f0b22847b..1dd60583fa 100755 --- a/basis/tools/deploy/windows/windows.factor +++ b/basis/tools/deploy/windows/windows.factor @@ -36,7 +36,7 @@ M: winnt deploy* [ drop embed-ico ] [ image-name ] [ drop namespace make-deploy-image ] - [ nip "" copy-resources ] + [ nip "" [ copy-resources ] [ copy-libraries ] 3bi ] [ nip open-in-explorer ] } 2cleave ] bind diff --git a/basis/vocabs/metadata/resources/resources-tests.factor b/basis/vocabs/metadata/resources/resources-tests.factor index 36fd13125e..5c50406a26 100644 --- a/basis/vocabs/metadata/resources/resources-tests.factor +++ b/basis/vocabs/metadata/resources/resources-tests.factor @@ -14,6 +14,5 @@ IN: vocabs.metadata.resources.tests "resource-dir/bas" "resource-dir/bas/zang" "resource-dir/bas/zim" - "resource-dir/buh" "resource-dir/foo" } ] [ "vocabs.metadata.resources.test.3" vocab-resource-files natural-sort ] unit-test diff --git a/basis/windows/kernel32/kernel32.factor b/basis/windows/kernel32/kernel32.factor index 576fac3a06..db0005e219 100644 --- a/basis/windows/kernel32/kernel32.factor +++ b/basis/windows/kernel32/kernel32.factor @@ -90,6 +90,8 @@ CONSTANT: FILE_ACTION_MODIFIED 3 CONSTANT: FILE_ACTION_RENAMED_OLD_NAME 4 CONSTANT: FILE_ACTION_RENAMED_NEW_NAME 5 +CONSTANT: DONT_RESOLVE_DLL_REFERENCES 1 + STRUCT: FILE_NOTIFY_INFORMATION { NextEntryOffset DWORD } { Action DWORD } @@ -1167,7 +1169,7 @@ FUNCTION: BOOL FreeConsole ( ) ; ! FUNCTION: FreeEnvironmentStringsA FUNCTION: BOOL FreeEnvironmentStringsW ( LPTCH lpszEnvironmentBlock ) ; ALIAS: FreeEnvironmentStrings FreeEnvironmentStringsW -! FUNCTION: FreeLibrary +FUNCTION: BOOL FreeLibrary ( HMODULE hModule ) ; ! FUNCTION: FreeLibraryAndExitThread ! FUNCTION: FreeResource ! FUNCTION: FreeUserPhysicalPages @@ -1314,7 +1316,8 @@ FUNCTION: DWORD GetLogicalDrives ( ) ; ! FUNCTION: GetLongPathNameW ! FUNCTION: GetMailslotInfo ! FUNCTION: GetModuleFileNameA -! FUNCTION: GetModuleFileNameW +FUNCTION: DWORD GetModuleFileNameW ( HMODULE hModule, LPTSTR lpFilename, DWORD nSize ) ; +ALIAS: GetModuleFileName GetModuleFileNameW FUNCTION: HMODULE GetModuleHandleW ( LPCWSTR lpModuleName ) ; ALIAS: GetModuleHandle GetModuleHandleW ! FUNCTION: GetModuleHandleExA diff --git a/extra/gpu/demos/bunny/deploy.factor b/extra/gpu/demos/bunny/deploy.factor index 1289caadb6..048d710a41 100644 --- a/extra/gpu/demos/bunny/deploy.factor +++ b/extra/gpu/demos/bunny/deploy.factor @@ -6,7 +6,7 @@ H{ { deploy-unicode? f } { "stop-after-last-window?" t } { deploy-io 3 } - { deploy-reflection 2 } + { deploy-reflection 1 } { deploy-word-props? f } { deploy-math? t } { deploy-threads? t } diff --git a/extra/morse/morse.factor b/extra/morse/morse.factor old mode 100644 new mode 100755 index cbe3c0f2fa..c6f1601955 --- a/extra/morse/morse.factor +++ b/extra/morse/morse.factor @@ -1,6 +1,6 @@ ! Copyright (C) 2007, 2008, 2009 Alex Chapman, 2009 Diego Martinelli ! See http://factorcode.org/license.txt for BSD license. -USING: accessors ascii assocs biassocs combinators hashtables kernel lists literals math namespaces make multiline openal parser sequences splitting strings synth synth.buffers ; +USING: accessors ascii assocs biassocs combinators hashtables kernel lists literals math namespaces make multiline openal openal.alut parser sequences splitting strings synth synth.buffers ; IN: morse ERROR: no-morse-ch ch ; diff --git a/extra/ogg/ogg.factor b/extra/ogg/ogg.factor index 24227167c9..d7abece8bc 100644 --- a/extra/ogg/ogg.factor +++ b/extra/ogg/ogg.factor @@ -19,6 +19,8 @@ IN: ogg { [ os macosx? ] [ "libogg.0.dylib" ] } { [ os unix? ] [ "libogg.so" ] } } cond "cdecl" add-library + +"ogg" deploy-library >> LIBRARY: ogg diff --git a/extra/ogg/vorbis/vorbis.factor b/extra/ogg/vorbis/vorbis.factor index 8cf79fecaf..d5905dac9e 100644 --- a/extra/ogg/vorbis/vorbis.factor +++ b/extra/ogg/vorbis/vorbis.factor @@ -20,6 +20,8 @@ IN: ogg.vorbis { [ os macosx? ] [ "libvorbis.0.dylib" ] } { [ os unix? ] [ "libvorbis.so" ] } } cond "cdecl" add-library + +"vorbis" deploy-library >> LIBRARY: vorbis diff --git a/extra/openal/alut/alut.factor b/extra/openal/alut/alut.factor new file mode 100755 index 0000000000..d1b8d2600d --- /dev/null +++ b/extra/openal/alut/alut.factor @@ -0,0 +1,103 @@ +! Copyright (C) 2007 Chris Double. +! See http://factorcode.org/license.txt for BSD license. +USING: kernel accessors arrays alien system combinators +alien.syntax namespaces alien.c-types sequences vocabs.loader +shuffle openal openal.alut.backend alien.libraries generalizations +specialized-arrays alien.destructors ; +FROM: alien.c-types => float short ; +SPECIALIZED-ARRAY: uint +IN: openal.alut + +<< "alut" { + { [ os windows? ] [ "alut.dll" ] } + { [ os macosx? ] [ + "/System/Library/Frameworks/OpenAL.framework/OpenAL" + ] } + { [ os unix? ] [ "libalut.so" ] } + } cond "cdecl" add-library >> + +<< os macosx? [ "alut" deploy-library ] unless >> + +LIBRARY: alut + +CONSTANT: ALUT_API_MAJOR_VERSION 1 +CONSTANT: ALUT_API_MINOR_VERSION 1 +CONSTANT: ALUT_ERROR_NO_ERROR 0 +CONSTANT: ALUT_ERROR_OUT_OF_MEMORY HEX: 200 +CONSTANT: ALUT_ERROR_INVALID_ENUM HEX: 201 +CONSTANT: ALUT_ERROR_INVALID_VALUE HEX: 202 +CONSTANT: ALUT_ERROR_INVALID_OPERATION HEX: 203 +CONSTANT: ALUT_ERROR_NO_CURRENT_CONTEXT HEX: 204 +CONSTANT: ALUT_ERROR_AL_ERROR_ON_ENTRY HEX: 205 +CONSTANT: ALUT_ERROR_ALC_ERROR_ON_ENTRY HEX: 206 +CONSTANT: ALUT_ERROR_OPEN_DEVICE HEX: 207 +CONSTANT: ALUT_ERROR_CLOSE_DEVICE HEX: 208 +CONSTANT: ALUT_ERROR_CREATE_CONTEXT HEX: 209 +CONSTANT: ALUT_ERROR_MAKE_CONTEXT_CURRENT HEX: 20A +CONSTANT: ALUT_ERROR_DESTRY_CONTEXT HEX: 20B +CONSTANT: ALUT_ERROR_GEN_BUFFERS HEX: 20C +CONSTANT: ALUT_ERROR_BUFFER_DATA HEX: 20D +CONSTANT: ALUT_ERROR_IO_ERROR HEX: 20E +CONSTANT: ALUT_ERROR_UNSUPPORTED_FILE_TYPE HEX: 20F +CONSTANT: ALUT_ERROR_UNSUPPORTED_FILE_SUBTYPE HEX: 210 +CONSTANT: ALUT_ERROR_CORRUPT_OR_TRUNCATED_DATA HEX: 211 +CONSTANT: ALUT_WAVEFORM_SINE HEX: 100 +CONSTANT: ALUT_WAVEFORM_SQUARE HEX: 101 +CONSTANT: ALUT_WAVEFORM_SAWTOOTH HEX: 102 +CONSTANT: ALUT_WAVEFORM_WHITENOISE HEX: 103 +CONSTANT: ALUT_WAVEFORM_IMPULSE HEX: 104 +CONSTANT: ALUT_LOADER_BUFFER HEX: 300 +CONSTANT: ALUT_LOADER_MEMORY HEX: 301 + +FUNCTION: ALboolean alutInit ( int* argcp, char** argv ) ; +FUNCTION: ALboolean alutInitWithoutContext ( int* argcp, char** argv ) ; +FUNCTION: ALboolean alutExit ( ) ; +FUNCTION: ALenum alutGetError ( ) ; +FUNCTION: char* alutGetErrorString ( ALenum error ) ; +FUNCTION: ALuint alutCreateBufferFromFile ( char* fileName ) ; +FUNCTION: ALuint alutCreateBufferFromFileImage ( void* data, ALsizei length ) ; +FUNCTION: ALuint alutCreateBufferHelloWorld ( ) ; +FUNCTION: ALuint alutCreateBufferWaveform ( ALenum waveshape, ALfloat frequency, ALfloat phase, ALfloat duration ) ; +FUNCTION: void* alutLoadMemoryFromFile ( char* fileName, ALenum* format, ALsizei* size, ALfloat* frequency ) ; +FUNCTION: void* alutLoadMemoryFromFileImage ( void* data, ALsizei length, ALenum* format, ALsizei* size, ALfloat* frequency ) ; +FUNCTION: void* alutLoadMemoryHelloWorld ( ALenum* format, ALsizei* size, ALfloat* frequency ) ; +FUNCTION: void* alutLoadMemoryWaveform ( ALenum waveshape, ALfloat frequency, ALfloat phase, ALfloat duration, ALenum* format, ALsizei* size, ALfloat* freq ) ; +FUNCTION: char* alutGetMIMETypes ( ALenum loader ) ; +FUNCTION: ALint alutGetMajorVersion ( ) ; +FUNCTION: ALint alutGetMinorVersion ( ) ; +FUNCTION: ALboolean alutSleep ( ALfloat duration ) ; + +FUNCTION: void alutUnloadWAV ( ALenum format, void* data, ALsizei size, ALsizei frequency ) ; + +SYMBOL: init + +: init-openal ( -- ) + init get-global expired? [ + f f alutInit 0 = [ "Could not initialize OpenAL" throw ] when + 1337 init set-global + ] when ; + +: exit-openal ( -- ) + init get-global expired? [ + alutExit 0 = [ "Could not close OpenAL" throw ] when + f init set-global + ] unless ; + +: create-buffer-from-file ( filename -- buffer ) + alutCreateBufferFromFile dup AL_NONE = [ + "create-buffer-from-file failed" throw + ] when ; + +os macosx? "openal.alut.macosx" "openal.alut.other" ? require + +: create-buffer-from-wav ( filename -- buffer ) + gen-buffer dup rot load-wav-file + [ alBufferData ] 4 nkeep alutUnloadWAV ; + +: check-error ( -- ) + alGetError dup ALUT_ERROR_NO_ERROR = [ + drop + ] [ + alGetString throw + ] if ; + diff --git a/extra/openal/backend/authors.txt b/extra/openal/alut/backend/authors.txt similarity index 100% rename from extra/openal/backend/authors.txt rename to extra/openal/alut/backend/authors.txt diff --git a/extra/openal/backend/backend.factor b/extra/openal/alut/backend/backend.factor old mode 100644 new mode 100755 similarity index 79% rename from extra/openal/backend/backend.factor rename to extra/openal/alut/backend/backend.factor index 41069dcddf..fc50d3d15e --- a/extra/openal/backend/backend.factor +++ b/extra/openal/alut/backend/backend.factor @@ -1,4 +1,4 @@ USING: namespaces system ; -IN: openal.backend +IN: openal.alut.backend HOOK: load-wav-file os ( filename -- format data size frequency ) diff --git a/extra/openal/macosx/authors.txt b/extra/openal/alut/macosx/authors.txt similarity index 100% rename from extra/openal/macosx/authors.txt rename to extra/openal/alut/macosx/authors.txt diff --git a/extra/openal/macosx/macosx.factor b/extra/openal/alut/macosx/macosx.factor old mode 100644 new mode 100755 similarity index 84% rename from extra/openal/macosx/macosx.factor rename to extra/openal/alut/macosx/macosx.factor index f0a6b928e9..3c0a4672cb --- a/extra/openal/macosx/macosx.factor +++ b/extra/openal/alut/macosx/macosx.factor @@ -1,8 +1,8 @@ ! Copyright (C) 2007 Chris Double. ! See http://factorcode.org/license.txt for BSD license. USING: alien.c-types kernel alien alien.syntax shuffle -openal openal.backend namespaces system generalizations ; -IN: openal.macosx +openal openal.alut.backend namespaces system generalizations ; +IN: openal.alut.macosx LIBRARY: alut diff --git a/extra/openal/alut/macosx/tags.txt b/extra/openal/alut/macosx/tags.txt new file mode 100644 index 0000000000..6bf68304bb --- /dev/null +++ b/extra/openal/alut/macosx/tags.txt @@ -0,0 +1 @@ +unportable diff --git a/extra/openal/other/authors.txt b/extra/openal/alut/other/authors.txt similarity index 100% rename from extra/openal/other/authors.txt rename to extra/openal/alut/other/authors.txt diff --git a/extra/openal/other/other.factor b/extra/openal/alut/other/other.factor old mode 100644 new mode 100755 similarity index 89% rename from extra/openal/other/other.factor rename to extra/openal/alut/other/other.factor index ada8d6b1fb..b19579286b --- a/extra/openal/other/other.factor +++ b/extra/openal/alut/other/other.factor @@ -1,8 +1,8 @@ ! Copyright (C) 2007 Chris Double. ! See http://factorcode.org/license.txt for BSD license. USING: alien.c-types alien.syntax combinators generalizations -kernel openal openal.backend ; -IN: openal.other +kernel openal openal.alut.backend ; +IN: openal.alut.other LIBRARY: alut diff --git a/extra/openal/example/example.factor b/extra/openal/example/example.factor old mode 100644 new mode 100755 index 4d979a8fa7..7789ee6e0a --- a/extra/openal/example/example.factor +++ b/extra/openal/example/example.factor @@ -1,6 +1,6 @@ ! Copyright (C) 2007 Chris Double. ! See http://factorcode.org/license.txt for BSD license. -USING: calendar kernel openal sequences threads ; +USING: calendar kernel openal openal.alut sequences threads ; IN: openal.example : play-hello ( -- ) diff --git a/extra/openal/openal.factor b/extra/openal/openal.factor old mode 100644 new mode 100755 index 85b150ce09..bbe61f9dc3 --- a/extra/openal/openal.factor +++ b/extra/openal/openal.factor @@ -2,20 +2,12 @@ ! See http://factorcode.org/license.txt for BSD license. USING: kernel accessors arrays alien system combinators alien.syntax namespaces alien.c-types sequences vocabs.loader -shuffle openal.backend alien.libraries generalizations +shuffle alien.libraries generalizations specialized-arrays alien.destructors ; FROM: alien.c-types => float short ; SPECIALIZED-ARRAY: uint IN: openal -<< "alut" { - { [ os windows? ] [ "alut.dll" ] } - { [ os macosx? ] [ - "/System/Library/Frameworks/OpenAL.framework/OpenAL" - ] } - { [ os unix? ] [ "libalut.so" ] } - } cond "cdecl" add-library >> - << "openal" { { [ os windows? ] [ "OpenAL32.dll" ] } { [ os macosx? ] [ @@ -24,6 +16,8 @@ IN: openal { [ os unix? ] [ "libopenal.so" ] } } cond "cdecl" add-library >> +<< os macosx? [ "openal" deploy-library ] unless >> + LIBRARY: openal TYPEDEF: char ALboolean @@ -252,71 +246,6 @@ FUNCTION: void alcCaptureSamples ( ALCdevice* device, void* buf, ALCsizei samps DESTRUCTOR: alcCloseDevice* DESTRUCTOR: alcDestroyContext -LIBRARY: alut - -CONSTANT: ALUT_API_MAJOR_VERSION 1 -CONSTANT: ALUT_API_MINOR_VERSION 1 -CONSTANT: ALUT_ERROR_NO_ERROR 0 -CONSTANT: ALUT_ERROR_OUT_OF_MEMORY HEX: 200 -CONSTANT: ALUT_ERROR_INVALID_ENUM HEX: 201 -CONSTANT: ALUT_ERROR_INVALID_VALUE HEX: 202 -CONSTANT: ALUT_ERROR_INVALID_OPERATION HEX: 203 -CONSTANT: ALUT_ERROR_NO_CURRENT_CONTEXT HEX: 204 -CONSTANT: ALUT_ERROR_AL_ERROR_ON_ENTRY HEX: 205 -CONSTANT: ALUT_ERROR_ALC_ERROR_ON_ENTRY HEX: 206 -CONSTANT: ALUT_ERROR_OPEN_DEVICE HEX: 207 -CONSTANT: ALUT_ERROR_CLOSE_DEVICE HEX: 208 -CONSTANT: ALUT_ERROR_CREATE_CONTEXT HEX: 209 -CONSTANT: ALUT_ERROR_MAKE_CONTEXT_CURRENT HEX: 20A -CONSTANT: ALUT_ERROR_DESTRY_CONTEXT HEX: 20B -CONSTANT: ALUT_ERROR_GEN_BUFFERS HEX: 20C -CONSTANT: ALUT_ERROR_BUFFER_DATA HEX: 20D -CONSTANT: ALUT_ERROR_IO_ERROR HEX: 20E -CONSTANT: ALUT_ERROR_UNSUPPORTED_FILE_TYPE HEX: 20F -CONSTANT: ALUT_ERROR_UNSUPPORTED_FILE_SUBTYPE HEX: 210 -CONSTANT: ALUT_ERROR_CORRUPT_OR_TRUNCATED_DATA HEX: 211 -CONSTANT: ALUT_WAVEFORM_SINE HEX: 100 -CONSTANT: ALUT_WAVEFORM_SQUARE HEX: 101 -CONSTANT: ALUT_WAVEFORM_SAWTOOTH HEX: 102 -CONSTANT: ALUT_WAVEFORM_WHITENOISE HEX: 103 -CONSTANT: ALUT_WAVEFORM_IMPULSE HEX: 104 -CONSTANT: ALUT_LOADER_BUFFER HEX: 300 -CONSTANT: ALUT_LOADER_MEMORY HEX: 301 - -FUNCTION: ALboolean alutInit ( int* argcp, char** argv ) ; -FUNCTION: ALboolean alutInitWithoutContext ( int* argcp, char** argv ) ; -FUNCTION: ALboolean alutExit ( ) ; -FUNCTION: ALenum alutGetError ( ) ; -FUNCTION: char* alutGetErrorString ( ALenum error ) ; -FUNCTION: ALuint alutCreateBufferFromFile ( char* fileName ) ; -FUNCTION: ALuint alutCreateBufferFromFileImage ( void* data, ALsizei length ) ; -FUNCTION: ALuint alutCreateBufferHelloWorld ( ) ; -FUNCTION: ALuint alutCreateBufferWaveform ( ALenum waveshape, ALfloat frequency, ALfloat phase, ALfloat duration ) ; -FUNCTION: void* alutLoadMemoryFromFile ( char* fileName, ALenum* format, ALsizei* size, ALfloat* frequency ) ; -FUNCTION: void* alutLoadMemoryFromFileImage ( void* data, ALsizei length, ALenum* format, ALsizei* size, ALfloat* frequency ) ; -FUNCTION: void* alutLoadMemoryHelloWorld ( ALenum* format, ALsizei* size, ALfloat* frequency ) ; -FUNCTION: void* alutLoadMemoryWaveform ( ALenum waveshape, ALfloat frequency, ALfloat phase, ALfloat duration, ALenum* format, ALsizei* size, ALfloat* freq ) ; -FUNCTION: char* alutGetMIMETypes ( ALenum loader ) ; -FUNCTION: ALint alutGetMajorVersion ( ) ; -FUNCTION: ALint alutGetMinorVersion ( ) ; -FUNCTION: ALboolean alutSleep ( ALfloat duration ) ; - -FUNCTION: void alutUnloadWAV ( ALenum format, void* data, ALsizei size, ALsizei frequency ) ; - -SYMBOL: init - -: init-openal ( -- ) - init get-global expired? [ - f f alutInit 0 = [ "Could not initialize OpenAL" throw ] when - 1337 init set-global - ] when ; - -: exit-openal ( -- ) - init get-global expired? [ - alutExit 0 = [ "Could not close OpenAL" throw ] when - f init set-global - ] unless ; - : gen-sources ( size -- seq ) dup [ alGenSources ] keep ; @@ -325,17 +254,6 @@ SYMBOL: init : gen-buffer ( -- buffer ) 1 gen-buffers first ; -: create-buffer-from-file ( filename -- buffer ) - alutCreateBufferFromFile dup AL_NONE = [ - "create-buffer-from-file failed" throw - ] when ; - -os macosx? "openal.macosx" "openal.other" ? require - -: create-buffer-from-wav ( filename -- buffer ) - gen-buffer dup rot load-wav-file - [ alBufferData ] 4 nkeep alutUnloadWAV ; - : queue-buffers ( source buffers -- ) [ length ] [ >uint-array ] bi alSourceQueueBuffers ; @@ -358,12 +276,5 @@ os macosx? "openal.macosx" "openal.other" ? require : source-stop ( source -- ) alSourceStop ; -: check-error ( -- ) - alGetError dup ALUT_ERROR_NO_ERROR = [ - drop - ] [ - alGetString throw - ] if ; - : source-playing? ( source -- bool ) AL_SOURCE_STATE get-source-param AL_PLAYING = ; diff --git a/extra/space-invaders/space-invaders.factor b/extra/space-invaders/space-invaders.factor old mode 100644 new mode 100755 index 17e277fb6a..01bf621769 --- a/extra/space-invaders/space-invaders.factor +++ b/extra/space-invaders/space-invaders.factor @@ -18,6 +18,7 @@ USING: math math.order openal + openal.alut opengl.gl sequences ui diff --git a/extra/synth/example/example.factor b/extra/synth/example/example.factor old mode 100644 new mode 100755 index 747cfb9c86..e09d903afb --- a/extra/synth/example/example.factor +++ b/extra/synth/example/example.factor @@ -1,6 +1,6 @@ ! Copyright (C) 2008 Alex Chapman ! See http://factorcode.org/license.txt for BSD license. -USING: accessors arrays kernel namespaces make openal sequences +USING: accessors arrays kernel namespaces make openal openal.alut sequences synth synth.buffers ; IN: synth.example diff --git a/extra/synth/synth.factor b/extra/synth/synth.factor old mode 100644 new mode 100755 index def610d356..90645e3562 --- a/extra/synth/synth.factor +++ b/extra/synth/synth.factor @@ -1,6 +1,6 @@ ! Copyright (C) 2008 Alex Chapman ! See http://factorcode.org/license.txt for BSD license. -USING: accessors kernel locals math math.constants math.functions memoize openal synth.buffers sequences sequences.modified sequences.repeating ; +USING: accessors kernel locals math math.constants math.functions memoize openal openal.alut synth.buffers sequences sequences.modified sequences.repeating ; IN: synth MEMO: single-sine-wave ( samples/wave -- seq )