Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
4430ab43
Commit
4430ab43
authored
Mar 17, 2010
by
Aric Stewart
Committed by
Alexandre Julliard
Mar 18, 2010
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
winemp3.acm: Support mp3 decoding on Mac OS/X Leopard systems.
parent
c177e938
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
407 additions
and
114 deletions
+407
-114
configure
configure
+23
-2
configure.ac
configure.ac
+13
-2
Makefile.in
dlls/winemp3.acm/Makefile.in
+1
-1
mpegl3.c
dlls/winemp3.acm/mpegl3.c
+357
-109
config.h.in
include/config.h.in
+13
-0
No files found.
configure
View file @
4430ab43
...
...
@@ -5687,6 +5687,9 @@ done
for
ac_header
in
\
AL/al.h
\
AudioToolbox/AudioConverter.h
\
AudioToolbox/AudioFile.h
\
AudioToolbox/AudioFileStream.h
\
AudioUnit/AudioUnit.h
\
Carbon/Carbon.h
\
CoreAudio/CoreAudio.h
\
...
...
@@ -6448,6 +6451,24 @@ fi
then
COREAUDIO
=
"-framework CoreAudio -framework AudioUnit -framework CoreServices -framework AudioToolbox -framework CoreMIDI"
ac_save_LIBS
=
"
$LIBS
"
if
test
"
$ac_cv_header_AudioToolbox_AudioFile_h
"
=
"yes"
then
LIBS
=
"
$LIBS
$COREAUDIO
"
for
ac_func
in
AudioFileStreamOpen
do
:
ac_fn_c_check_func
"
$LINENO
"
"AudioFileStreamOpen"
"ac_cv_func_AudioFileStreamOpen"
if
test
"x
$ac_cv_func_AudioFileStreamOpen
"
=
x
""
yes
;
then
:
cat
>>
confdefs.h
<<
_ACEOF
#define HAVE_AUDIOFILESTREAMOPEN 1
_ACEOF
fi
done
LIBS
=
"
$ac_save_LIBS
"
fi
test
"x
$ac_cv_func_AudioFileStreamOpen
"
=
xyes
||
as_fn_append wine_notices
"|AudioToolbox version too old, mp3 codec won't be supported."
fi
if
test
"
$ac_cv_header_OpenAL_al_h
"
=
"yes"
then
...
...
@@ -11287,7 +11308,7 @@ if test "x$ac_cv_lib_mpg123_mpg123_feed" = x""yes; then :
fi
fi
if
test
"x
$ac_cv_lib_mpg123_mpg123_feed
"
!=
xyes
;
then
:
if
test
"x
$ac_cv_lib_mpg123_mpg123_feed
"
!=
xyes
-a
x
"
$ac_cv_header_CoreAudio_CoreAudio_h
"
!=
xyes
;
then
:
case
"x
$with_mpg123
"
in
x
)
as_fn_append wine_notices
"|libmpg123
${
notice_platform
}
development files not found (or too old), mp3 codec won't be supported."
;;
xno
)
;;
...
...
@@ -11295,7 +11316,7 @@ if test "x$ac_cv_lib_mpg123_mpg123_feed" != xyes; then :
This is an error since --with-mpg123 was requested."
"
$LINENO
"
5
;;
esac
fi
test
"x
$ac_cv_lib_mpg123_mpg123_feed
"
=
xyes
||
enable_winemp3_acm
=
${
enable_winemp3_acm
:-
no
}
test
"x
$ac_cv_lib_mpg123_mpg123_feed
"
=
xyes
-o
"x
$ac_cv_func_AudioFileStreamOpen
"
=
xyes
||
enable_winemp3_acm
=
${
enable_winemp3_acm
:-
no
}
if
test
"
$ac_cv_header_AL_al_h
"
=
"yes"
then
...
...
configure.ac
View file @
4430ab43
...
...
@@ -308,6 +308,9 @@ AC_SYS_LARGEFILE()
AC_CHECK_HEADERS(\
AL/al.h \
AudioToolbox/AudioConverter.h \
AudioToolbox/AudioFile.h \
AudioToolbox/AudioFileStream.h \
AudioUnit/AudioUnit.h \
Carbon/Carbon.h \
CoreAudio/CoreAudio.h \
...
...
@@ -643,6 +646,14 @@ case $host_os in
then
dnl CoreServices needed by AudioUnit
AC_SUBST(COREAUDIO,"-framework CoreAudio -framework AudioUnit -framework CoreServices -framework AudioToolbox -framework CoreMIDI")
ac_save_LIBS="$LIBS"
if test "$ac_cv_header_AudioToolbox_AudioFile_h" = "yes"
then
LIBS="$LIBS $COREAUDIO"
AC_CHECK_FUNCS(AudioFileStreamOpen)
LIBS="$ac_save_LIBS"
fi
test "x$ac_cv_func_AudioFileStreamOpen" = xyes || WINE_NOTICE([AudioToolbox version too old, mp3 codec won't be supported.])
fi
if test "$ac_cv_header_OpenAL_al_h" = "yes"
then
...
...
@@ -1452,9 +1463,9 @@ if test "$ac_cv_header_mpg123_h" = "yes"
then
AC_CHECK_LIB(mpg123,mpg123_feed,[AC_SUBST(LIBMPG123,"-lmpg123")])
fi
WINE_NOTICE_WITH(mpg123,[test "x$ac_cv_lib_mpg123_mpg123_feed" != xyes],
WINE_NOTICE_WITH(mpg123,[test "x$ac_cv_lib_mpg123_mpg123_feed" != xyes
-a x"$ac_cv_header_CoreAudio_CoreAudio_h" != xyes
],
[libmpg123 ${notice_platform}development files not found (or too old), mp3 codec won't be supported.])
test "x$ac_cv_lib_mpg123_mpg123_feed" = xyes || enable_winemp3_acm=${enable_winemp3_acm:-no}
test "x$ac_cv_lib_mpg123_mpg123_feed" = xyes
-o "x$ac_cv_func_AudioFileStreamOpen" = xyes
|| enable_winemp3_acm=${enable_winemp3_acm:-no}
dnl **** Check for OpenAL 1.1 ****
if test "$ac_cv_header_AL_al_h" = "yes"
...
...
dlls/winemp3.acm/Makefile.in
View file @
4430ab43
...
...
@@ -4,7 +4,7 @@ SRCDIR = @srcdir@
VPATH
=
@srcdir@
MODULE
=
winemp3.acm
IMPORTS
=
winmm user32 kernel32
EXTRALIBS
=
@LIBMPG123@
EXTRALIBS
=
@LIBMPG123@
@COREAUDIO@
C_SRCS
=
\
mpegl3.c
...
...
dlls/winemp3.acm/mpegl3.c
View file @
4430ab43
/*
* MPEG Layer 3 handling
*
*
Copyright (C) 2002
Eric Pouech
*
Copyright (C) 2009
CodeWeavers, Aric Stewart
*
Copyright (C) 2002
Eric Pouech
*
Copyright (C) 2009
CodeWeavers, Aric Stewart
*
*
* This library is free software; you can redistribute it and/or
...
...
@@ -26,6 +26,25 @@
#include <assert.h>
#include <stdarg.h>
#include <string.h>
#ifdef HAVE_MPG123_H
# include <mpg123.h>
#else
# ifdef HAVE_COREAUDIO_COREAUDIO_H
# include <CoreFoundation/CoreFoundation.h>
# include <CoreAudio/CoreAudio.h>
# endif
# ifdef HAVE_AUDIOTOOLBOX_AUDIOCONVERTER_H
# include <AudioToolbox/AudioConverter.h>
# endif
# ifdef HAVE_AUDIOTOOLBOX_AUDIOFILE_H
# include <AudioToolbox/AudioFile.h>
# endif
# ifdef HAVE_AUDIOTOOLBOX_AUDIOFILESTREAM_H
# include <AudioToolbox/AudioFileStream.h>
# endif
#endif
#include "windef.h"
#include "winbase.h"
#include "wingdi.h"
...
...
@@ -35,40 +54,10 @@
#include "mmreg.h"
#include "msacm.h"
#include "msacmdrv.h"
#ifdef HAVE_MPG123_H
#include <mpg123.h>
#endif
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL
(
mpeg3
);
/***********************************************************************
* MPEG3_drvOpen
*/
static
LRESULT
MPEG3_drvOpen
(
LPCSTR
str
)
{
mpg123_init
();
return
1
;
}
/***********************************************************************
* MPEG3_drvClose
*/
static
LRESULT
MPEG3_drvClose
(
DWORD_PTR
dwDevID
)
{
mpg123_exit
();
return
1
;
}
typedef
struct
tagAcmMpeg3Data
{
void
(
*
convert
)(
PACMDRVSTREAMINSTANCE
adsi
,
const
unsigned
char
*
,
LPDWORD
,
unsigned
char
*
,
LPDWORD
);
mpg123_handle
*
mh
;
}
AcmMpeg3Data
;
/* table to list all supported formats... those are the basic ones. this
* also helps given a unique index to each of the supported formats
*/
...
...
@@ -141,6 +130,34 @@ static DWORD MPEG3_GetFormatIndex(LPWAVEFORMATEX wfx)
return
0xFFFFFFFF
;
}
#ifdef HAVE_MPG123_H
typedef
struct
tagAcmMpeg3Data
{
void
(
*
convert
)(
PACMDRVSTREAMINSTANCE
adsi
,
const
unsigned
char
*
,
LPDWORD
,
unsigned
char
*
,
LPDWORD
);
mpg123_handle
*
mh
;
}
AcmMpeg3Data
;
/***********************************************************************
* MPEG3_drvOpen
*/
static
LRESULT
MPEG3_drvOpen
(
LPCSTR
str
)
{
mpg123_init
();
return
1
;
}
/***********************************************************************
* MPEG3_drvClose
*/
static
LRESULT
MPEG3_drvClose
(
DWORD_PTR
dwDevID
)
{
mpg123_exit
();
return
1
;
}
static
void
mp3_horse
(
PACMDRVSTREAMINSTANCE
adsi
,
const
unsigned
char
*
src
,
LPDWORD
nsrc
,
unsigned
char
*
dst
,
LPDWORD
ndst
)
...
...
@@ -186,6 +203,314 @@ static void mp3_horse(PACMDRVSTREAMINSTANCE adsi,
}
/***********************************************************************
* MPEG3_Reset
*
*/
static
void
MPEG3_Reset
(
PACMDRVSTREAMINSTANCE
adsi
,
AcmMpeg3Data
*
aad
)
{
mpg123_feedseek
(
aad
->
mh
,
0
,
SEEK_SET
,
NULL
);
mpg123_close
(
aad
->
mh
);
mpg123_open_feed
(
aad
->
mh
);
}
/***********************************************************************
* MPEG3_StreamOpen
*
*/
static
LRESULT
MPEG3_StreamOpen
(
PACMDRVSTREAMINSTANCE
adsi
)
{
AcmMpeg3Data
*
aad
;
int
err
;
assert
(
!
(
adsi
->
fdwOpen
&
ACM_STREAMOPENF_ASYNC
));
if
(
MPEG3_GetFormatIndex
(
adsi
->
pwfxSrc
)
==
0xFFFFFFFF
||
MPEG3_GetFormatIndex
(
adsi
->
pwfxDst
)
==
0xFFFFFFFF
)
return
ACMERR_NOTPOSSIBLE
;
aad
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
AcmMpeg3Data
));
if
(
aad
==
0
)
return
MMSYSERR_NOMEM
;
adsi
->
dwDriver
=
(
DWORD_PTR
)
aad
;
if
(
adsi
->
pwfxSrc
->
wFormatTag
==
WAVE_FORMAT_PCM
&&
adsi
->
pwfxDst
->
wFormatTag
==
WAVE_FORMAT_PCM
)
{
goto
theEnd
;
}
else
if
(
adsi
->
pwfxSrc
->
wFormatTag
==
WAVE_FORMAT_MPEGLAYER3
&&
adsi
->
pwfxDst
->
wFormatTag
==
WAVE_FORMAT_PCM
)
{
/* resampling or mono <=> stereo not available
* MPEG3 algo only define 16 bit per sample output
*/
if
(
adsi
->
pwfxSrc
->
nSamplesPerSec
!=
adsi
->
pwfxDst
->
nSamplesPerSec
||
adsi
->
pwfxSrc
->
nChannels
!=
adsi
->
pwfxDst
->
nChannels
||
adsi
->
pwfxDst
->
wBitsPerSample
!=
16
)
goto
theEnd
;
aad
->
convert
=
mp3_horse
;
aad
->
mh
=
mpg123_new
(
NULL
,
&
err
);
mpg123_open_feed
(
aad
->
mh
);
}
/* no encoding yet
else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM &&
adsi->pwfxDst->wFormatTag == WAVE_FORMAT_MPEGLAYER3)
*/
else
goto
theEnd
;
MPEG3_Reset
(
adsi
,
aad
);
return
MMSYSERR_NOERROR
;
theEnd:
HeapFree
(
GetProcessHeap
(),
0
,
aad
);
adsi
->
dwDriver
=
0L
;
return
MMSYSERR_NOTSUPPORTED
;
}
/***********************************************************************
* MPEG3_StreamClose
*
*/
static
LRESULT
MPEG3_StreamClose
(
PACMDRVSTREAMINSTANCE
adsi
)
{
mpg123_close
(((
AcmMpeg3Data
*
)
adsi
->
dwDriver
)
->
mh
);
mpg123_delete
(((
AcmMpeg3Data
*
)
adsi
->
dwDriver
)
->
mh
);
HeapFree
(
GetProcessHeap
(),
0
,
(
void
*
)
adsi
->
dwDriver
);
return
MMSYSERR_NOERROR
;
}
#elif defined(HAVE_AUDIOFILESTREAMOPEN)
typedef
struct
tagAcmMpeg3Data
{
LRESULT
(
*
convert
)(
PACMDRVSTREAMINSTANCE
adsi
,
const
unsigned
char
*
,
LPDWORD
,
unsigned
char
*
,
LPDWORD
);
AudioConverterRef
acr
;
AudioStreamBasicDescription
in
,
out
;
AudioFileStreamID
afs
;
AudioBufferList
outBuffer
;
AudioBuffer
inBuffer
;
UInt32
NumberPackets
;
AudioStreamPacketDescription
*
PacketDescriptions
;
OSStatus
lastError
;
}
AcmMpeg3Data
;
static
inline
const
char
*
wine_dbgstr_fourcc
(
unsigned
long
fourcc
)
{
char
buf
[
4
]
=
{
(
char
)
(
fourcc
>>
24
),
(
char
)
(
fourcc
>>
16
),
(
char
)
(
fourcc
>>
8
),
(
char
)
fourcc
};
return
wine_dbgstr_an
(
buf
,
sizeof
(
buf
));
}
/***********************************************************************
* MPEG3_drvOpen
*/
static
LRESULT
MPEG3_drvOpen
(
LPCSTR
str
)
{
return
1
;
}
/***********************************************************************
* MPEG3_drvClose
*/
static
LRESULT
MPEG3_drvClose
(
DWORD_PTR
dwDevID
)
{
return
1
;
}
static
OSStatus
Mp3AudioConverterComplexInputDataProc
(
AudioConverterRef
inAudioConverter
,
UInt32
*
ioNumberDataPackets
,
AudioBufferList
*
ioData
,
AudioStreamPacketDescription
**
outDataPacketDescription
,
void
*
inUserData
)
{
AcmMpeg3Data
*
amd
=
(
AcmMpeg3Data
*
)
inUserData
;
if
(
amd
->
inBuffer
.
mDataByteSize
>
0
)
{
*
ioNumberDataPackets
=
amd
->
NumberPackets
;
ioData
->
mNumberBuffers
=
1
;
ioData
->
mBuffers
[
0
].
mDataByteSize
=
amd
->
inBuffer
.
mDataByteSize
;
ioData
->
mBuffers
[
0
].
mData
=
amd
->
inBuffer
.
mData
;
ioData
->
mBuffers
[
0
].
mNumberChannels
=
amd
->
inBuffer
.
mNumberChannels
;
amd
->
inBuffer
.
mDataByteSize
=
0
;
if
(
outDataPacketDescription
)
*
outDataPacketDescription
=
amd
->
PacketDescriptions
;
}
else
*
ioNumberDataPackets
=
0
;
return
noErr
;
}
static
LRESULT
mp3_leopard_horse
(
PACMDRVSTREAMINSTANCE
adsi
,
const
unsigned
char
*
src
,
LPDWORD
nsrc
,
unsigned
char
*
dst
,
LPDWORD
ndst
)
{
AcmMpeg3Data
*
amd
=
(
AcmMpeg3Data
*
)
adsi
->
dwDriver
;
OSStatus
ret
;
TRACE
(
"ndst %u %p <- %u %p
\n
"
,
*
ndst
,
dst
,
*
nsrc
,
src
);
amd
->
outBuffer
.
mNumberBuffers
=
1
;
amd
->
outBuffer
.
mBuffers
[
0
].
mDataByteSize
=
*
ndst
;
amd
->
outBuffer
.
mBuffers
[
0
].
mData
=
dst
;
amd
->
outBuffer
.
mBuffers
[
0
].
mNumberChannels
=
amd
->
out
.
mChannelsPerFrame
;
memset
(
dst
,
0xff
,
*
ndst
);
ret
=
AudioFileStreamParseBytes
(
amd
->
afs
,
*
nsrc
,
src
,
0
);
if
(
ret
!=
noErr
)
{
*
nsrc
=
0
;
ERR
(
"Feed Error %s
\n
"
,
wine_dbgstr_fourcc
(
ret
));
return
MMSYSERR_ERROR
;
}
else
if
(
amd
->
lastError
!=
noErr
)
{
*
nsrc
=
0
;
ERR
(
"Error during feed %s
\n
"
,
wine_dbgstr_fourcc
(
ret
));
return
MMSYSERR_ERROR
;
}
*
ndst
=
amd
->
outBuffer
.
mBuffers
[
0
].
mDataByteSize
;
*
nsrc
=
amd
->
inBuffer
.
mDataByteSize
;
return
MMSYSERR_NOERROR
;
}
/***********************************************************************
* MPEG3_Reset
*
*/
static
void
MPEG3_Reset
(
PACMDRVSTREAMINSTANCE
adsi
,
AcmMpeg3Data
*
aad
)
{
SInt64
offset
;
AudioConverterReset
(
aad
->
acr
);
AudioFileStreamSeek
(
aad
->
afs
,
0
,
&
offset
,
0
);
}
static
void
Mp3PropertyListenerProc
(
void
*
inClientData
,
AudioFileStreamID
inAudioFileStream
,
UInt32
inPropertyID
,
UInt32
*
ioFlags
)
{
/* No operation at this time */
}
static
void
Mp3PacketsProc
(
void
*
inClientData
,
UInt32
inNumberBytes
,
UInt32
inNumberPackets
,
const
void
*
inInputData
,
AudioStreamPacketDescription
*
inPacketDescriptions
)
{
AcmMpeg3Data
*
amd
=
(
AcmMpeg3Data
*
)
inClientData
;
UInt32
size
;
amd
->
inBuffer
.
mDataByteSize
=
inNumberBytes
;
amd
->
inBuffer
.
mData
=
(
void
*
)
inInputData
;
amd
->
inBuffer
.
mNumberChannels
=
amd
->
in
.
mChannelsPerFrame
;
amd
->
NumberPackets
=
inNumberPackets
;
amd
->
PacketDescriptions
=
inPacketDescriptions
;
size
=
amd
->
outBuffer
.
mBuffers
[
0
].
mDataByteSize
/
amd
->
out
.
mBytesPerPacket
;
amd
->
lastError
=
AudioConverterFillComplexBuffer
(
amd
->
acr
,
Mp3AudioConverterComplexInputDataProc
,
inClientData
,
&
size
,
&
amd
->
outBuffer
,
NULL
);
}
/***********************************************************************
* MPEG3_StreamOpen
*
*/
static
LRESULT
MPEG3_StreamOpen
(
PACMDRVSTREAMINSTANCE
adsi
)
{
AcmMpeg3Data
*
aad
;
assert
(
!
(
adsi
->
fdwOpen
&
ACM_STREAMOPENF_ASYNC
));
if
(
MPEG3_GetFormatIndex
(
adsi
->
pwfxSrc
)
==
0xFFFFFFFF
||
MPEG3_GetFormatIndex
(
adsi
->
pwfxDst
)
==
0xFFFFFFFF
)
return
ACMERR_NOTPOSSIBLE
;
aad
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
AcmMpeg3Data
));
if
(
aad
==
0
)
return
MMSYSERR_NOMEM
;
adsi
->
dwDriver
=
(
DWORD_PTR
)
aad
;
if
(
adsi
->
pwfxSrc
->
wFormatTag
==
WAVE_FORMAT_PCM
&&
adsi
->
pwfxDst
->
wFormatTag
==
WAVE_FORMAT_PCM
)
{
goto
theEnd
;
}
else
if
(
adsi
->
pwfxSrc
->
wFormatTag
==
WAVE_FORMAT_MPEGLAYER3
&&
adsi
->
pwfxDst
->
wFormatTag
==
WAVE_FORMAT_PCM
)
{
OSStatus
err
;
aad
->
in
.
mSampleRate
=
adsi
->
pwfxSrc
->
nSamplesPerSec
;
aad
->
out
.
mSampleRate
=
adsi
->
pwfxDst
->
nSamplesPerSec
;
aad
->
in
.
mBitsPerChannel
=
adsi
->
pwfxSrc
->
wBitsPerSample
;
aad
->
out
.
mBitsPerChannel
=
adsi
->
pwfxDst
->
wBitsPerSample
;
aad
->
in
.
mFormatID
=
kAudioFormatMPEGLayer3
;
aad
->
out
.
mFormatID
=
kAudioFormatLinearPCM
;
aad
->
in
.
mChannelsPerFrame
=
adsi
->
pwfxSrc
->
nChannels
;
aad
->
out
.
mChannelsPerFrame
=
adsi
->
pwfxDst
->
nChannels
;
aad
->
in
.
mFormatFlags
=
0
;
aad
->
out
.
mFormatFlags
=
kLinearPCMFormatFlagIsSignedInteger
;
aad
->
in
.
mBytesPerFrame
=
0
;
aad
->
out
.
mBytesPerFrame
=
(
aad
->
out
.
mBitsPerChannel
*
aad
->
out
.
mChannelsPerFrame
)
/
8
;
aad
->
in
.
mBytesPerPacket
=
0
;
aad
->
out
.
mBytesPerPacket
=
aad
->
out
.
mBytesPerFrame
;
aad
->
in
.
mFramesPerPacket
=
0
;
aad
->
out
.
mFramesPerPacket
=
1
;
aad
->
in
.
mReserved
=
aad
->
out
.
mReserved
=
0
;
aad
->
acr
=
NULL
;
err
=
AudioConverterNew
(
&
aad
->
in
,
&
aad
->
out
,
&
aad
->
acr
);
if
(
err
!=
noErr
)
{
ERR
(
"Create failed: %s
\n
"
,
wine_dbgstr_fourcc
(
err
));
goto
theEnd
;
}
else
{
aad
->
convert
=
mp3_leopard_horse
;
err
=
AudioFileStreamOpen
(
aad
,
Mp3PropertyListenerProc
,
Mp3PacketsProc
,
kAudioFormatMPEGLayer3
,
&
aad
->
afs
);
if
(
err
!=
noErr
)
{
ERR
(
"Stream Open failed: %s
\n
"
,
wine_dbgstr_fourcc
(
err
));
goto
theEnd
;
}
}
}
else
goto
theEnd
;
MPEG3_Reset
(
adsi
,
aad
);
return
MMSYSERR_NOERROR
;
theEnd:
HeapFree
(
GetProcessHeap
(),
0
,
aad
);
adsi
->
dwDriver
=
0L
;
return
MMSYSERR_NOTSUPPORTED
;
}
/***********************************************************************
* MPEG3_StreamClose
*
*/
static
LRESULT
MPEG3_StreamClose
(
PACMDRVSTREAMINSTANCE
adsi
)
{
AudioConverterDispose
(((
AcmMpeg3Data
*
)
adsi
->
dwDriver
)
->
acr
);
AudioFileStreamClose
(((
AcmMpeg3Data
*
)
adsi
->
dwDriver
)
->
afs
);
HeapFree
(
GetProcessHeap
(),
0
,
(
void
*
)
adsi
->
dwDriver
);
return
MMSYSERR_NOERROR
;
}
#endif
/***********************************************************************
* MPEG3_DriverDetails
*
*/
...
...
@@ -391,83 +716,6 @@ static LRESULT MPEG3_FormatSuggest(PACMDRVFORMATSUGGEST adfs)
}
/***********************************************************************
* MPEG3_Reset
*
*/
static
void
MPEG3_Reset
(
PACMDRVSTREAMINSTANCE
adsi
,
AcmMpeg3Data
*
aad
)
{
mpg123_feedseek
(
aad
->
mh
,
0
,
SEEK_SET
,
NULL
);
mpg123_close
(
aad
->
mh
);
mpg123_open_feed
(
aad
->
mh
);
}
/***********************************************************************
* MPEG3_StreamOpen
*
*/
static
LRESULT
MPEG3_StreamOpen
(
PACMDRVSTREAMINSTANCE
adsi
)
{
AcmMpeg3Data
*
aad
;
int
err
;
assert
(
!
(
adsi
->
fdwOpen
&
ACM_STREAMOPENF_ASYNC
));
if
(
MPEG3_GetFormatIndex
(
adsi
->
pwfxSrc
)
==
0xFFFFFFFF
||
MPEG3_GetFormatIndex
(
adsi
->
pwfxDst
)
==
0xFFFFFFFF
)
return
ACMERR_NOTPOSSIBLE
;
aad
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
AcmMpeg3Data
));
if
(
aad
==
0
)
return
MMSYSERR_NOMEM
;
adsi
->
dwDriver
=
(
DWORD_PTR
)
aad
;
if
(
adsi
->
pwfxSrc
->
wFormatTag
==
WAVE_FORMAT_PCM
&&
adsi
->
pwfxDst
->
wFormatTag
==
WAVE_FORMAT_PCM
)
{
goto
theEnd
;
}
else
if
(
adsi
->
pwfxSrc
->
wFormatTag
==
WAVE_FORMAT_MPEGLAYER3
&&
adsi
->
pwfxDst
->
wFormatTag
==
WAVE_FORMAT_PCM
)
{
/* resampling or mono <=> stereo not available
* MPEG3 algo only define 16 bit per sample output
*/
if
(
adsi
->
pwfxSrc
->
nSamplesPerSec
!=
adsi
->
pwfxDst
->
nSamplesPerSec
||
adsi
->
pwfxSrc
->
nChannels
!=
adsi
->
pwfxDst
->
nChannels
||
adsi
->
pwfxDst
->
wBitsPerSample
!=
16
)
goto
theEnd
;
aad
->
convert
=
mp3_horse
;
aad
->
mh
=
mpg123_new
(
NULL
,
&
err
);
mpg123_open_feed
(
aad
->
mh
);
}
/* no encoding yet
else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM &&
adsi->pwfxDst->wFormatTag == WAVE_FORMAT_MPEGLAYER3)
*/
else
goto
theEnd
;
MPEG3_Reset
(
adsi
,
aad
);
return
MMSYSERR_NOERROR
;
theEnd:
HeapFree
(
GetProcessHeap
(),
0
,
aad
);
adsi
->
dwDriver
=
0L
;
return
MMSYSERR_NOTSUPPORTED
;
}
/***********************************************************************
* MPEG3_StreamClose
*
*/
static
LRESULT
MPEG3_StreamClose
(
PACMDRVSTREAMINSTANCE
adsi
)
{
mpg123_close
(((
AcmMpeg3Data
*
)
adsi
->
dwDriver
)
->
mh
);
mpg123_delete
(((
AcmMpeg3Data
*
)
adsi
->
dwDriver
)
->
mh
);
HeapFree
(
GetProcessHeap
(),
0
,
(
void
*
)
adsi
->
dwDriver
);
return
MMSYSERR_NOERROR
;
}
/***********************************************************************
* MPEG3_StreamSize
*
*/
...
...
include/config.h.in
View file @
4430ab43
...
...
@@ -32,6 +32,19 @@
/* Define to 1 if you have the <asm/types.h> header file. */
#undef HAVE_ASM_TYPES_H
/* Define to 1 if you have the `AudioFileStreamOpen' function. */
#undef HAVE_AUDIOFILESTREAMOPEN
/* Define to 1 if you have the <AudioToolbox/AudioConverter.h> header file. */
#undef HAVE_AUDIOTOOLBOX_AUDIOCONVERTER_H
/* Define to 1 if you have the <AudioToolbox/AudioFileStream.h> header file.
*/
#undef HAVE_AUDIOTOOLBOX_AUDIOFILESTREAM_H
/* Define to 1 if you have the <AudioToolbox/AudioFile.h> header file. */
#undef HAVE_AUDIOTOOLBOX_AUDIOFILE_H
/* Define to 1 if you have the <AudioUnit/AudioUnit.h> header file. */
#undef HAVE_AUDIOUNIT_AUDIOUNIT_H
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment