ここらへん詳しくないので適当だけど
delegateの外に出すとまわるっぽい。

-(void)sound:(NSSound *)sound didFinishPlaying:(BOOL)aBool
{
if (loop) {
[self playSound];
}
}

- (void) playSound
{
[snd play];
}

- (IBAction) play:(id)sender
{
if (![snd isPlaying]) {
loop = YES;
[self playSound];
}
}

- (IBAction) stop:(id)sender
{
if ([snd isPlaying]) {
loop = NO;
[snd stop];
}
}
sndの生成はinitとかawake辺りで適当に