This is Transport.m in view mode; [Download] [Up]
#import <libc.h>
#import <appkit/Application.h>
#import <appkit/TextField.h>
#import <soundkit/Sound.h>
#import <sound/soundstruct.h>
#import "Transport.h"
#import "DACPlayer.h"
#import "errors.h"
#import <math.h>
int done = 0;
int inskip = 0;
void UpdateStatus (DPSTimedEntry te, double timeNow, void *data)
{
[(id)data updateStatus];
}
@implementation Transport:Object
+ new
{
self = [super new];
/* Create a timed entry to update the status window every second. */
statusTE = DPSAddTimedEntry(1.0, &UpdateStatus, self, NX_BASETHRESHOLD);
dacPlayer = [DACPlayer new];
[dacPlayer setDelegate :self];
return self;
}
- stop:sender;
{
[dacPlayer stop];
return self;
}
- pause:sender
{
[dacPlayer pause];
return self;
}
- play:(id)mySound
{
aSound = mySound;
done = inskip = 0;
savesoundpointer = soundpointer = (short *)[aSound data];
nsoundbytes = [aSound sampleCount] * BYTES_PER_16BIT;
[dacPlayer setSamplingRate:(double)[aSound samplingRate]];
[dacPlayer run];
return self;
}
- wait
{
[dacPlayer wait];
[dacPlayer stop];
return self;
}
/**
** Internal methods.
**/
- updateStatus
{
return self;
}
/**
** Delegate methods called from the DACPlayer object
**/
- willPlay :player
/*
* Called when the Player is about to start playing data.
*/
{
id srateCell;
int region_size, region_count;
sampleValue = 0;
/* set the current region size and count */
region_size = 4 * vm_page_size;
nbuffers = region_count = 10;
[dacPlayer setupRegions:region_size:region_count];
return self;
}
- didPlay :player;
/*
* Called when the Player stops.
*/
{
return self;
}
- playData :player :(char *)region :(int)nbytes
/*
* Called whenever the Player wants more data.
*/
{
int i, nsamples = nbytes/BYTES_PER_16BIT;
short *dstSamples = (short *)region;
if([aSound channelCount] == 2) {
if((soundpointer - savesoundpointer) < nsoundbytes) {
//bcopy(soundpointer,region,nbytes);
fragSounds(aSound,region,inskip,nsamples);
inskip += nsamples;
soundpointer += nbytes/BYTES_PER_16BIT;
}
else {
if(nbuffers-- == 2)
done = 1; /* count down DAC buffers */
}
}
else {
if((soundpointer - savesoundpointer) < nsoundbytes) {
//bcopy(soundpointer,region,nbytes);
fragSounds(aSound,region,inskip,nsamples);
inskip += nsamples/2;
soundpointer += (nbytes/BYTES_PER_16BIT);
}
else {
if(nbuffers-- == 2)
done = 1; /* count down DAC buffers */
}
}
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.