summaryrefslogtreecommitdiff
path: root/libs/evoral/src
diff options
context:
space:
mode:
Diffstat (limited to 'libs/evoral/src')
-rw-r--r--libs/evoral/src/SMF.cpp27
-rw-r--r--libs/evoral/src/libsmf/smf.h4
-rw-r--r--libs/evoral/src/libsmf/smf_load.c17
-rw-r--r--libs/evoral/src/libsmf/smf_save.c29
4 files changed, 38 insertions, 39 deletions
diff --git a/libs/evoral/src/SMF.cpp b/libs/evoral/src/SMF.cpp
index 73e3651f45..007055def8 100644
--- a/libs/evoral/src/SMF.cpp
+++ b/libs/evoral/src/SMF.cpp
@@ -26,6 +26,7 @@
#include "evoral/Event.hpp"
#include "evoral/SMF.hpp"
#include "evoral/midi_util.h"
+#include "pbd/file_manager.h"
using namespace std;
@@ -82,7 +83,14 @@ SMF::open(const std::string& path, int track) THROW_FILE_ERROR
}
_file_path = path;
- _smf = smf_load(_file_path.c_str());
+
+ PBD::StdioFileDescriptor d (_file_path, "r");
+ FILE* f = d.allocate ();
+ if (f == 0) {
+ return -1;
+ }
+
+ _smf = smf_load (f);
if (_smf == NULL) {
return -1;
}
@@ -149,7 +157,13 @@ void
SMF::close() THROW_FILE_ERROR
{
if (_smf) {
- if (smf_save(_smf, _file_path.c_str()) != 0) {
+ PBD::StdioFileDescriptor d (_file_path, "w+");
+ FILE* f = d.allocate ();
+ if (f == 0) {
+ throw FileError ();
+ }
+
+ if (smf_save(_smf, f) != 0) {
throw FileError();
}
smf_delete(_smf);
@@ -259,8 +273,15 @@ SMF::begin_write()
void
SMF::end_write() THROW_FILE_ERROR
{
- if (smf_save(_smf, _file_path.c_str()) != 0)
+ PBD::StdioFileDescriptor d (_file_path, "w+");
+ FILE* f = d.allocate ();
+ if (f == 0) {
+ throw FileError ();
+ }
+
+ if (smf_save(_smf, f) != 0) {
throw FileError();
+ }
}
double
diff --git a/libs/evoral/src/libsmf/smf.h b/libs/evoral/src/libsmf/smf.h
index 212105c5d0..5e3e2d1859 100644
--- a/libs/evoral/src/libsmf/smf.h
+++ b/libs/evoral/src/libsmf/smf.h
@@ -387,11 +387,11 @@ char *smf_event_decode(const smf_event_t *event) WARN_UNUSED_RESULT;
char *smf_event_extract_text(const smf_event_t *event) WARN_UNUSED_RESULT;
/* Routines for loading SMF files. */
-smf_t *smf_load(const char *file_name) WARN_UNUSED_RESULT;
+smf_t *smf_load(FILE *) WARN_UNUSED_RESULT;
smf_t *smf_load_from_memory(const void *buffer, const size_t buffer_length) WARN_UNUSED_RESULT;
/* Routine for writing SMF files. */
-int smf_save(smf_t *smf, const char *file_name) WARN_UNUSED_RESULT;
+int smf_save(smf_t *smf, FILE *file) WARN_UNUSED_RESULT;
/* Routines for manipulating smf_tempo_t. */
smf_tempo_t *smf_get_tempo_by_pulses(const smf_t *smf, size_t pulses) WARN_UNUSED_RESULT;
diff --git a/libs/evoral/src/libsmf/smf_load.c b/libs/evoral/src/libsmf/smf_load.c
index 71ad02498e..cebca73b82 100644
--- a/libs/evoral/src/libsmf/smf_load.c
+++ b/libs/evoral/src/libsmf/smf_load.c
@@ -794,12 +794,11 @@ parse_mtrk_chunk(smf_track_t *track)
}
/**
- * Allocate buffer of proper size and read file contents into it. Close file afterwards.
+ * Allocate buffer of proper size and read file contents into it.
*/
static int
-load_file_into_buffer(void **file_buffer, size_t *file_buffer_length, const char *file_name)
+load_file_into_buffer(void **file_buffer, size_t *file_buffer_length, FILE* stream)
{
- FILE *stream = fopen(file_name, "r");
long offset;
if (stream == NULL) {
@@ -841,12 +840,6 @@ load_file_into_buffer(void **file_buffer, size_t *file_buffer_length, const char
return (-6);
}
- if (fclose(stream)) {
- g_critical("fclose(3) failed: %s", strerror(errno));
-
- return (-7);
- }
-
return (0);
}
@@ -903,17 +896,17 @@ smf_load_from_memory(const void *buffer, const size_t buffer_length)
/**
* Loads SMF file.
*
- * \param file_name Path to the file.
+ * \param file Open file.
* \return SMF or NULL, if loading failed.
*/
smf_t *
-smf_load(const char *file_name)
+smf_load(FILE *file)
{
size_t file_buffer_length;
void *file_buffer;
smf_t *smf;
- if (load_file_into_buffer(&file_buffer, &file_buffer_length, file_name))
+ if (load_file_into_buffer(&file_buffer, &file_buffer_length, file))
return (NULL);
smf = smf_load_from_memory(file_buffer, file_buffer_length);
diff --git a/libs/evoral/src/libsmf/smf_save.c b/libs/evoral/src/libsmf/smf_save.c
index 1a7a726675..b03bf90044 100644
--- a/libs/evoral/src/libsmf/smf_save.c
+++ b/libs/evoral/src/libsmf/smf_save.c
@@ -391,29 +391,14 @@ write_track(smf_track_t *track)
* Takes smf->file_buffer and saves it to the file.
*/
static int
-write_file(smf_t *smf, const char *file_name)
+write_file(smf_t *smf, FILE* stream)
{
- FILE *stream;
-
- stream = fopen(file_name, "w+");
- if (stream == NULL) {
- g_critical("Cannot open input file: %s", strerror(errno));
-
- return (-1);
- }
-
if (fwrite(smf->file_buffer, 1, smf->file_buffer_length, stream) != smf->file_buffer_length) {
g_critical("fwrite(3) failed: %s", strerror(errno));
return (-2);
}
- if (fclose(stream)) {
- g_critical("fclose(3) failed: %s", strerror(errno));
-
- return (-3);
- }
-
return (0);
}
@@ -593,11 +578,11 @@ assert_smf_is_identical(const smf_t *a, const smf_t *b)
}
static void
-assert_smf_saved_correctly(const smf_t *smf, const char *file_name)
+assert_smf_saved_correctly(const smf_t *smf, FILE* file)
{
smf_t *saved;
- saved = smf_load(file_name);
+ saved = smf_load (file);
assert(saved != NULL);
assert_smf_is_identical(smf, saved);
@@ -610,11 +595,11 @@ assert_smf_saved_correctly(const smf_t *smf, const char *file_name)
/**
* Writes the contents of SMF to the file given.
* \param smf SMF.
- * \param file_name Path to the file.
+ * \param file File descriptor.
* \return 0, if saving was successfull.
*/
int
-smf_save(smf_t *smf, const char *file_name)
+smf_save(smf_t *smf, FILE* file)
{
int i, error;
smf_track_t *track;
@@ -641,7 +626,7 @@ smf_save(smf_t *smf, const char *file_name)
}
}
- error = write_file(smf, file_name);
+ error = write_file(smf, file);
free_buffer(smf);
@@ -649,7 +634,7 @@ smf_save(smf_t *smf, const char *file_name)
return (error);
#ifndef NDEBUG
- assert_smf_saved_correctly(smf, file_name);
+ assert_smf_saved_correctly(smf, file);
#endif
return (0);