/*
AudioOutputSink.m
Sink audio data to libao.
Copyright (C) 2009 Free Software Foundation, Inc.
Written by: Stefan Bidigaray
Date: Jun 2009
This file is part of the GNUstep GUI Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; see the file COPYING.LIB.
If not, see or write to the
Free Software Foundation, 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include
#include
#include
#include
@interface AudioOutputSink : NSObject
{
ao_device *_dev;
int _driver;
ao_sample_format _format;
}
@end
@implementation AudioOutputSink
- (void)dealloc
{
ao_shutdown();
[super dealloc];
}
- (id)initWithEncoding: (int)encoding
channels: (NSUInteger)channelCount
sampleRate: (NSUInteger)sampleRate
byteOrder: (NSByteOrder)byteOrder
{
self = [super init];
ao_initialize();
_driver = ao_default_driver_id();
_format.channels = (int)channelCount;
_format.rate = (int)sampleRate;
switch (encoding)
{
case GSSoundFormatPCMS8:
_format.bits = 8;
break;
case GSSoundFormatPCM16:
_format.bits = 16;
break;
case GSSoundFormatPCM24:
_format.bits = 24;
break;
case GSSoundFormatPCM32:
_format.bits = 32;
break;
case GSSoundFormatFloat32: // Float and double not supported by libao.
case GSSoundFormatFloat64:
default:
DESTROY(self);
return nil;
}
if (byteOrder == NS_LittleEndian)
{
_format.byte_format = AO_FMT_LITTLE;
}
else if (byteOrder == NS_BigEndian)
{
_format.byte_format = AO_FMT_BIG;
}
else
{
_format.byte_format = AO_FMT_NATIVE;
}
return self
}
- (BOOL)open
{
dev = ao_open_live(default_driver, &format, NULL);
return ((dev == NULL) ? NO : YES);
}
- (void)close
{
ao_close(_dev);
}
- (BOOL)writeBytes: (void *)bytes length: (NSUInteger)length
{
return ((ao_play(_dev, bytes, (uint_32)length) == 0) ? NO : YES);
}
/* Functionality not supported by libao */
- (void)setVolume: (float)volume
{
return;
}
- (float)volume
{
return 1.0;
}
- (void)setPlaybackDeviceIdentifier: (NSString *)playbackDeviceIdentifier
{
return;
}
- (NSString *)playbackDeviceIdentifier
{
return nil;
}
- (void)setChannelMapping: (NSArray *)channelMapping
{
return;
}
- (NSArray *)channelMapping
{
return nil;
}
@end