Blog
Page: 0 ... 5 ... 10 ... 15 ... 20 ... 25 ... 30 ... 35 ... 40 ... 45 ... 50
i.Mage Update
Date: 26/10/2005
Today I updated i.Mage for the first time in 11 months... yeah I've been slack I know. The new build brings with it a number of UI fixes, bugs squashed and speed improvements. Most telling is I finally got rid of that horrible select/paste tool and made it just a select tool, retasking the brush tool to actually paint with the brush. So now I think it'll match most users mental model of how a paint application should work.

Strangely enough I came to the realisation of just how bad the UI in this area was because I was re-writing the help file to explain the usage correctly. And I just couldn't bring myself to explain this quirky select/paste behaviour in the help file, so I had to rewrite the app to match the help.

It's an interesting way of going about it, writing the help and then making the application comply, but it certainly did highlight a few things for me. An exercise worth doing if you write software. If something is hard to explain in the help then maybe it's just not user friendly enough, and you need to fix your app rather than spend many paragraphs explaining it in the help.
(1) Comment | Add Comment

iTunes Australia
Date: 25/10/2005
Well after my previous rant about the iTunes Music Store (US) I thought it was only "fair" if I checked out the new Australian iTunes Store.

The only things I wanted to know are:
  1. Does it have various obscure local bands that I like?
  2. Is it fast?
  3. Does it let me pay with PayPal?


Short answer: don't know, NO and NO!

Long answer: I tried finding some songs I wanted and well so far the page hasn't loaded after 5 minutes so I have no idea if the catalogue is any good. It's slow. In fact it's so slow it makes dial up look positively snappy. I think they have employees that read the incoming HTTP requests out, and someone writes it down, walks over to the library catalogue of songs they have... works out the search results, writes it down, hands it back to the data entry employee (there is just one, who is really busy) who then types up the results in HTML and sends it back out the 300 baud modem to me. It is faster to find and download a song over p2p than it is to see if ITMS even has the song. There is a 6 letter word for that.

And no ITMS Australia does NOT support PayPal like the US store, because... because... uh I have no idea why. Theres a freakin' PayPal Australia site and everything!
(2) Comments | Add Comment

User Interface Code-fu
Date: 21/10/2005
Note: This is aimed purely at coders, so don't get too worried if it doesn't make any sense.

Background: In the world of programming user interfaces it is common to have an object wrap each user interface element (window), which virtual methods that trigger when various things happen, like "OnMouseClick" and "OnPaint". These methods are implemented by the application to add functionality to the base controls provided by the application framework. In C++ these are virtual member functions in the parent C++ window class.

Ideally the code inside these event handlers, as implemented by the specific application, would take minimal time to run and be generally well behaved. But in reality it sometimes needs to do a lot of work in the event handler and can do nasty things like delete the current window object processing an event. So I'm getting to grips with this in Lgi and I've come up with a reasonably neat solution.

Firstly for the issue of long running event handlers, you often want to know that the handler "hung" for a while. This is reasonably easy to check, just take a tick count at the start, and another at the end and work out the milliseconds the handler ran for. If it's over some threshold you can change the post event handler behaviour. I do this in the list control when the application puts up a right click menu and "hangs" the event handler. Normally I trigger a timer to check if the user has started a drag and drop operation, but if the handler hangs, a d'n'd operation should NOT be started.

The second issue is the one of the event handler destroying the window during it's processing of the event. Now you could setup a complicated system of return values on the events to indicate whether the application has deleted the window, but that is prone to error because it puts the responsibility on the application to "Do The Right Thing(TM)". I'd prefer a system that doesn't require any smarts on the application side to work correctly. So I came up with a better way (And sorry if it's obvious). Basically the problem with the current object being deleted during the event handler is that you can not access any of the member variables or methods after the event handler. However anything on the stack is still fair game, and I use this fact to get notification of the objects destruction. e.g. my code to call the event handler now looks like this:

bool DeleteFlag = false;
this->pDeleteFlag = &DeleteFlag;
this->EventHandler(EventParams);
if (DeleteFlag)
    return;
this->pDeleteFlag = NULL;


I have put a pointer to the delete flag in the object so that in the destructor of the object I can return information of the destruction event to some interested party (i.e the event handler calling code furthur up the call stack):
Object::~Object()
{
    if (pDeleteFlag)
        *pDeleteFlag = true;
    // other stuff....
}
This way if the event handler deletes the object, the flag on the stack gets set, and I can trap that AFTER the event handler has returned and the current object no longer exists. Nice, neat and robust.
(0) Comments | Add Comment

DirectShow Filters
Date: 18/10/2005
I'm trying to write a DirectShow app that previews video/audio from my TV tuner card. So far so good, the video is working fine and I can change channels and fine tune. But I'm kinda stumped as to why the audio isn't working. This is what my filter graph looks like:



The TV card has an analogue out which has a cable running around to the sound card's Line-In. I've got some code that runs through the pins on the Sound Card's capture filter, finds the "Line In" pin and enables it and sets the volume to "1.0". Maybe the next step is playing with the crossbar to get the audio routed to the right place.

Update: Well when it rains it pours. I followed my nose and starting playing with the crossbar interface. I decided to route the "Audio Tuner In" pin to the "Audio Decoder Out" pin. Seems logical enough. And whoooo sound! But now the problem is that I have 2 copies of the audio, slightly offset from each other, creating an echo. Interestingly as soon as the graph starts running, 1 lot of sound is heard, but when the message loop starts the 2nd lot is added. Then when the application quits the 1st lot of sound remains. Interesting.

Update2: This is what the final working graph looks like. Which is really just the bottom section of the first graph above:

(3) Comments | Add Comment

Firefox 1.5 "Oh Yes"
Date: 18/10/2005
Out of pure frustration I decided that I would download and install Firefox 1.5 to see if it fixes the "flicker" bug that has been driving me slowly insane for the last 4-5 months. Basically in all the "Designed By Corperate Committee(TM)" sites that I use from time to time cause Firefox 1.0.x to flicker badly when you use the combo drop down fields. Some other part of the page briefly flickers to a new (wrong) position and then back to it's correct position every time the combo box changes value. And when your scrolling through the list of values in the combo box it's a nightmare.

But yay for progress, 1.5 fixes that (so far). So I'm a happy little camper...

Update: My net banking didn't work in 1.5 so back I go into land of pain. Also 1.5 had issues with some pages, spraying javascript goop into the visible document. Ok not ready for prime time then.
(1) Comment | Add Comment

Subaru Goodness
Date: 12/10/2005
Ok so I should eat my words, Subaru have released the 2.0r engine here in Australia. The new Impreza range has replaced the old 2.5 RS model with the Impreza 2.0r, a nice step up in the technology being used. Yay for DOHC and AVCS. Hopefully this engine will also end up in the Liberty (Legacy) range as well. I don't even mind so much that the Australian 2.0r engine only puts out 118kw and the Japanese 2.0r puts out 140kw, because it still runs on 90 octane fuel! Thats heaps of grunt for 2L and 90 octane. Most engines in that catagory are premium only, 95 octane or more.

I'm currently thinking about how to downgrade from my twin turbo Legacy to something a little more affordable, so I've been looking into the whole compact car market. I really like the Jazz but I also really like Subaru AWD... and now I can have both! Well actually I can't because they only sell them in Japan, but hey it's affordable, a mere A$15,500-16,500 buys you a R2 type S[upercharger]. That doesn't include getting it here though :( The R2 looks great, it cheap to run at about 5.5L/100km and comes in a sporty version with a nice interior. Who knows why they don't export it. But I'd certainly seriously entertain getting one if it was available over here.
(0) Comments | Add Comment