OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
track.cpp
Go to the documentation of this file.
1#include "track.h"
2
3#include <stdexcept>
4#include <iostream>
5#include <algorithm>
6
7using namespace Dx8;
8
10 input.read([&](Riff& ch){
11 if(ch.is("stmp"))
12 ch.read(&stmp,sizeof(stmp));
13 else if(ch.is("LIST")){
14 char listId[5]={};
15 ch.read(&listId,4);
16 if(std::strcmp(listId,"DMRF")==0)
17 reference = Reference(ch);
18 }
19 });
20 }
21
23 input.read([&](Riff& ch){
24 if(ch.is("LIST")) {
25 char listId[5]={};
26 ch.read(&listId,4);
27 if(std::strcmp(listId,"strf")==0){
28 styles.emplace_back(ch);
29 }
30 }
31 });
32 }
33
35 input.read([&](Riff& ch){
36 implReadList(ch);
37 });
38 }
39
40void Track::Chord::implReadList(Riff &ch) {
41 if(ch.is("crdh")) {
42 ch.read(&header,4);
43 }
44 else if(ch.is("crdb")){
45 uint32_t ioSzOf=0;
46 ch.read(&ioSzOf,4);
47 if(ioSzOf>sizeof(ioChord))
48 throw std::runtime_error("bad track chord");
49 ch.read(&ioChord,ioSzOf);
50
51 uint32_t cSize=0;
52 uint32_t cSzOf=0;
53 ch.read(&cSize,4);
54 ch.read(&cSzOf,4);
55
56 subchord.resize(cSize);
57 for(auto& i:subchord){
58 ch.read(&i,sizeof(i));
59 if(cSzOf>sizeof(i))
60 ch.skip(cSzOf-sizeof(i));
61 }
62 }
63 }
64
66 uint32_t sz32=0;
67 input.read(&sz32,4);
68
69 size_t sz = sz32;
70
71 size_t count = input.remaning()/sz;
72 commands.resize(count);
73
74 for(uint32_t i=0;i<count;++i) {
75 DMUS_IO_COMMAND& io=commands[i];
76 input.read(&io,std::min(sz,sizeof(io)));
77 if(sz>sizeof(io))
78 input.skip(sz-sizeof(io));
79 }
80 }
81
82
84 if(!input.is("RIFF"))
85 throw std::runtime_error("not a riff");
86
87 input.readListId("DMTK");
88 input.read([this](Riff& ch) {
89 if(ch.is("trkh"))
90 ch.read(&head,sizeof(head));
91 else if(ch.is("cmnd"))
92 cmnd = std::make_shared<CommandTrack>(ch);
93 else if(ch.is("LIST"))
94 implReadList(ch);
95 });
96 }
97
98void Track::implReadList(Riff& input) {
99 if(input.isListId("sttr")){
100 sttr = std::make_shared<StyleTrack>(input);
101 }
102 else if(input.isListId("cord")){
103 cord = std::make_shared<Chord>(input);
104 }
105 }
bool is(const char *idx) const
Definition riff.h:19
void read(std::u16string &str)
Definition riff.cpp:29
size_t remaning() const
Definition riff.h:22
void readListId()
Definition riff.cpp:13
void skip(size_t sz)
Definition riff.cpp:76
bool isListId(const char *id)
Definition riff.cpp:24
Chord(Riff &chunk)
Definition track.cpp:34
CommandTrack(Riff &chunk)
Definition track.cpp:65
std::shared_ptr< Chord > cord
Definition track.h:48
std::shared_ptr< CommandTrack > cmnd
Definition track.h:49
Track(Riff &input)
Definition track.cpp:83
DMUS_IO_TRACK_HEADER head
Definition track.h:46
std::shared_ptr< StyleTrack > sttr
Definition track.h:47
Definition band.h:10
uint16_t stmp
Definition track.h:19
StyleRef(Riff &chunk)
Definition track.cpp:9
Reference reference
Definition track.h:20
StyleTrack(Riff &chunk)
Definition track.cpp:22