SNDOPEN: Difference between revisions

From QB64 Phoenix Edition Wiki
Jump to navigation Jump to search
(_SNDOPEN() always returns zero on error.)
Tag: visualeditor
(Clarified playing MID files requires using $MIDISOUNDFONT)
Tag: visualeditor
Line 10: Line 10:
* Returns a [[LONG]] {{Parameter|soundHandle&}} value to the sound file in memory. '''A value of zero means the sound could not be loaded.'''
* Returns a [[LONG]] {{Parameter|soundHandle&}} value to the sound file in memory. '''A value of zero means the sound could not be loaded.'''
* The literal or variable [[STRING]] sound {{Parameter|fileName$}} can be '''WAV, FLAC, OGG, MP3, MID, IT, XM, S3M, MOD or RAD (v2 only)''' file types.
* The literal or variable [[STRING]] sound {{Parameter|fileName$}} can be '''WAV, FLAC, OGG, MP3, MID, IT, XM, S3M, MOD or RAD (v2 only)''' file types.
**'''MID''' support is enabled via the [[$MIDISOUNDFONT]] metacommand.
* The literal or variable [[STRING]] {{Parameter|capabilities$}} is optional but can be '''STREAM''' (version 3.1.0 and up). Anything else is ignored.
* The literal or variable [[STRING]] {{Parameter|capabilities$}} is optional but can be '''STREAM''' (version 3.1.0 and up). Anything else is ignored.
* Specifying '''STREAM''' as a second parameter will "stream" the sound into memory rather than fully decoding it. This is good when we want to play long sounds as background music and want to avoid loading delays.
* Specifying '''STREAM''' as a second parameter will "stream" the sound into memory rather than fully decoding it. This is good when we want to play long sounds as background music and want to avoid loading delays.

Revision as of 14:58, 11 September 2022

The _SNDOPEN function loads a sound file into memory and returns a LONG handle value above 0.


Syntax

soundHandle& = _SNDOPEN(fileName$[, capabilities$])


Description

  • Returns a LONG soundHandle& value to the sound file in memory. A value of zero means the sound could not be loaded.
  • The literal or variable STRING sound fileName$ can be WAV, FLAC, OGG, MP3, MID, IT, XM, S3M, MOD or RAD (v2 only) file types.
  • The literal or variable STRING capabilities$ is optional but can be STREAM (version 3.1.0 and up). Anything else is ignored.
  • Specifying STREAM as a second parameter will "stream" the sound into memory rather than fully decoding it. This is good when we want to play long sounds as background music and want to avoid loading delays.
  • Short sounds should not be loaded using STREAM. Also, _MEMSOUND will not work for sounds loaded using STREAM.
  • Always check the handle value returned is greater than zero before attempting to play the sound.
  • The handle can be used by most of the _SND sound playing functions and statements in QB64 except _SNDPLAYFILE which plays a sound file directly from the disk and does not use a handle value.
  • Handles can be closed with _SNDCLOSE when the sound is no longer necessary.
  • If a WAV sound file won't play, try it using the Windows Play WAV sounds library to check it or convert the sound file to FLAC, OGG or MP3.


Examples

Snippet 1: Loading a sound file to use in the program later. Only load it once and use the handle any time you want.

h& = _SNDOPEN("dog.wav")
IF h& <= 0 THEN BEEP ELSE _SNDPLAY h&      'check for valid handle before using!


Snippet 2: Playing a sound from 2 different speakers based on program results.

' This examples load, plays and then bounces the sound between the left and right channels
Laff& = _SNDOPEN("KONGlaff.ogg", "stream") 'load sound file and get LONG handle value
IF Laff& > 0 THEN
    _SNDPLAY Laff& 'play sound
ELSE
    PRINT "Failed to load sound file."
    END
END IF

PRINT "Press ESC to stop."
dir = 0.01
DO
    IF laffx! <= -1 THEN dir = 0.01
    IF laffx! >= 1 THEN dir = -0.01
    laffx! = laffx! + dir

    LOCATE , 1: PRINT USING "Balance = ##.##"; laffx!;
    _SNDBAL Laff&, laffx! 'balance sound to left or right speaker

    _LIMIT 60
LOOP WHILE _SNDPLAYING(Laff&) AND _KEYHIT <> 27


Snippet 3: Playing a file and controlling playback:

s& = _SNDOPEN("song.ogg")
PRINT "READY"; s&
_SNDPLAY s&
_SNDLOOP s&


xleft = -1
xright = 1
DO
    k$ = INKEY$
    SELECT CASE k$
        CASE "f"
            xleft = xleft - 0.1
            _SNDBAL s&, xleft, , , 1
        CASE "g"
            xleft = xleft + 0.1
            _SNDBAL s&, xleft, , , 1
        CASE "h"
            xright = xright - 0.1
            _SNDBAL s&, xright, , , 2
        CASE "j"
            xright = xright + 0.1
            _SNDBAL s&, xright, , , 2
        CASE "n"
            volume = volume - 0.1
            _SNDVOL s&, volume
        CASE "m"
            volume = volume + 0.1
            _SNDVOL s&, volume
        CASE "p"
            _SNDPAUSE s&
        CASE " "
            _SNDPLAY s&
        CASE "i"
            PRINT _SNDPLAYING(s&)
            PRINT _SNDPAUSED(s&)
            SLEEP
        CASE "b"
            _SNDSETPOS s&, 110
        CASE "l"
            _SNDLIMIT s&, 10
            PRINT "LIM"
            SLEEP
        CASE "k"
            _SNDSTOP s&
        CASE "c"
            _SNDCLOSE s&
            SLEEP
            s2& = _SNDOPEN("song.ogg")
        CASE "d"
            s2& = _SNDCOPY(s&)
            _SNDPLAY s2&
    END SELECT
    LOCATE 1, 1
    PRINT xleft, xright, volume, _SNDGETPOS(s&); "   "
LOOP
Code by Johny B


See also



Navigation:
Main Page with Articles and Tutorials
Keyword Reference - Alphabetical
Keyword Reference - By usage
Report a broken link