diff --git a/src/audio.c b/src/audio.c
index 0be257d95..8a8ca4ef7 100644
--- a/src/audio.c
+++ b/src/audio.c
@@ -59,6 +59,7 @@
 // Defines and Macros
 //----------------------------------------------------------------------------------
 #define MUSIC_STREAM_BUFFERS        2
+#define MAX_AUDIO_CONTEXTS          4
 
 #if defined(PLATFORM_RPI) || defined(PLATFORM_ANDROID)
     // NOTE: On RPI and Android should be lower to avoid frame-stalls
@@ -90,6 +91,19 @@ typedef struct Music {
     bool chipTune; // True if chiptune is loaded
 } Music;
 
+// Audio Context, used to create custom audio streams that are not bound to a sound file. There can be
+// no more than 4 concurrent audio contexts in use. This is due to each active context being tied to
+// a dedicated mix channel.
+typedef struct AudioContext_t {
+    unsigned short sampleRate;         // default is 48000
+    unsigned char bitsPerSample;       // 16 is default
+    unsigned char mixChannel;          // 0-3 or mixA-mixD, each mix channel can receive up to one dedicated audio stream
+    unsigned char channels;            // 1=mono, 2=stereo
+    ALenum alFormat;                   // openAL format specifier
+    ALuint alSource;                   // openAL source
+    ALuint alBuffer[2];                // openAL sample buffer
+} AudioContext_t;
+
 #if defined(AUDIO_STANDALONE)
 typedef enum { INFO = 0, ERROR, WARNING, DEBUG, OTHER } TraceLogType;
 #endif
@@ -97,9 +111,10 @@ typedef enum { INFO = 0, ERROR, WARNING, DEBUG, OTHER } TraceLogType;
 //----------------------------------------------------------------------------------
 // Global Variables Definition
 //----------------------------------------------------------------------------------
+static AudioContext_t* mixChannelsActive_g[MAX_AUDIO_CONTEXTS]; // What mix channels are currently active
 static bool musicEnabled = false;
-static Music currentMusic;      // Current music loaded
-                                // NOTE: Only one music file playing at a time
+static Music currentMusic;          // Current music loaded
+                                    // NOTE: Only one music file playing at a time
 
 //----------------------------------------------------------------------------------
 // Module specific Functions Declaration
@@ -164,6 +179,92 @@ void CloseAudioDevice(void)
     alcCloseDevice(device);
 }
 
+// True if call to InitAudioDevice() was successful and CloseAudioDevice() has not been called yet
+bool IsAudioDeviceReady(void)
+{
+    ALCcontext *context = alcGetCurrentContext();
+    if (context == NULL) return false;
+    else{
+        ALCdevice *device = alcGetContextsDevice(context);
+        if (device == NULL) return false;
+        else return true;
+    }
+}
+
+//----------------------------------------------------------------------------------
+// Module Functions Definition - Custom audio output
+//----------------------------------------------------------------------------------
+
+// Audio contexts are for outputing custom audio waveforms, This will shut down any other sound sources currently playing
+// The mixChannel is what mix channel you want to operate on, 0-3 are the ones available. Each mix channel can only be used one at a time.
+// exmple usage is InitAudioContext(48000, 16, 0, 2); // stereo, mixchannel 1, 16bit, 48khz
+AudioContext InitAudioContext(unsigned short sampleRate, unsigned char bitsPerSample, unsigned char mixChannel, unsigned char channels)
+{
+    if(mixChannel > MAX_AUDIO_CONTEXTS) return NULL;
+    if(!IsAudioDeviceReady()) InitAudioDevice();
+    else StopMusicStream();
+    
+    if(!mixChannelsActive_g[mixChannel]){
+        AudioContext_t *ac = malloc(sizeof(AudioContext_t));
+        ac->sampleRate = sampleRate;
+        ac->bitsPerSample = bitsPerSample;
+        ac->mixChannel = mixChannel;
+        ac->channels = channels;
+        mixChannelsActive_g[mixChannel] = ac;
+        
+        // setup openAL format
+        if (channels == 1)
+        {
+            if (bitsPerSample == 8 ) ac->alFormat = AL_FORMAT_MONO8;
+            else if (bitsPerSample == 16) ac->alFormat = AL_FORMAT_MONO16;
+        }
+        else if (channels == 2)
+        {
+            if (bitsPerSample == 8 ) ac->alFormat = AL_FORMAT_STEREO8;
+            else if (bitsPerSample == 16) ac->alFormat = AL_FORMAT_STEREO16;
+        }
+        
+        // Create an audio source
+        alGenSources(1, &ac->alSource);
+        alSourcef(ac->alSource, AL_PITCH, 1);
+        alSourcef(ac->alSource, AL_GAIN, 1);
+        alSource3f(ac->alSource, AL_POSITION, 0, 0, 0);
+        alSource3f(ac->alSource, AL_VELOCITY, 0, 0, 0);
+        
+        // Create Buffer
+        alGenBuffers(2, &ac->alBuffer);
+        
+        
+        return ac;
+    }
+    return NULL;
+}
+
+// Frees buffer in audio context
+void CloseAudioContext(AudioContext ctx)
+{
+    AudioContext_t *context = (AudioContext_t*)ctx;
+    if(context){
+        alDeleteSources(1, &context->alSource);
+        alDeleteBuffers(2, &context->alBuffer);
+        mixChannelsActive_g[context->mixChannel] = NULL;
+        free(context);
+        ctx = NULL;
+    }
+}
+
+// Pushes more audio data into context mix channel, if none are ever pushed then zeros are fed in
+void UpdateAudioContext(AudioContext ctx, void *data, unsigned short *dataLength)
+{
+    AudioContext_t *context = (AudioContext_t*)ctx;
+    if(!musicEnabled && context && mixChannelsActive_g[context->mixChannel] == context)
+    {
+        ;
+    }
+}
+
+
+
 //----------------------------------------------------------------------------------
 // Module Functions Definition - Sounds loading and playing (.WAV)
 //----------------------------------------------------------------------------------
diff --git a/src/audio.h b/src/audio.h
index ed1565320..9c681044b 100644
--- a/src/audio.h
+++ b/src/audio.h
@@ -41,7 +41,9 @@
 //----------------------------------------------------------------------------------
 #ifndef __cplusplus
 // Boolean type
-typedef enum { false, true } bool;
+    #ifndef true
+        typedef enum { false, true } bool;
+    #endif
 #endif
 
 // Sound source type
@@ -59,6 +61,11 @@ typedef struct Wave {
     short channels;
 } Wave;
 
+// Audio Context, used to create custom audio streams that are not bound to a sound file. There can be
+// no more than 4 concurrent audio contexts in use. This is due to each active context being tied to
+// a dedicated mix channel.
+typedef void* AudioContext;
+
 #ifdef __cplusplus
 extern "C" {            // Prevents name mangling of functions
 #endif
@@ -73,6 +80,14 @@ extern "C" {            // Prevents name mangling of functions
 //----------------------------------------------------------------------------------
 void InitAudioDevice(void);                                     // Initialize audio device and context
 void CloseAudioDevice(void);                                    // Close the audio device and context (and music stream)
+bool IsAudioDeviceReady(void);                                  // True if call to InitAudioDevice() was successful and CloseAudioDevice() has not been called yet
+
+// Audio contexts are for outputing custom audio waveforms, This will shut down any other sound sources currently playing
+// The mixChannel is what mix channel you want to operate on, 0-3 are the ones available. Each mix channel can only be used one at a time.
+// exmple usage is InitAudioContext(48000, 16, 0, 2); // stereo, mixchannel 1, 16bit, 48khz
+AudioContext InitAudioContext(unsigned short sampleRate, unsigned char bitsPerSample, unsigned char mixChannel, unsigned char channels);
+void CloseAudioContext(AudioContext ctx);                       // Frees audio context
+void UpdateAudioContext(AudioContext ctx, void *data, unsigned short *dataLength); // Pushes more audio data into context mix channel, if none are ever pushed then zeros are fed in
 
 Sound LoadSound(char *fileName);                                // Load sound to memory
 Sound LoadSoundFromWave(Wave wave);                             // Load sound to memory from wave data
@@ -92,7 +107,7 @@ void PauseMusicStream(void);                                    // Pause music p
 void ResumeMusicStream(void);                                   // Resume playing paused music
 bool MusicIsPlaying(void);                                      // Check if music is playing
 void SetMusicVolume(float volume);                              // Set volume for music (1.0 is max level)
-float GetMusicTimeLength(void);                                 // Get current music time length (in seconds)
+float GetMusicTimeLength(void);                                 // Get music time length (in seconds)
 float GetMusicTimePlayed(void);                                 // Get current music time played (in seconds)
 
 #ifdef __cplusplus
diff --git a/src/raylib.h b/src/raylib.h
index 699fbbdb6..8390d1761 100644
--- a/src/raylib.h
+++ b/src/raylib.h
@@ -446,6 +446,11 @@ typedef struct Wave {
     short channels;
 } Wave;
 
+// Audio Context, used to create custom audio streams that are not bound to a sound file. There can be
+// no more than 4 concurrent audio contexts in use. This is due to each active context being tied to
+// a dedicated mix channel.
+typedef void* AudioContext;
+
 // Texture formats
 // NOTE: Support depends on OpenGL version and platform
 typedef enum {
@@ -863,6 +868,14 @@ void DrawPhysicObjectInfo(PhysicObject *pObj, Vector2 position, int fontSize);
 //------------------------------------------------------------------------------------
 void InitAudioDevice(void);                                     // Initialize audio device and context
 void CloseAudioDevice(void);                                    // Close the audio device and context (and music stream)
+bool IsAudioDeviceReady(void);                                  // True if call to InitAudioDevice() was successful and CloseAudioDevice() has not been called yet
+
+// Audio contexts are for outputing custom audio waveforms, This will shut down any other sound sources currently playing
+// The mixChannel is what mix channel you want to operate on, 0-3 are the ones available. Each mix channel can only be used one at a time.
+// exmple usage is InitAudioContext(48000, 16, 0, 2); // stereo, mixchannel 1, 16bit, 48khz
+AudioContext InitAudioContext(unsigned short sampleRate, unsigned char bitsPerSample, unsigned char mixChannel, unsigned char channels);
+void CloseAudioContext(AudioContext ctx);                       // Frees audio context
+void UpdateAudioContext(AudioContext ctx, void *data, unsigned short *dataLength); // Pushes more audio data into context mix channel, if none are ever pushed then zeros are fed in
 
 Sound LoadSound(char *fileName);                                // Load sound to memory
 Sound LoadSoundFromWave(Wave wave);                             // Load sound to memory from wave data