This is Player.m in view mode; [Download] [Up]
/*
* Player.m - an object to play digital sounds.
* Author: Robert D. Poor, NeXT Technical Support
* Copyright 1989 NeXT, Inc. Next, Inc. is furnishing this software
* for example purposes only and assumes no liability for its use.
* 06-Dec-89
*/
/*
* The Player object provides a common superclass for a family of
* playing objects. (Currently this is a family of one, the
* DACPlayer object, but this could be extended to play data out
* over the DSP port. The Player object keeps track of the current
* playing state and translates stop/pause/play messages into
* lower level messages (playerPrepare, playerStart, etc).
*
* This object must be subclassed in order to do anything useful.
* See the DACPlayer for an example.
*/
#import <stdlib.h>
#import <stdio.h>
#import <appkit/Panel.h>
#import <sound/sounddriver.h>
#import <sound/soundstruct.h>
#import "Player.h"
#import "errors.h"
@implementation Player:Object
/*
* Create a new Player object.
*/
+ new
{
self = [super new];
bytesPlayed = 0;
playerState = PLA_STOPPED;
regions = NULL;
[self setupRegions:4*vm_page_size:3]; /* allocate some regions */
return self;
}
- free
/*
* Free the Player object and any associated storage.
*/
{
[self freeRegions];
return [super free];
}
- stop
{
NXRunAlertPanel("Alert",
"The method %s must be implemented in a subclass",
NULL,NULL,NULL,"stop");
return self;
}
- prepare
{
NXRunAlertPanel("Alert",
"The method %s must be implemented in a subclass",
NULL,NULL,NULL,"prepare");
return self;
}
- run
{
NXRunAlertPanel("Alert",
"The method %s must be implemented in a subclass",
NULL,NULL,NULL,"run");
return self;
}
- pause
{
NXRunAlertPanel("Alert",
"The method %s must be implemented in a subclass",
NULL,NULL,NULL,"pause");
return self;
}
- (Pla_state_t)state
{
return playerState;
}
- (int)bytesPlayed
{
return bytesPlayed;
}
- delegate
/*
* Returns the current delegate.
*/
{
return delegate;
}
- setDelegate:anObject
/*
* Sets the delegate of the recoder
*/
{
delegate = anObject;
}
- (int)regionSize
{
return regionSize;
}
- setRegionSize:(int)nbytes
{
return [self setupRegions:nbytes:regionCount];
}
- (int)regionCount
{
return regionCount;
}
- setRegionCount:(int)nregions
{
return [self setupRegions:regionSize:nregions];
}
- freeRegions
/*
* Release any allocated regions.
*/
{
int i, r;
if (regions) {
for (i=0;i<regionCount;i++) {
r = vm_deallocate(task_self(), regions[i], regionSize);
}
free(regions);
regions = NULL;
}
return self;
}
- setupRegions:(int)size:(int)count
{
int i,r;
[self freeRegions];
/* update regionSize and regionCount and allocate fresh regions */
regionSize = size;
regionCount = count;
regions = malloc(count*sizeof(vm_address_t));
for (i=0;i<regionCount;i++) {
r = vm_allocate(task_self(), ®ions[i], regionSize, TRUE);
}
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.