Scaler rewrite for detecting changes
New scalers for tv3x, rgb2x, rgb3x, scan2x, scan3x Only updaterect the changed parts in sdl Add support for 15/16/32bpp modes Add support for highres 4bpp modes Rewrite of vga page handlers for most other modes AVI capturing using zmbv codec New option for hardware scaled windows to try and reach a specified resolution Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2444
This commit is contained in:
parent
0968989c7a
commit
3b74afe0c4
7 changed files with 1418 additions and 813 deletions
|
@ -107,86 +107,8 @@ static struct {
|
|||
} sysex;
|
||||
bool available;
|
||||
MidiHandler * handler;
|
||||
struct {
|
||||
FILE * handle;
|
||||
Bit8u buffer[RAWBUF+SYSEX_SIZE];
|
||||
bool capturing;
|
||||
Bitu used,done;
|
||||
Bit32u last;
|
||||
} raw;
|
||||
} midi;
|
||||
|
||||
static Bit8u midi_header[]={
|
||||
'M','T','h','d', /* Bit32u, Header Chunk */
|
||||
0x0,0x0,0x0,0x6, /* Bit32u, Chunk Length */
|
||||
0x0,0x0, /* Bit16u, Format, 0=single track */
|
||||
0x0,0x1, /* Bit16u, Track Count, 1 track */
|
||||
0x01,0xf4, /* Bit16u, Timing, 2 beats/second with 500 frames */
|
||||
'M','T','r','k', /* Bit32u, Track Chunk */
|
||||
0x0,0x0,0x0,0x0, /* Bit32u, Chunk Length */
|
||||
//Track data
|
||||
};
|
||||
|
||||
#define ADDBUF(_VAL_) midi.raw.buffer[midi.raw.used++]=(Bit8u)(_VAL_);
|
||||
static INLINE void RawAddNumber(Bit32u val) {
|
||||
if (val & 0xfe00000) ADDBUF(0x80|((val >> 21) & 0x7f));
|
||||
if (val & 0xfffc000) ADDBUF(0x80|((val >> 14) & 0x7f));
|
||||
if (val & 0xfffff80) ADDBUF(0x80|((val >> 7) & 0x7f));
|
||||
ADDBUF(val & 0x7f);
|
||||
}
|
||||
static INLINE void RawAddDelta(void) {
|
||||
if (!midi.raw.handle) {
|
||||
midi.raw.handle=OpenCaptureFile("Raw Midi",".mid");
|
||||
if (!midi.raw.handle) {
|
||||
midi.raw.capturing=false;
|
||||
return;
|
||||
}
|
||||
fwrite(midi_header,1,sizeof(midi_header),midi.raw.handle);
|
||||
midi.raw.last=PIC_Ticks;
|
||||
}
|
||||
Bit32u delta=PIC_Ticks-midi.raw.last;
|
||||
midi.raw.last=PIC_Ticks;
|
||||
RawAddNumber(delta);
|
||||
}
|
||||
|
||||
static INLINE void RawAddData(Bit8u * data,Bitu len) {
|
||||
for (Bitu i=0;i<len;i++) ADDBUF(data[i]);
|
||||
if (midi.raw.used>=RAWBUF) {
|
||||
fwrite(midi.raw.buffer,1,midi.raw.used,midi.raw.handle);
|
||||
midi.raw.done+=midi.raw.used;
|
||||
midi.raw.used=0;
|
||||
}
|
||||
}
|
||||
|
||||
static void MIDI_SaveRawEvent(void) {
|
||||
/* Check for previously opened wave file */
|
||||
if (midi.raw.capturing) {
|
||||
LOG_MSG("Stopping raw midi saving.");
|
||||
midi.raw.capturing=false;
|
||||
if (!midi.raw.handle) return;
|
||||
ADDBUF(0x00);//Delta time
|
||||
ADDBUF(0xff);ADDBUF(0x2F);ADDBUF(0x00); //End of track event
|
||||
fwrite(midi.raw.buffer,1,midi.raw.used,midi.raw.handle);
|
||||
midi.raw.done+=midi.raw.used;
|
||||
fseek(midi.raw.handle,18, SEEK_SET);
|
||||
Bit8u size[4];
|
||||
size[0]=(Bit8u)(midi.raw.done >> 24);
|
||||
size[1]=(Bit8u)(midi.raw.done >> 16);
|
||||
size[2]=(Bit8u)(midi.raw.done >> 8);
|
||||
size[3]=(Bit8u)(midi.raw.done >> 0);
|
||||
fwrite(&size,1,4,midi.raw.handle);
|
||||
fclose(midi.raw.handle);
|
||||
midi.raw.handle=0;
|
||||
} else {
|
||||
LOG_MSG("Preparing for raw midi capture, will start with first data.");
|
||||
midi.raw.used=0;
|
||||
midi.raw.done=0;
|
||||
midi.raw.handle=0;
|
||||
midi.raw.capturing=true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void MIDI_RawOutByte(Bit8u data) {
|
||||
/* Test for a active sysex tranfer */
|
||||
if (midi.status==0xf0) {
|
||||
|
@ -197,11 +119,8 @@ void MIDI_RawOutByte(Bit8u data) {
|
|||
midi.sysex.buf[midi.sysex.used++]=0xf7;
|
||||
midi.handler->PlaySysex(midi.sysex.buf,midi.sysex.used);
|
||||
LOG(LOG_ALL,LOG_NORMAL)("Sysex message size %d",midi.sysex.used);
|
||||
if (midi.raw.capturing) {
|
||||
RawAddDelta();
|
||||
ADDBUF(0xf0);
|
||||
RawAddNumber(midi.sysex.used-1);
|
||||
RawAddData(&midi.sysex.buf[1],midi.sysex.used-1);
|
||||
if (CaptureState & CAPTURE_MIDI) {
|
||||
CAPTURE_AddMidi( true, midi.sysex.used-1, &midi.sysex.buf[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -217,9 +136,8 @@ void MIDI_RawOutByte(Bit8u data) {
|
|||
if (midi.cmd_len) {
|
||||
midi.cmd_buf[midi.cmd_pos++]=data;
|
||||
if (midi.cmd_pos >= midi.cmd_len) {
|
||||
if (midi.raw.capturing) {
|
||||
RawAddDelta();
|
||||
RawAddData(midi.cmd_buf,midi.cmd_len);
|
||||
if (CaptureState & CAPTURE_MIDI) {
|
||||
CAPTURE_AddMidi(false, midi.cmd_len, midi.cmd_buf);
|
||||
}
|
||||
midi.handler->PlayMsg(midi.cmd_buf);
|
||||
midi.cmd_pos=1; //Use Running status
|
||||
|
@ -231,7 +149,6 @@ bool MIDI_Available(void) {
|
|||
return midi.available;
|
||||
}
|
||||
|
||||
|
||||
class MIDI:public Module_base{
|
||||
public:
|
||||
MIDI(Section* configuration):Module_base(configuration){
|
||||
|
@ -240,12 +157,10 @@ public:
|
|||
const char * conf=section->Get_string("config");
|
||||
/* If device = "default" go for first handler that works */
|
||||
MidiHandler * handler;
|
||||
MAPPER_AddHandler(MIDI_SaveRawEvent,MK_f8,MMOD1|MMOD2,"caprawmidi","Cap MIDI");
|
||||
// MAPPER_AddHandler(MIDI_SaveRawEvent,MK_f8,MMOD1|MMOD2,"caprawmidi","Cap MIDI");
|
||||
midi.status=0x00;
|
||||
midi.cmd_pos=0;
|
||||
midi.cmd_len=0;
|
||||
midi.raw.handle=0;
|
||||
midi.raw.capturing=false;
|
||||
if (!strcasecmp(dev,"default")) goto getdefault;
|
||||
handler=handler_list;
|
||||
while (handler) {
|
||||
|
@ -276,12 +191,13 @@ getdefault:
|
|||
/* This shouldn't be possible */
|
||||
}
|
||||
~MIDI(){
|
||||
if(midi.raw.handle) MIDI_SaveRawEvent();
|
||||
if(midi.available) midi.handler->Close();
|
||||
midi.available = false;
|
||||
midi.handler = 0;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
static MIDI* test;
|
||||
void MIDI_Destroy(Section* sec){
|
||||
delete test;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue