[Plugin] Audio Plugin
#1

Audio Plugin v0.5 R2

Note: This project is no longer under active development. Its most useful feature, streaming audio, has been integrated into SA-MP itself, though it can still be used alongside SA-MP. It has been put here mainly for archival purposes.

This plugin creates a TCP server that can communicate with external clients to transfer and play back audio files, stream audio files from the Internet, and control in-game radio stations. It has several features, including:
  • Seamless integration with SA-MP (San Andreas Multiplayer)
  • Audio playback with looping, pausing, resuming, and stopping, restarting, seeking, and volume adjusting
  • Internet audio file streaming that supports nearly all online stations, including SHOUTcast and Icecast
  • Sequence system for gapless playback of multiple audio files
  • Support for multiple audio streams per client
  • In-game 3D sound support with dynamic volume adjustment and panning
  • Support for MOD, WAV, AIFF, MP3/MP2/MP1, OGG, WMA, FLAC, MIDI, WV, SPX, MPC, AC3, AAC, ALAC, TTA, and APE formats
  • Support for multiple sound effects that can be applied instantly
  • In-game radio station adjustment support
  • Audio pack system for organizing audio files and ensuring easy distribution among clients
  • Local file transfers with CRC checks and remote file transfers with file size checks to ensure that files do not get re-downloaded
Changelog

GitHub Commit History (Client)
GitHub Commit History (Server)

Refer to the CHANGES file the server binary package for the full changelog.

Natives
  • Audio_CreateTCPServer(port);
    • Creates the TCP server
      Note #1: This must be on the same port that the SA-MP server is using. It must also be forwarded properly.
      Note #2: This is done automatically via callback hooking.

  • Audio_DestroyTCPServer();
    • Destroys the TCP server

  • Audio_SetPack(const audiopack[], bool:transferable = true, bool:automated = true);
    • Maps audio files specified under the audio pack name in audio.ini and specifies whether the audio pack should be transferable and automated
      Note #1: If the pack is not transferable, no CRC or file size checks will take place server-side. The files in the pack will only be checked if they exist client-side.
      Note #2: If the pack is automated, it will transfer to all connected players as soon as it is set and to all future players as soon as they connect. If it is not automated, the Audio_TransferPack native must be used instead.

  • Audio_IsClientConnected(playerid);
    • Returns the player's TCP server connection status

  • Audio_SendMessage(playerid, const message[]);
    • Sends a custom message to a player
      Note: This message will appear in the player's log if logging is enabled client-side.

  • Audio_TransferPack(playerid);
    • Transfers the currently set audio pack to a player
      Note: If automatic transfers are enabled, this native will not work.

  • Audio_CreateSequence();
    • Creates a sequence
      Note: This returns a sequence ID.

  • Audio_DestroySequence(sequenceid);
    • Destroys a sequence

  • Audio_AddToSequence(sequenceid, audioid);
    • Adds a mapped audio file to a sequence

  • Audio_RemoveFromSequence(sequenceid, audioid);
    • Removes all instances of a mapped audio file from a sequence

  • Audio_Play(playerid, audioid, bool:pause = false, bool:loop = false, bool:downmix = false);
    • Plays a mapped audio file for a player and specifies whether it should start paused, whether it should be looped, and whether the audio stream should be downmixed to mono
      Note: This returns a handle ID.

  • Audio_PlayStreamed(playerid, const url[], bool:pause = false, bool:loop = false, bool:downmix = false);
    • Streams a URL for a player and specifies whether it should start paused, whether it should be looped, and whether the audio stream should be downmixed to mono
      Note: This returns a handle ID.

  • Audio_PlaySequence(playerid, sequenceid, bool:pause = false, bool:loop = false, bool:downmix = false);
    • Plays a sequence for a player and specifies whether it should start paused, whether it should be looped, and whether the audio stream should be downmixed to mono
      Note: This returns a handle ID.

  • Audio_Pause(playerid, handleid);
    • Pauses playback for an audio stream assigned to a player's handle ID

  • Audio_Resume(playerid, handleid);
    • Resumes playback for an audio stream assigned to a player's handle ID

  • Audio_Stop(playerid, handleid);
    • Stops playback for an audio stream assigned to a player's handle ID

  • Audio_Restart(playerid, handleid);
    • Restarts playback for an audio stream assigned to a player's handle ID

  • Audio_GetPosition(playerid, handleid, const callback[] = "Audio_OnGetPosition");
    • Gets the position in seconds for an audio stream assigned to a player's handle ID and stores it in the specified callback
      Note: The callback, by default, is Audio_OnGetPosition. A custom callback may be used that resembles the form of the default callback, but it must be forwarded in the script.

  • Audio_SetPosition(playerid, handleid, seconds);
    • Sets position in seconds for an audio stream assigned to a player's handle ID

  • Audio_SetVolume(playerid, handleid, volume);
    • Adjusts volume (0-100) for an audio stream assigned to a player's handle ID

  • Audio_SetFX(playerid, handleid, type);
    • Applies a sound effect to an audio stream assigned to a player's handle ID
      Note: Valid values for type are as follows:
      • 0: Chorus
      • 1: Compression
      • 2: Distortion
      • 3: Echo
      • 4: Flanger
      • 5: Gargle
      • 6: I3DL2 Reverb
      • 7: Parametric Equalizer
      • 8: Reverb

  • Audio_RemoveFX(playerid, handleid, type);
    • Removes a sound effect from an audio stream assigned to a player's handle ID
      Note: Valid values for type are listed above.

  • Audio_Set3DPosition(playerid, handleid, Float:x, Float:y, Float:z, Float:distance);
    • Sets the 3D position (game world coordinates) of an audio stream assigned to a player's handle ID
      Note: The audio stream must be downmixed to mono (see the last parameter of Audio_Play, Audio_PlayStreamed, and Audio_PlaySequence) for panning to work properly.

  • Audio_SetRadioStation(playerid, station);
    • Sets a player's current in-game radio station
      Note: Valid values for station are as follows:
      • 0: Radio Off (Emergency Vehicle Radio)
      • 1: Playback FM
      • 2: K-Rose
      • 3: K-DST
      • 4: Bounce FM
      • 5: SF-UR
      • 6: Radio Los Santos
      • 7: Radio X
      • 8: CSR 103.9
      • 9: K-Jah West
      • 10: Master Sounds 98.3
      • 11: WCTR
      • 12: User Track Player

  • Audio_StopRadio(playerid);
    • Stops, or turns off, a player's in-game radio station
Callbacks
  • Audio_OnClientConnect(playerid);
    • Called when a player connects to the TCP server

  • Audio_OnClientDisconnect(playerid);
    • Called when a player disconnects from the TCP server

  • Audio_OnTransferFile(playerid, file[], current, total, result);
    • Called when a player completes the transfer of a file
      Note: The result can be one of the following:
      • 0: Local file downloaded successfully
      • 1: Remote file downloaded successfully
      • 2: File passed CRC check or file size check
      • 3: Error transferring or checking file

  • Audio_OnPlay(playerid, handleid);
    • Called when a player starts any event associated with a handle ID

  • Audio_OnStop(playerid, handleid);
    • Called when a player stops any event associated with a handle ID

  • Audio_OnTrackChange(playerid, handleid, track[]);
    • Called when a player reports that a track change has occurred in an online station

  • Audio_OnRadioStationChange(playerid, station);
    • Called when a player changes the radio station in-game

  • Audio_OnGetPosition(playerid, handleid, seconds);
    • Called by default when a result from Audio_GetPosition is retrieved
Download

GitHub Releases Page (Client)
GitHub Releases Page (Server)

The client repository can be browsed here, and the server repository can be browsed here. These repositories can also be cloned.

The Windows version requires the Microsoft Visual C++ 2010 Redistributable Package.
Reply
#2

Tutorial

Client:

Installation and use of the client plugin is simple. Just run the installer and extract the files to the GTA: San Andreas directory. The ASI plugin detects when SA-MP is loaded and obtains the current player name, server address, and server port automatically. It will then attempt to connect to the TCP server (if there is one) some time after the game has started. By default, there will be a total of ten retry attempts with a delay of ten seconds each. To adjust these numbers, along with a few other settings, audio.ini will need to be edited. To locate this file, go to Start, click Run, and type in the following:

Code:
%APPDATA%\SA-MP Audio Plugin
An Explorer window should open. This directory contains all downloaded audio packs, audio.ini, and audio.txt. Note that these files will only be created once the audio plugin is loaded for the first time.

Server:

Create a directory called "plugins" inside of the server directory if one does not already exist. Place the plugin file (audio.dll or audio.so) inside of this directory.

Add the following line to server.cfg so that the plugin will load the next time the server starts:

Windows:
Code:
plugins audio.dll
Linux:
Code:
plugins audio.so
On Windows, add audio.inc to the pawno\include folder. Include this file in any of the scripts the server is running:

pawn Code:
#include <audio>
Recompile the scripts with any desired natives and callbacks provided by the include file. Start the server.

The server log should indicate that the TCP server was created successfully on the same port that the SA-MP sever is using.

Ensure that both the audiopacks folder and the audio.ini file are in the root directory of the server. Open audio.ini and add a section for the audio pack name. For demonstration purposes, this will be called "default_pack":

Code:
[default_pack]
Navigate to the audiopacks directory and create a folder called "default_pack" within it. This is where all of the local audio files will go. Add an audio file to the "default_pack" folder. This will be called "file.wav". Map it under the section that was just created in audio.ini:

Code:
[default_pack]
1 = file.wav
The number to the left of the file name (1) is the audio ID. It is completely arbitrary. It can be used in Audio_Play like this:

pawn Code:
Audio_Play(playerid, 1);
Remote files that don't need to be in the audiopacks directory can also be mapped. They must start with "http://". Here is an example:

Code:
[default_pack]
1 = file.wav
2 = http://www.website.com/file.wav
Now the audio pack simply needs to be set when the gamemode loads:

pawn Code:
public OnGameModeInit()
{
    Audio_SetPack("default_pack");
}
Alternatively, it is possible to completely ignore audio.ini and stream all of the files with the Audio_PlayStreamed native instead. This will consume more client-side bandwidth, however, if the files are played repeatedly.

More detailed examples of nearly every native and callback can be found in the filterscript.
Reply
#3

Quote:
Originally Posted by Incognito
  • Support for .wav, .ogg, .mp3, .mod, .it, .s3d, and .xm files (automatic file type filtering is present on both the client and the server)
Haha, just yesterday I thought about Pghpunkid's Scriptplayer that "it would be awesome to play .mod, .it, .s3d, and .xm files(ah dreams)" and today I see this plugin!
Great job!
Reply
#4

Wow,great development!
Reply
#5

OMG nice job!!!
Reply
#6

niiiiiiiiiiiiiiiiiiiiice !!!!!
Reply
#7

Nice job, but I think I'll use Punk kids when it comes out, I'v supported his project this far.

I'm still going to tets though, sound sinteresting.
Reply
#8

This is amazing! Good work.
Reply
#9

It's really cool !!!!!

Small suggestion: add GetPluginVersion to simplify the comparison of the client version and version of plugin
Reply
#10

Is there a program or some other way to fill audio.inc with names of all the files existed in audiopacks(or only some folders there) folder?
I mean, it's pretty annoying to copy/paste file names, especially if it's about 30 of them..

P.S. Testing, works great
Reply
#11

And where did the idea come from?


Anyway,you did it,and it came out good.
While we're at it,why don't you make sounds downloadable from a website?
Reply
#12

Thanks for the feedback so far!

Quote:
Originally Posted by MrFredo
It's really cool !!!!!

Small suggestion: add GetPluginVersion to simplify the comparison of the client version and version of plugin
At some point, the plugin version may differ from the client version, making any such comparison irrelvant. Besides, you should always know what your plugin version is.

Quote:
Originally Posted by CrαcK
Is there a program or some other way to fill audio.inc with names of all the files existed in audiopacks(or only some folders there) folder?
I mean, it's pretty annoying to copy/paste file names, especially if it's about 30 of them..

P.S. Testing, works great
I believe one of my testers made a batch file that does this. I will update the reserved post with tutorials and other helpful information when I find time.

Quote:
Originally Posted by Karlip
And where did the idea come from?


Anyway,you did it,and it came out good.
While we're at it,why don't you make sounds downloadable from a website?
I think it is obvious where the idea originated.

Audio packs can already be downloaded from another source and put in the "audiopacks" folder where the client resides. This will circumvent the need to download them from the server. Additionally, as I said in the first post, remote file downloading is a feature I plan to add in the future.
Reply
#13

Quote:
Originally Posted by CrαcK
Quote:
Originally Posted by Incognito
  • Support for .wav, .ogg, .mp3, .mod, .it, .s3d, and .xm files (automatic file type filtering is present on both the client and the server)
Haha, just yesterday I thought about Pghpunkid's Scriptplayer that "it would be awesome to play .mod, .it, .s3d, and .xm files(ah dreams)" and today I see this plugin!
Great job!
Mine may not play .mod .it .s3d or .xm, but mine plays .mp3 and .wma.
Reply
#14

This is awesome.
Reply
#15

Good job Incognito, tested yesterday and works really good

Here mirrors for you:

http://files.sneakyhost.net/audio_client_v01.rar
http://files.sneakyhost.net/audio_plugin_v01.rar
http://files.sneakyhost.net/audio_source_v01.rar
Reply
#16

If you disconnect whilst a sound is playing, a horrible noise will occur. It can be fixed externally by using the audio stop native, but it would be nice if it was fixed internally too.

I'm writing a mini add-on that detects when a player pauses using OnPlayerUpdate, and pauses the audio appropriately. I'll post it here in a moment.

Nice work.
Reply
#17

The plugins do not work on ubuntu.
The sounds are not send to client
Reply
#18

Quote:
Originally Posted by MrFredo
The plugins do not work on ubuntu.
The sounds are not send to client
try to recompile the pluginsource on ubuntu
Reply
#19

I try but I have errors when I compile: s
Reply
#20

Very nice release
Reply


Forum Jump:


Users browsing this thread: 25 Guest(s)