From e75592dfd9e547d2528669e1d48e42ebfb67b2d1 Mon Sep 17 00:00:00 2001
From: casey langen <casey.langen@gmail.com>
Date: Wed, 29 Jan 2020 20:17:23 -0800
Subject: [PATCH] A couple minor bug fixes and also implemented sample code for
 streaming encoders.

---
 src/core/c_interface_wrappers.cpp |  7 +++++--
 src/core/musikcore_c.h            |  7 ++++---
 src/core_c_demo/main.c            | 24 +++++++++++++++++++++---
 3 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/src/core/c_interface_wrappers.cpp b/src/core/c_interface_wrappers.cpp
index c62230bca..95ec8c3cf 100644
--- a/src/core/c_interface_wrappers.cpp
+++ b/src/core/c_interface_wrappers.cpp
@@ -752,7 +752,10 @@ mcsdk_export mcsdk_encoder_type mcsdk_encoder_get_type(mcsdk_encoder e) {
     if (dynamic_cast<IBlockingEncoder*>(encoder) != nullptr) {
         return mcsdk_encoder_type_blocking;
     }
-    return mcsdk_encoder_type_streaming;
+    if (dynamic_cast<IStreamingEncoder*>(encoder) != nullptr) {
+        return mcsdk_encoder_type_streaming;
+    }
+    return mcsdk_encoder_type_none;
 }
 
 /*
@@ -795,7 +798,7 @@ mcsdk_export void mcsdk_streaming_encoder_finalize(mcsdk_streaming_encoder se, c
     STREAMINGENCODER(se)->Finalize(uri);
 }
 
-mcsdk_export void mcsdk_streaming_encoder_release(mcsdk_streaming_encoder se, mcsdk_encoder e) {
+mcsdk_export void mcsdk_streaming_encoder_release(mcsdk_streaming_encoder se) {
     RELEASE(se, STREAMINGENCODER);
 }
 
diff --git a/src/core/musikcore_c.h b/src/core/musikcore_c.h
index 5f6af1f58..93757b642 100644
--- a/src/core/musikcore_c.h
+++ b/src/core/musikcore_c.h
@@ -140,8 +140,9 @@ typedef enum mcsdk_resource_class {
 } mcsdk_resource_class;
 
 typedef enum mcsdk_encoder_type {
-    mcsdk_encoder_type_blocking = 0,
-    mcsdk_encoder_type_streaming = 1
+    mcsdk_encoder_type_none = 0,
+    mcsdk_encoder_type_blocking = 1,
+    mcsdk_encoder_type_streaming = 2
 } mcsdk_encoder_type;
 
 typedef enum mcsdk_audio_player_release_mode {
@@ -517,7 +518,7 @@ mcsdk_export bool mcsdk_streaming_encoder_initialize(mcsdk_streaming_encoder se,
 mcsdk_export int mcsdk_streaming_encoder_encode(mcsdk_streaming_encoder se, mcsdk_audio_buffer ab, char** data);
 mcsdk_export int mcsdk_streaming_encoder_flush(mcsdk_streaming_encoder se, char** data);
 mcsdk_export void mcsdk_streaming_encoder_finalize(mcsdk_streaming_encoder se, const char* uri);
-mcsdk_export void mcsdk_streaming_encoder_release(mcsdk_streaming_encoder se, mcsdk_encoder e);
+mcsdk_export void mcsdk_streaming_encoder_release(mcsdk_streaming_encoder se);
 
 /*
  * IDebug
diff --git a/src/core_c_demo/main.c b/src/core_c_demo/main.c
index a7efa99cd..982ff4880 100644
--- a/src/core_c_demo/main.c
+++ b/src/core_c_demo/main.c
@@ -33,20 +33,38 @@ static void test_decode_encode() {
         printf("test_decode_encode: decoding from %s\n", INPUT_FILE);
         printf("test_decode_encode: encoding to %s\n", OUTPUT_FILE);
         mcsdk_decoder decoder = mcsdk_env_open_decoder(in);
-        mcsdk_encoder encoder = mcsdk_env_open_encoder(".opus");
+        mcsdk_encoder encoder = mcsdk_env_open_encoder(".mp3");
         if (mcsdk_handle_ok(decoder) && mcsdk_handle_ok(encoder)) {
             printf("test_decode_encode: encoder and decoder opened successfully. running...\n");
+            mcsdk_audio_buffer buffer = mcsdk_env_create_audio_buffer(4096, 44100, 2);
             if (mcsdk_encoder_get_type(encoder) == mcsdk_encoder_type_blocking) {
                 mcsdk_blocking_encoder be = mcsdk_cast_handle(encoder);
-                mcsdk_audio_buffer buffer = mcsdk_env_create_audio_buffer(4096, 44100, 2);
                 if (mcsdk_blocking_encoder_initialize(be, out, 44100, 2, 192)) {
                     while (mcsdk_decoder_fill_buffer(decoder, buffer)) {
                         mcsdk_blocking_encoder_encode(be, buffer);
                     }
                     mcsdk_blocking_encoder_finalize(be);
                 }
-                mcsdk_audio_buffer_release(buffer);
+            } else if (mcsdk_encoder_get_type(encoder) == mcsdk_encoder_type_streaming) {
+                mcsdk_streaming_encoder se = mcsdk_cast_handle(encoder);
+                if (mcsdk_streaming_encoder_initialize(se, 44100, 2, 192)) {
+                    char* bytes = NULL;
+                    int length = 0;
+                    while (mcsdk_decoder_fill_buffer(decoder, buffer)) {
+                        length = mcsdk_streaming_encoder_encode(se, buffer, &bytes);
+                        if (bytes && length) {
+                            mcsdk_data_stream_write(out, bytes, length);
+                        }
+                    }
+                    length = mcsdk_streaming_encoder_flush(se, &bytes);
+                    if (bytes && length) {
+                        mcsdk_data_stream_write(out, bytes, length);
+                    }
+                    mcsdk_data_stream_close(out);
+                    mcsdk_streaming_encoder_finalize(se, OUTPUT_FILE);
+                }
             }
+            mcsdk_audio_buffer_release(buffer);
         }
         mcsdk_decoder_release(decoder);
         mcsdk_encoder_release(encoder);