2010-02-09 22:45:13 -05:00
|
|
|
#ifndef __ardour_omftool__
|
|
|
|
#define __ardour_omftool__
|
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
#include <string>
|
|
|
|
#include <cstdio>
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <sqlite3.h>
|
|
|
|
|
|
|
|
class XMLNode;
|
|
|
|
|
|
|
|
class OMF {
|
|
|
|
public:
|
|
|
|
OMF ();
|
|
|
|
~OMF ();
|
|
|
|
|
|
|
|
int init ();
|
|
|
|
int load (const std::string&);
|
2010-02-10 17:15:04 -05:00
|
|
|
int create_xml ();
|
2010-02-09 22:45:13 -05:00
|
|
|
|
|
|
|
void set_version (int);
|
|
|
|
void set_session_name (const std::string&);
|
|
|
|
void set_sample_rate (int);
|
|
|
|
|
2010-02-10 17:15:04 -05:00
|
|
|
struct SourceInfo {
|
|
|
|
int channels;
|
|
|
|
int sample_rate;
|
|
|
|
uint64_t length;
|
|
|
|
XMLNode* node;
|
|
|
|
|
|
|
|
SourceInfo (int chn, int sr, uint64_t l, XMLNode* n)
|
|
|
|
: channels (chn), sample_rate (sr), length (l), node (n) {}
|
|
|
|
};
|
|
|
|
|
2010-02-09 22:45:13 -05:00
|
|
|
private:
|
|
|
|
bool bigEndian;
|
|
|
|
int64_t id_counter;
|
|
|
|
FILE* file;
|
|
|
|
sqlite3* db;
|
|
|
|
int version;
|
|
|
|
std::string base_dir;
|
|
|
|
std::string session_name;
|
|
|
|
std::vector<std::string> audiofile_path_vector;
|
2010-02-10 17:15:04 -05:00
|
|
|
int sample_rate; /* audio samples per second */
|
2017-09-18 12:39:17 -04:00
|
|
|
double sample_rate; /* time per video frame */
|
2010-02-09 22:45:13 -05:00
|
|
|
XMLNode* session;
|
|
|
|
XMLNode* sources;
|
|
|
|
XMLNode* routes;
|
|
|
|
XMLNode* regions;
|
|
|
|
XMLNode* playlists;
|
|
|
|
XMLNode* diskstreams;
|
|
|
|
XMLNode* locations;
|
|
|
|
XMLNode* options;
|
2015-10-05 10:17:49 -04:00
|
|
|
|
2010-02-09 22:45:13 -05:00
|
|
|
XMLNode* new_region_node ();
|
|
|
|
XMLNode* new_source_node ();
|
|
|
|
XMLNode* new_route_node ();
|
|
|
|
XMLNode* new_playlist_node ();
|
|
|
|
XMLNode* new_diskstream_node ();
|
2015-10-05 10:17:49 -04:00
|
|
|
|
2010-02-10 17:15:04 -05:00
|
|
|
typedef std::map<std::string,SourceInfo*> KnownSources;
|
2010-02-09 22:45:13 -05:00
|
|
|
KnownSources known_sources;
|
2015-10-05 10:17:49 -04:00
|
|
|
|
2010-02-10 17:15:04 -05:00
|
|
|
SourceInfo* get_known_source (const char*);
|
2010-02-09 22:45:13 -05:00
|
|
|
char* read_name (size_t offset, size_t length);
|
2010-02-10 17:15:04 -05:00
|
|
|
bool get_offset_and_length (const char* offstr, const char* lenstr, uint32_t& offset, uint32_t& len);
|
2010-02-09 22:45:13 -05:00
|
|
|
void name_types ();
|
2010-02-10 17:15:04 -05:00
|
|
|
void add_id (XMLNode*);
|
|
|
|
void set_route_node_channels (XMLNode* route, int in, int out, bool send_to_master);
|
|
|
|
bool get_audio_info (const std::string& path);
|
|
|
|
void set_region_sources (XMLNode*, SourceInfo*);
|
|
|
|
void legalize_name (std::string&);
|
2010-02-09 22:45:13 -05:00
|
|
|
|
|
|
|
uint16_t e16(uint16_t x)
|
|
|
|
{
|
|
|
|
if (bigEndian)
|
|
|
|
return (x>>8)
|
|
|
|
| (x<<8);
|
|
|
|
else
|
|
|
|
return x;
|
2010-02-10 17:15:04 -05:00
|
|
|
}
|
2015-10-05 10:17:49 -04:00
|
|
|
|
2010-02-09 22:45:13 -05:00
|
|
|
uint32_t e32(uint32_t x)
|
|
|
|
{
|
|
|
|
if (bigEndian)
|
2015-10-04 14:51:05 -04:00
|
|
|
return (x>>24) |
|
2010-02-09 22:45:13 -05:00
|
|
|
((x<<8) & 0x00FF0000) |
|
|
|
|
((x>>8) & 0x0000FF00) |
|
|
|
|
(x<<24);
|
|
|
|
else
|
|
|
|
return x;
|
|
|
|
}
|
2015-10-05 10:17:49 -04:00
|
|
|
|
2010-02-09 22:45:13 -05:00
|
|
|
uint64_t e64(uint64_t x)
|
|
|
|
{
|
|
|
|
if (bigEndian)
|
2015-10-04 14:51:05 -04:00
|
|
|
return (x>>56) |
|
2010-02-09 22:45:13 -05:00
|
|
|
((x<<40) & 0x00FF000000000000) |
|
|
|
|
((x<<24) & 0x0000FF0000000000) |
|
|
|
|
((x<<8) & 0x000000FF00000000) |
|
|
|
|
((x>>8) & 0x00000000FF000000) |
|
|
|
|
((x>>24) & 0x0000000000FF0000) |
|
|
|
|
((x>>40) & 0x000000000000FF00) |
|
|
|
|
(x<<56);
|
|
|
|
else
|
|
|
|
return x;
|
|
|
|
}
|
2015-10-05 10:17:49 -04:00
|
|
|
|
2010-02-09 22:45:13 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* __ardour_omftool__ */
|