Filebrowsercomponent


#1

Hi Jules,

is there any chance to also pass the browser component pointer to drawFileBrowserRow in LookAndFeel?
I need to get access to the listbox item position for proper drawing…

Thank you!


#2

Ok, sounds like a reasonable request!


#3

Fine, Thank you


#4

Jules,

thank you for the check in of the above request. Works here, but
with the latest update I did yesterday the Sysex input processing seems to be broken.
I do only receive the first 256 bytes of a message.
The rest isn’t coming through anymore:-)

Have you done something here?

Joerg


#5

…nope, I don’t remember changing anything in there. Which platform is this?


#6

It’s Windows…

You may remember the thread

http://www.rawmaterialsoftware.com/viewtopic.php?f=2&t=5861

where atom has described the problem with partial sysex messages.
I had to write a work arround cause handlePartialSysexMessage never got called in windows
and juce sends the partial messages also to handleIncomingMidiMessage (in Windows). Now, it doesn’t but
handlePartialSysexMessage doesn’t get called either…


#7

Yes, I remember the thread, but I really don’t think I’ve changed anything. Have a look through the GIT logs if you want to check.


#8

Yes, you’ve added a dynamic buffer for win32 midi input. Haven’t checked the your changes but
does it mean that juce will automatically resize the buffer if to small (if so, it seems that it doesn’t work :-()
or do we have to set the buffer size somewhere?


#9

Jules,

you add the header data as Midi event to the “pending” Midi buffer even if the start byte is not a status byte (part of a sysex message if longer than 256 bytes).
The Midi input thread then iterates the “pending” Midi buffer but can’t find such a partial message.
The docs says “MidiBuffer.addEvent (const uint8 *const rawMidiData, const int maxBytesOfMidiData, const int sampleNumber):
If the midi data is invalid, it might not add an event at all.”

That might be the reason why we miss the other parts of a sysex longer than 256 bytes?

void handleSysEx (MIDIHDR* const hdr, const uint32 timeStamp)
	{
		const int time = timeStampToMs (timeStamp);
		const int num = hdr->dwBytesRecorded;
		
		if (num > 0)
		{
			{
				const ScopedLock sl (lock);
				pending.addEvent (hdr->lpData, num, time);
			}

			notify();
		}
	}

#10

Yes, that’s right - I need to fix it properly by making it coalesce the unfinished messages…


#11

Cool! And if you may can introduce the callback handlePartialSysexMessage here to have same handling on both, Windows and Mac.

Thank you!