SNDOPEN: Difference between revisions

From QB64 Phoenix Edition Wiki
Jump to navigation Jump to search
(Added new format information. Updated notes on how to deal with invalid handles. Improved example #2)
(Added notes on the new miniaudio backend capabilities$ (STREAM). This is simply ignored with the OpenAL backend. So, we are good that way.)
Line 4: Line 4:


{{PageSyntax}}
{{PageSyntax}}
: {{Parameter|soundHandle&}} = [[_SNDOPEN]]({{Parameter|fileName$}})
: {{Parameter|soundHandle&}} = [[_SNDOPEN]]({{Parameter|fileName$}}[, {{Parameter|capabilities$}}])




Line 10: Line 10:
* Returns a [[LONG]] {{Parameter|soundHandle&}} value to the sound file in memory. '''A value less than one means the sound could not be loaded.'''
* Returns a [[LONG]] {{Parameter|soundHandle&}} value to the sound file in memory. '''A value less than one 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.
* The literal or variable [[STRING]] {{Parameter|capabilities$}} is optional but can be '''STREAM'''. 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.'''
* '''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.
* 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.
Line 27: Line 30:
{{CodeStart}}
{{CodeStart}}
' This examples load, plays and then bounces the sound between the left and right channels
' This examples load, plays and then bounces the sound between the left and right channels
Laff& = {{Cl|_SNDOPEN}}("KONGlaff.ogg") 'load sound file and get LONG handle value
Laff& = {{Cl|_SNDOPEN}}("KONGlaff.ogg", "stream") 'load sound file and get LONG handle value
{{Cl|IF}} Laff& > 0 {{Cl|THEN}}
{{Cl|IF}} Laff& > 0 {{Cl|THEN}}
     {{Cl|_SNDPLAY}} Laff& 'play sound
     {{Cl|_SNDPLAY}} Laff& 'play sound
Line 50: Line 53:




''Example:'' Playing a file and controlling playback:
''Snippet 3:'' Playing a file and controlling playback:
{{CodeStart}}
{{CodeStart}}
s& = {{Cl|_SNDOPEN}}("song.ogg")
s& = {{Cl|_SNDOPEN}}("song.ogg")

Revision as of 07:57, 27 August 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 less than one 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. 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