| 
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -204,9 +204,9 @@ struct rAudioBuffer { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    bool paused;            // Audio buffer state: AUDIO_PAUSED | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    bool looping;           // Audio buffer looping, always true for AudioStreams | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    int usage;              // Audio buffer usage mode: STATIC or STREAM | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			     | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    bool isSubBufferProcessed[2]; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    unsigned int frameCursorPos; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    unsigned int frameCursorPos;        // Samples processed? | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    unsigned int bufferSizeInFrames; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			     | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rAudioBuffer *next; | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -402,7 +402,7 @@ static ma_uint32 OnAudioBufferDSPRead(ma_pcm_converter *pDSP, void *pFramesOut, | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        else | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            ma_uint32 firstFrameIndexOfThisSubBuffer = subBufferSizeInFrames * currentSubBufferIndex; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            ma_uint32 firstFrameIndexOfThisSubBuffer = subBufferSizeInFrames*currentSubBufferIndex; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            framesRemainingInOutputBuffer = subBufferSizeInFrames - (audioBuffer->frameCursorPos - firstFrameIndexOfThisSubBuffer); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -410,7 +410,7 @@ static ma_uint32 OnAudioBufferDSPRead(ma_pcm_converter *pDSP, void *pFramesOut, | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        if (framesToRead > framesRemainingInOutputBuffer) framesToRead = framesRemainingInOutputBuffer; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        memcpy((unsigned char *)pFramesOut + (framesRead*frameSizeInBytes), audioBuffer->buffer + (audioBuffer->frameCursorPos*frameSizeInBytes), framesToRead*frameSizeInBytes); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        audioBuffer->frameCursorPos = (audioBuffer->frameCursorPos + framesToRead) % audioBuffer->bufferSizeInFrames; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        audioBuffer->frameCursorPos = (audioBuffer->frameCursorPos + framesToRead)%audioBuffer->bufferSizeInFrames; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        framesRead += framesToRead; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        // If we've read to the end of the buffer, mark it as processed | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -877,7 +877,7 @@ void UpdateSound(Sound sound, const void *data, int samplesCount) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    StopAudioBuffer(audioBuffer); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // TODO: May want to lock/unlock this since this data buffer is read at mixing time. | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // TODO: May want to lock/unlock this since this data buffer is read at mixing time | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    memcpy(audioBuffer->buffer, data, samplesCount*audioBuffer->dsp.formatConverterIn.config.channels*ma_get_bytes_per_sample(audioBuffer->dsp.formatConverterIn.config.formatIn)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -1188,10 +1188,10 @@ Music LoadMusicStream(const char *fileName) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            music.loopCount = 0;   // Infinite loop by default | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            musicLoaded = true; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            TraceLog(LOG_DEBUG, "[%s] OGG total samples: %i", fileName, music.sampleCount); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            TraceLog(LOG_DEBUG, "[%s] OGG sample rate: %i", fileName, info.sample_rate); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            TraceLog(LOG_DEBUG, "[%s] OGG channels: %i", fileName, info.channels); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            TraceLog(LOG_DEBUG, "[%s] OGG memory required: %i", fileName, info.temp_memory_required); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            TraceLog(LOG_INFO, "[%s] OGG total samples: %i", fileName, music.sampleCount); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            TraceLog(LOG_INFO, "[%s] OGG sample rate: %i", fileName, info.sample_rate); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            TraceLog(LOG_INFO, "[%s] OGG channels: %i", fileName, info.channels); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            TraceLog(LOG_INFO, "[%s] OGG memory required: %i", fileName, info.temp_memory_required); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -1289,7 +1289,7 @@ Music LoadMusicStream(const char *fileName) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            music.loopCount = 0;   // Infinite loop by default | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            musicLoaded = true; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			             | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            TraceLog(LOG_INFO, "[%s] MOD number of samples: %i", fileName, music.sampleLeft); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            TraceLog(LOG_INFO, "[%s] MOD number of samples: %i", fileName, music.sampleCount); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            TraceLog(LOG_INFO, "[%s] MOD track length: %11.6f sec", fileName, (float)music.sampleCount/48000.0f); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    } | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -1354,10 +1354,10 @@ void PlayMusicStream(Music music) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        return; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // For music streams, we need to make sure we maintain the frame cursor position. This is hack for this section of code in UpdateMusicStream() | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    //     // NOTE: In case window is minimized, music stream is stopped, | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    //     // just make sure to play again on window restore | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    //     if (IsMusicPlaying(music)) PlayMusicStream(music); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // For music streams, we need to make sure we maintain the frame cursor position | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // This is a hack for this section of code in UpdateMusicStream() | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // NOTE: In case window is minimized, music stream is stopped, just make sure to  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    //  class="n">play  class="n">again on window restore: if (IsMusicPlaying(music)) PlayMusicStream(music); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    ma_uint32 frameCursorPos = audioBuffer->frameCursorPos; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    PlayAudioStream(music.stream); // <-- This resets the cursor position. | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -1528,7 +1528,7 @@ void SetMusicPitch(Music music, float pitch) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Set music loop count (loop repeats) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// NOTE: If set to o">-1, means infinite loop | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// NOTE: If set to mi">0, means infinite loop | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void SetMusicLoopCount(Music music, int count) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    music.loopCount = count; | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -1622,7 +1622,8 @@ void UpdateAudioStream(AudioStream stream, const void *data, int samplesCount) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        if (audioBuffer->isSubBufferProcessed[0] && audioBuffer->isSubBufferProcessed[1]) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            // Both buffers are available for updating. Update the first one and make sure the cursor is moved back to the front. | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            // Both buffers are available for updating.  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            // Update the first one and make sure the cursor is moved back to the front. | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            subBufferToUpdate = 0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            audioBuffer->frameCursorPos = 0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        } | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -1635,7 +1636,8 @@ void UpdateAudioStream(AudioStream stream, const void *data, int samplesCount) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        ma_uint32 subBufferSizeInFrames = audioBuffer->bufferSizeInFrames/2; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        unsigned char *subBuffer = audioBuffer->buffer + ((subBufferSizeInFrames*stream.channels*(stream.sampleSize/8))*subBufferToUpdate); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        // Does this API expect a whole buffer to be updated in one go? Assuming so, but if not will need to change this logic. | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        // Does this API expect a whole buffer to be updated in one go?  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        // Assuming so, but if not will need to change this logic. | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        if (subBufferSizeInFrames >= (ma_uint32)samplesCount/stream.channels) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            ma_uint32 framesToWrite = subBufferSizeInFrames; | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
				
				 | 
			
			 | 
			
			
 |