Starting implementation (mostly still placeholders)
authorJean-Marc Valin <jmvalin@jmvalin.ca>
Mon, 24 Apr 2017 21:45:20 +0000 (17:45 -0400)
committerJean-Marc Valin <jmvalin@jmvalin.ca>
Mon, 24 Apr 2017 21:45:53 +0000 (17:45 -0400)
include/opusenc.h
src/opusenc.c

index 7c8a7f2..f26cc04 100644 (file)
@@ -34,6 +34,9 @@ extern "C" {
 
 #include "opus.h"
 
+#define OPE_OK 0
+#define OPE_ERROR_CANNOT_OPEN -10
+
 typedef int (*ope_write_func)(void *user_data, const unsigned char *ptr, int len);
 
 typedef int (*ope_close_func)(void *user_data);
@@ -51,11 +54,11 @@ typedef struct OggOpusComments OggOpusComments;
 
 /** Create a new OggOpus file. */
 OggOpusEnc *ope_create_file(const char *path, const OggOpusComments *comments,
-  int rate, int channels, int family, int *error);
+    int rate, int channels, int family, int *error);
 
 /** Create a new OggOpus file (callback-based). */
-OggOpusEnc *ope_create_callbacks(OpusEncCallbacks *callbacks, const OggOpusComments *comments,
-  void *user_data, int rate, int channels, int family, int *error);
+OggOpusEnc *ope_create_callbacks(const OpusEncCallbacks *callbacks, void *user_data,
+    const OggOpusComments *comments, int rate, int channels, int family, int *error);
 
 /** Add/encode any number of float samples to the file. */
 int ope_write_float(OggOpusEnc *enc, float *pcm, int samples_per_channel);
index 2a6cfaf..e8115cf 100644 (file)
 #endif
 
 #include <stdlib.h>
+#include <stdio.h>
 #include "opusenc.h"
 
+int stdio_write(void *user_data, const unsigned char *ptr, int len) {
+  return fwrite(ptr, 1, len, (FILE*)user_data) != len;
+}
+
+static const OpusEncCallbacks stdio_callbacks = {
+  stdio_write,
+  fclose
+};
+
 /* Create a new OggOpus file. */
 OggOpusEnc *ope_create_file(const char *path, const OggOpusComments *comments,
-  int rate, int channels, int family, int *error) {
-  return NULL;
+    int rate, int channels, int family, int *error) {
+  FILE *file = fopen(path, "wb");
+  if (!file) {
+    if (error) *error = OPE_ERROR_CANNOT_OPEN;
+    return NULL;
+  }
+  return ope_create_callbacks(&stdio_callbacks, file, comments, rate, channels, family, error);
 }
 
 /* Create a new OggOpus file (callback-based). */
-OggOpusEnc *ope_create_callbacks(OpusEncCallbacks *callbacks, const OggOpusComments *comments,
-  void *user_data, int rate, int channels, int family, int *error) {
+OggOpusEnc *ope_create_callbacks(const OpusEncCallbacks *callbacks, void *user_data,
+    const OggOpusComments *comments, int rate, int channels, int family, int *error) {
   return NULL;
 }