[Scummvm-cvs-logs] CVS: scummvm/backends/PalmOS/Src palmsnd.cpp,NONE,1.1

Chris Apers chrilith at users.sourceforge.net
Tue May 25 07:17:10 CEST 2004


Update of /cvsroot/scummvm/scummvm/backends/PalmOS/Src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10003

Added Files:
	palmsnd.cpp 
Log Message:
New file, sound support using Pa1Lib (bad) and Palm API

--- NEW FILE: palmsnd.cpp ---
/* ScummVM - Scumm Interpreter
 * Copyright (C) 2001  Ludvig Strigeus
 * Copyright (C) 2001-2004 The ScummVM project
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.

 * This program 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 General Public License for more details.

 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * $Header: /cvsroot/scummvm/scummvm/backends/PalmOS/Src/palmsnd.cpp,v 1.1 2004/05/25 14:16:33 chrilith Exp $
 *
 */

#include "stdafx.h"
#include "palm.h"

#include "pa1lib.h"

//#define	SND_BLOCK	(4096)
#define	SND_BLOCK	(3072)

#define ADPCM_8_KHZ						1
#define ADPCM_MODE_NONCONTINUOUS_PB		0x01
#define ADPCM_MODE_INTERRUPT_MODE		0x02


int OSystem_PALMOS::getOutputSampleRate() const {
	return 8000;
}

static void ClieSoundCallback(UInt32 UserData) {
	SoundDataType *snd = (SoundDataType *)UserData;
	snd->set = false;
}

bool OSystem_PALMOS::setSoundCallback(SoundProc proc, void *param) {
	Boolean success = false;

	if (!_sound.active) {
		_sound.proc = proc;
		_sound.param = param;
		_sound.active = true;	// always true when we call this function
		_sound.dataP = NULL;	// required by sound_handler
		_sound.handle = NULL;
		
		// try to create sound stream
		if (OPTIONS_TST(kOptPalmSoundAPI)) {
			void *sndFuncP;
			Boolean isArm;
		
			_sound.handle = MemPtrNew(sizeof(SndStreamRef));

/*			if (OPTIONS_TST(kOptDeviceARM)) {
				_arm[PNO_SNDSTREAM].pnoPtr = _PnoInit(ARM_STREAMSND, &_arm[PNO_SNDSTREAM].pnoDesc);
				sndFuncP = (void *)_PnoCall(&_arm[PNO_SNDSTREAM].pnoDesc, NULL);
				isArm = true;
			
			} else*/ {
				sndFuncP = sndCallback;			
				isArm = false;
			}

			Err e = SndStreamCreateExtended(
						(SndStreamRef *)_sound.handle,
						sndOutput,
						sndFormatPCM,
						8000,
						sndInt16Little,
						sndStereo,
						(SndStreamVariableBufferCallback)sndFuncP,
						&_sound,
						8192,
						isArm);

			e = e ? e : SndStreamStart(*((SndStreamRef *)_sound.handle));
			e = e ? e :	SndStreamSetVolume(*((SndStreamRef *)_sound.handle), 32767);

			_sound.size = 0;		// set by the callback
			_sound.set = false;
			_sound.wait = true;
			success = (e == errNone);
			
		} else if (OPTIONS_TST(kOptSonyPa1LibAPI)) {
			static CallbackInfoType cbData;
			_sound.handle = MemPtrNew(sizeof(UInt8));
			
			cbData.funcP = &ClieSoundCallback;
			cbData.dwUserData = (UInt32)&_sound;
		
			_sound.size		= SND_BLOCK;
			_sound.set		= false;
			_sound.wait		= true;
			_sound.dataP	= MemPtrNew(SND_BLOCK);
			_sound.tmpP		= MemPtrNew(SND_BLOCK / 8);

			success = true;		// don't generate samples

			Pa1Lib_adpcmOpen(ADPCM_8_KHZ, (UInt8 *)_sound.tmpP, MemPtrSize(_sound.tmpP), &cbData, (UInt8 *)_sound.handle);
		}
		// failed or not supported 
		if (!success) {
			_sound.size = SND_BLOCK;
			_sound.set = false;
			_sound.wait = false;
			success = false;		// don't generate samples
		}
	}

	return true;	// if not true some scenes (indy3 256,...) may freeze (ESC to skip)
}

void OSystem_PALMOS::clearSoundCallback() {
	if (_sound.active) {

		if (OPTIONS_TST(kOptPalmSoundAPI)) {
			SndStreamStop(*((SndStreamRef *)_sound.handle));
			SndStreamDelete(*((SndStreamRef *)_sound.handle));

			if (_arm[PNO_SNDSTREAM].pnoPtr)
				 _PnoFree(&_arm[PNO_SNDSTREAM].pnoDesc, _arm[PNO_SNDSTREAM].pnoPtr);
		}

		free(_sound.dataP);
		free(_sound.tmpP);
		free(_sound.handle);
	}
	

	_sound.active = false;
	_sound.dataP = NULL;
	_sound.tmpP = NULL;
	_sound.handle = NULL;
}

void OSystem_PALMOS::sound_handler() {
	if (_sound.active) {
		if (_sound.size && (!_sound.set || !_sound.wait)) {

			if (!_sound.dataP)
				_sound.dataP = MemPtrNew(_sound.size);
			
			((SoundProc)_sound.proc)(_sound.param, (byte *)_sound.dataP, _sound.size);
			
			if (OPTIONS_TST(kOptSonyPa1LibAPI)) {
				pcm2adpcm((Int16 *)_sound.dataP, (UInt8 *)_sound.tmpP, _sound.size);
				_sound.set = Pa1Lib_adpcmStart(*((UInt8 *)_sound.handle), ADPCM_MODE_NONCONTINUOUS_PB|ADPCM_MODE_INTERRUPT_MODE);
			} else {
				_sound.set = true;
			}
		}
	}
}

bool OSystem_PALMOS::openCD(int drive) {
	// TODO : add a function to CDAudio to init the MP3 driver (?)
	return false;
}

void OSystem_PALMOS::stop_cdrom() {
	if (!_cdPlayer)
		return;

	_cdPlayer->stop();
}

void OSystem_PALMOS::play_cdrom(int track, int num_loops, int start_frame, int duration) {
	if (!_cdPlayer)
		return;

	_cdPlayer->play(track, num_loops, start_frame, duration);
}

bool OSystem_PALMOS::poll_cdrom() {
	if (!_cdPlayer)
		return false;
	
	return _cdPlayer->poll();
}

void OSystem_PALMOS::update_cdrom() {
	if (!_cdPlayer)
		return;

	_cdPlayer->update();
}





More information about the Scummvm-git-logs mailing list