Browse Source

added tone player

Iver 1 month ago
parent
commit
f2d0a3282a
7 changed files with 99 additions and 16 deletions
  1. BIN
      builds/libyuzuparse.so
  2. BIN
      builds/main.bin
  3. 2 1
      changelog.txt
  4. 4 0
      src/headers/YZ_functions.h
  5. 13 0
      src/headers/YZ_types.h
  6. 27 15
      src/launch program/main.c
  7. 53 0
      src/main/main.c

BIN
builds/libyuzuparse.so


BIN
builds/main.bin


+ 2 - 1
changelog.txt

@@ -1 +1,2 @@
--removed licence
+-added tone player
+-new example

+ 4 - 0
src/headers/YZ_functions.h

@@ -18,4 +18,8 @@ void YZ_init_player();
 // Kills the player and frees memory
 void YZ_kill_player();
 
+// plays a tone defined by a function of time
+// the tone generator function must be a function of time that returns a delta that will be applied to the speaker position
+pa_tone_callback_data* YZ_play_tone(float (*tone_generator)(float, float), float sample_rate, float duration, float value);
+
 #endif

+ 13 - 0
src/headers/YZ_types.h

@@ -22,4 +22,17 @@ typedef struct {
     void* custom_pointer_for_end_function;
 } pa_callback_data;
 
+typedef struct {
+    float left_tone;
+    float right_tone;
+    float left_amplitude;
+    float right_amplitude;
+    float (*tone_generator)(float, float);
+    uint32_t current_sample;
+    uint32_t sample_count;
+    uint32_t sample_rate;
+    float duration;
+    float value; // a value that is passed into the tone generator. could be HZ for example
+} pa_tone_callback_data;
+
 #endif

+ 27 - 15
src/launch program/main.c

@@ -1,27 +1,39 @@
 #include "../headers/yuzuparse.h"
 
-void end_func(void* custom_pointer){
-    printf((char*)custom_pointer);
+float saw_wave_generator(float time, float value){
+    // play a VALUE hz note
+    
+    return fmodf(time * value * 2 + 1.0, 2.0) - 1.0;
+}
 
-    return;
+float sine_wave_generator(float time, float value){
+    // play a VALUE hz note
+    
+    return sin(time * value * 3.14159264 * 2);
 }
 
-int main(){
-    YZ_audio_stream* audio_stream = YZ_load_audio_file("audio/voice.wav", 0);
+float square_wave_generator(float time, float value){
+    // play a VALUE hz note
+    
+    return fmodf(time * value, 1) - fmodf(time * value + 0.5, 1);
+}
 
-    pa_callback_data* callback_data;
+float triangle_wave_generator(float time, float value){
+    // play a VALUE hz note
+    
+    return sin(time * value * 3.14159264 * 2);
+}
 
-    double speed = 1;
-    unsigned char should_loop_audio = 0;
-    double starting_second = 14;
+int main(){
+    pa_tone_callback_data* data;
 
-    char end_string[] = "sound has ended!\n";
+    data = YZ_play_tone(sine_wave_generator, 44100, 100, 220);
+    data = YZ_play_tone(sine_wave_generator, 44100, 100, 440);
+    data = YZ_play_tone(sine_wave_generator, 44100, 100, 880);
+    data = YZ_play_tone(sine_wave_generator, 44100, 100, 110);
 
-    if (audio_stream)
-        callback_data = YZ_play_stream_dynamic(audio_stream, &speed, &should_loop_audio, starting_second, end_func, end_string);
-    
-    // wait until audio is finished playing until exiting
-    while (callback_data->current_sample < callback_data->sample_count){}
+    while (data->current_sample < data->sample_count){
+    }
 
     YZ_kill_player();
 

+ 53 - 0
src/main/main.c

@@ -287,6 +287,35 @@ int portaudio_callback(const void* input, void* output, unsigned long frame_coun
         return 1;    
 }
 
+int tone_callback(const void* input, void* output, unsigned long frames_per_buffer, const PaStreamCallbackTimeInfo* time_info, PaStreamFlags status_flags, void* user_data){
+    pa_tone_callback_data* data = (pa_tone_callback_data*)user_data;
+    float *out = (float*)output;
+    unsigned long i;
+
+    for(i = 0; i < frames_per_buffer; i++){
+        *out++ = data->left_tone;
+        *out++ = data->right_tone;
+        
+        float delta = data->tone_generator((double)data->current_sample / (double)data->sample_rate, data->value);
+
+        data->left_tone = delta;
+        if(data->left_tone >= 1.0) data->left_tone = 1.0;
+        if(data->left_tone <= -1.0) data->left_tone = -1.0;
+        
+        data->right_tone = delta;
+        if(data->right_tone >= 1.0) data->right_tone = 1.0;
+        if(data->right_tone <= -1.0) data->right_tone = -1.0;
+    
+        data->current_sample++;
+    }
+
+    if (data->current_sample >= data->sample_count){
+        return 1;
+    }
+
+    return 0;
+}
+
 unsigned char player_is_initialized = 0;
 
 void YZ_init_player(){
@@ -365,3 +394,27 @@ pa_callback_data* YZ_play_stream(YZ_audio_stream* audio_stream){
 pa_callback_data* YZ_play_stream_dynamic(YZ_audio_stream* audio_stream, double* speed_multiplier, unsigned char* should_loop_audio, double starting_second, void (*end_func)(void*), void* custom_pointer_for_end_function){
     return play_stream(audio_stream, NULL, speed_multiplier, should_loop_audio, starting_second, end_func, custom_pointer_for_end_function);
 }
+
+pa_tone_callback_data* YZ_play_tone(float (*tone_generator)(float, float), float sample_rate, float duration, float value){
+    if (!player_is_initialized) YZ_init_player();
+
+    pa_tone_callback_data* callback_data = malloc(sizeof(pa_tone_callback_data));
+
+    callback_data->tone_generator = tone_generator;
+    callback_data->current_sample = 0;
+    callback_data->duration = duration;
+    callback_data->left_amplitude = 1;
+    callback_data->right_amplitude = 1;
+    callback_data->sample_rate = sample_rate;
+    callback_data->sample_count = duration * sample_rate;
+    callback_data->value = value;
+
+    PaStream* stream;
+
+    PaError error = Pa_OpenDefaultStream(&stream, 0, 2, paFloat32, sample_rate, paFramesPerBufferUnspecified, tone_callback, callback_data);
+    if(error != paNoError) { printf("PortAudio error: %d\n", error); exit(1);}
+
+    Pa_StartStream(stream);
+
+    return callback_data;
+}