Mozilla/mozilla/widget/src/os2/nsSound.cpp
mkaply%us.ibm.com fb45cec078 #248706
r=pedemont, sr=mkaply (platform specific), a=mkaply (OS/2 only)
OS/2 only - patch from Peter Weilbacher - check to see if creating sound file failed before trying to open it
unload multimedia DLL after we check for MMPM


git-svn-id: svn://10.0.0.236/trunk@159145 18797224-902f-48f8-a5cc-f745e15eee43
2004-07-13 13:35:25 +00:00

238 lines
6.3 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 2000
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Stuart Parmenter <pavlov@netscape.com>
* John Fairhurst <john_fairhurst@iname.com>
* IBM Corp.
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nscore.h"
#include "plstr.h"
#include <stdio.h>
#include <string.h>
#define INCL_DOS
#define INCL_DOSERRORS
#include <os2.h>
#include "nsSound.h"
#include "nsIURL.h"
#include "nsNetUtil.h"
#include "nsIPref.h"
#include "nsDirectoryServiceDefs.h"
NS_IMPL_ISUPPORTS2(nsSound, nsISound, nsIStreamLoaderObserver)
static int gInitialized = 0;
static PRBool gMMPMInstalled = PR_FALSE;
static void
InitGlobals(void)
{
APIRET ulrc;
HMODULE hmod;
char LoadError[CCHMAXPATH];
ulrc = DosLoadModule(LoadError, CCHMAXPATH, "MMPM", &hmod);
if (ulrc == NO_ERROR) {
gMMPMInstalled = PR_TRUE;
}
DosFreeModule(hmod);
gInitialized = 1;
}
////////////////////////////////////////////////////////////////////////
nsSound::nsSound()
{
if (!gInitialized) {
InitGlobals();
}
}
nsSound::~nsSound()
{
}
NS_IMETHODIMP nsSound::OnStreamComplete(nsIStreamLoader *aLoader,
nsISupports *context,
nsresult aStatus,
PRUint32 dataLen,
const PRUint8 *data)
{
if (NS_FAILED(aStatus)) {
#ifdef DEBUG
if (aLoader) {
nsCOMPtr<nsIRequest> request;
aLoader->GetRequest(getter_AddRefs(request));
if (request) {
nsCOMPtr<nsIURI> uri;
nsCOMPtr<nsIChannel> channel = do_QueryInterface(request);
if (channel) {
channel->GetURI(getter_AddRefs(uri));
if (uri) {
nsCAutoString uriSpec;
uri->GetSpec(uriSpec);
printf("Failed to load %s\n", uriSpec.get());
}
}
}
}
#endif
return NS_ERROR_FAILURE;
}
if (memcmp(data, "RIFF", 4) || (!gMMPMInstalled)) {
NS_WARNING("We only support WAV files currently.\n");
Beep();
return NS_OK;
}
nsresult rv;
static const char *kSoundTmpFileName = "mozsound.wav";
nsCOMPtr<nsIFile> soundTmp;
rv = NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(soundTmp));
if (NS_FAILED(rv)) return rv;
rv = soundTmp->AppendNative(nsDependentCString(kSoundTmpFileName));
nsCAutoString soundFilename;
(void) soundTmp->GetNativePath(soundFilename);
FILE *fp = fopen(soundFilename.get(), "wb+");
if (fp) {
fwrite(data, dataLen, 1, fp);
fclose(fp);
HOBJECT hobject = WinQueryObject(soundFilename.get());
WinSetObjectData(hobject, "OPEN=DEFAULT");
} else {
NS_WARNING("Could not open WAV file for binary writing.\n");
Beep();
}
return NS_OK;
#ifdef OLDCODE /* Some day we could try to get this working */
ULONG ulRC;
CHAR errorBuffer[128];
HMMIO hmmio;
MMIOINFO mmioinfo;
memset(&mmioinfo, 0, sizeof(MMIOINFO));
mmioinfo.fccIOProc = FOURCC_MEM;
mmioinfo.cchBuffer = dataLen;
mmioinfo.pchBuffer = (char*)data;
USHORT usDeviceID;
hmmio = mmioOpen(NULL, &mmioinfo, MMIO_READWRITE);
MCI_OPEN_PARMS mop;
memset(&mop, 0, sizeof(MCI_OPEN_PARMS));
mop.pszElementName = (char*)hmmio;
CHAR DeviceType[] = "waveaudio";
mop.pszDeviceType = (PSZ)&DeviceType;
ulRC = mciSendCommand(0, MCI_OPEN, MCI_OPEN_MMIO | MCI_WAIT, &mop, 0);
if (ulRC != MCIERR_SUCCESS) {
ulRC = mciGetErrorString(ulRC, errorBuffer, 128);
}
usDeviceID = mop.usDeviceID;
MCI_OPEN_PARMS mpp;
memset(&mpp, 0, sizeof(MCI_OPEN_PARMS));
ulRC = mciSendCommand(usDeviceID, MCI_PLAY, MCI_WAIT, &mpp, 0);
if (ulRC != MCIERR_SUCCESS) {
ulRC = mciGetErrorString(ulRC, errorBuffer, 128);
}
MCI_GENERIC_PARMS mgp;
memset(&mgp, 0, sizeof(MCI_GENERIC_PARMS));
ulRC = mciSendCommand(usDeviceID, MCI_CLOSE, MCI_WAIT, &mgp, 0);
if (ulRC != MCIERR_SUCCESS) {
ulRC = mciGetErrorString(ulRC, errorBuffer, 128);
}
mmioClose(hmmio, 0);
#endif
}
NS_METHOD nsSound::Beep()
{
WinAlarm(HWND_DESKTOP, WA_WARNING);
return NS_OK;
}
NS_METHOD nsSound::Play(nsIURL *aURL)
{
nsresult rv;
nsCOMPtr<nsIStreamLoader> loader;
rv = NS_NewStreamLoader(getter_AddRefs(loader), aURL, this);
return rv;
}
NS_IMETHODIMP nsSound::Init()
{
return NS_OK;
}
NS_IMETHODIMP nsSound::PlaySystemSound(const char *aSoundAlias)
{
/* We don't have a default mail sound on OS/2, so just beep */
/* Also just beep if MMPM isn't installed */
if ((strcmp("_moz_mailbeep", aSoundAlias) == 0) || (!gMMPMInstalled)) {
Beep();
}
else {
HOBJECT hobject = WinQueryObject(aSoundAlias);
if (hobject)
WinSetObjectData(hobject, "OPEN=DEFAULT");
else
Beep();
}
return NS_OK;
}