#
# @(#)GNUmakefile	1.39 98/12/16
#
# To build audio outside of a JDK tree as an extension
# you must define AUDIO_EXTENSION=true
#
# The JDK your using to do the build is pointed to with ALT_JAVAHOME.
#
# Both of these can be set as environment variables
# or on the make command line.
#
# ex: 
#     set AUDIO_EXTENION=true
#     set ALT_JAVAHOME=/usr/local/java/jdk1.1.3/solaris 
#
# Please don't make changes to this little bit of hackery without
# talking to someone on the Audio Team: Kara Kytle, David Rivas, 
# or Nannette Simpson.
#

BUILDDIR = ../..
include $(BUILDDIR)/Platform.gmk

#
# This is required because we need to ship
# the engine code as a different library 
# and with a different package name as the 
# engine we ship in the *real* JDK.
#

# The package the source is authored for.
DEFAULT_PACKAGE=sun.audio
DEFAULT_PKGDIR= $(shell echo $(DEFAULT_PACKAGE) | sed 's:\.:/:g')

# The package we would like to put it into.
ifeq ($(AUDIO_EXTENSION), true)
# This is the extension version.
PACKAGE = com.sun.media.jmf.audio
LIBRARY = jmfaudio
else
# This is the JDK version.
PACKAGE = $(DEFAULT_PACKAGE)
LIBRARY = audio
endif

PRODUCT = sun

include $(BUILDDIR)/makefiles/Defs.gmk

#
# make sure we link the math.h with the floor() funciton
#
ifdef LIBRARY
    LDLIBS_COMMON += -lc
endif

# These are used below by the AudioEnvironment class.
ifdef DEBUG
	AUDIO_DEBUG=true
	CFLAGS += -DJNC_DEBUG=1
	CXXFLAGS += -DJNC_DEBUG=1
else
	AUDIO_DEBUG=false
endif

ifdef TRACE
	AUDIO_TRACE=true
        CFLAGS += -DJNC_TRACE=1
	CXXFLAGS += -DJNC_TRACE=1
else
	AUDIO_TRACE=false
endif

#
# Rules
#
AUDIO_ENV_CLASS=$(SHARE_SRC)/classes/$(PKGDIR)/AudioEnvironment.java
SHARE_SRC_DIR=$(SHARE_SRC)/classes/$(PKGDIR)
DEFAULT_SHARE_SRC_DIR=$(SHARE_SRC)/classes/$(DEFAULT_PKGDIR)
PLATFORM_SRC_DIR=$(PLATFORM_SRC)/classes/$(PKGDIR)
DEFAULT_PLATFORM_SRC_DIR=$(PLATFORM_SRC)/classes/$(DEFAULT_PKGDIR)
PLATFORM_NATIVE_DIR=$(PLATFORM_SRC)/native/$(PKGDIR)
DEFAULT_PLATFORM_NATIVE_DIR=$(PLATFORM_SRC)/native/$(DEFAULT_PKGDIR)
SHARE_NATIVE_DIR=$(SHARE_SRC)/native/$(PKGDIR)
DEFAULT_SHARE_NATIVE_DIR=$(SHARE_SRC)/native/$(DEFAULT_PKGDIR)

#
# These are rules we are using to get the source moved over.
#
ifeq ($(AUDIO_EXTENSION), true) 

all: SRC optimized debug soundbank

clean:: src_clean classheaders.clean classes.clean soundbank.clean 
	-rm $(AUDIO_ENV_CLASS)

# This mess is required to get the name of the library 
# into the class that will System.loadLibrary() it.
# ... could it get any worse? ....
HEADER_MESSAGE=THIS IS MACHINE GENERATED DO NOT EDIT
$(AUDIO_ENV_CLASS): GNUmakefile $(SHARE_SRC_DIR)
	@echo ++++ Generating the Audio Environment file: \\n\\t $@
	@echo \/\* $(HEADER_MESSAGE) \*\/ >$(AUDIO_ENV_CLASS)
	@echo package "$(PACKAGE)"\; >>$(AUDIO_ENV_CLASS)
	@echo class AudioEnvironment { >>$(AUDIO_ENV_CLASS)
	@echo static final String libraryName = \""$(LIBRARY)"\"\; >>$(AUDIO_ENV_CLASS)

	@echo static boolean debug = $(AUDIO_DEBUG)\; >>$(AUDIO_ENV_CLASS)
	@echo static boolean trace = $(AUDIO_TRACE)\; >>$(AUDIO_ENV_CLASS)
	@echo static final String version = \"$(FULL_VERSION)\"\; >>$(AUDIO_ENV_CLASS)
	@echo } >> $(AUDIO_ENV_CLASS)

$(SHARE_SRC_DIR):
	@mkdir -p $@


src_clean: FORCE 
	rm -f $(PLATFORM_SRC_DIR)/*.java $(SHARE_SRC_DIR)/*.java
	rm -f $(PLATFORM_NATIVE_DIR)/*.cpp $(SHARE_NATIVE_DIR)/*.cpp
	rm -f $(PLATFORM_NATIVE_DIR)/*.c $(SHARE_NATIVE_DIR)/*.c
	rm -f $(PLATFORM_NATIVE_DIR)/*.h $(SHARE_NATIVE_DIR)/*.h 

JAVA_FROM_SED=$(shell echo $(DEFAULT_PACKAGE) | sed 's:\.:\\\.:g')
JAVA_TO_SED=$(shell echo $(PACKAGE) | sed 's:\.:\\\.:g')
JAVA_SED_CMD=sed -e 's:$(JAVA_FROM_SED):$(JAVA_TO_SED):g'  

CPP_FROM_SED=$(shell echo $(DEFAULT_PACKAGE) | sed 's:\.:\_:g')
CPP_TO_SED=$(shell echo $(PACKAGE) | sed 's:\.:\_:g')
CPP_SED_CMD=sed -e 's:$(CPP_FROM_SED):$(CPP_TO_SED):g'

$(SHARE_SRC_DIR)/%.java: $(DEFAULT_SHARE_SRC_DIR)/%.java 
	@mkdir -p $(SHARE_SRC_DIR) 
	$(JAVA_SED_CMD) $? > $@   

$(PLATFORM_SRC_DIR)/%.java: $(DEFAULT_PLATFORM_SRC_DIR)/%.java 
	@mkdir -p $(PLATFORM_SRC_DIR) 
	$(JAVA_SED_CMD) $? > $@ 

$(SHARE_NATIVE_DIR)/%.cpp: $(DEFAULT_SHARE_NATIVE_DIR)/%.cpp
	@mkdir -p $(SHARE_NATIVE_DIR)
	$(CPP_SED_CMD) $? > $@

$(PLATFORM_NATIVE_DIR)/%.cpp: $(DEFAULT_PLATFORM_NATIVE_DIR)/%.cpp
	@mkdir -p $(PLATFORM_NATIVE_DIR)
	$(CPP_SED_CMD) $? > $@

move_c_files: FORCE
	@mkdir -p $(SHARE_NATIVE_DIR)
	@mkdir -p $(PLATFORM_NATIVE_DIR)
	-cp $(DEFAULT_PLATFORM_NATIVE_DIR)/*.c $(PLATFORM_NATIVE_DIR) 
	-chmod u+w $(PLATFORM_NATIVE_DIR)/*.c 
	-cp $(DEFAULT_SHARE_NATIVE_DIR)/*.c $(SHARE_NATIVE_DIR)
	-chmod u+w $(SHARE_NATIVE_DIR)/*.c 

# There is an evil little hack in here 
# that is required because of some JNI calling 
# in the engine that requires the package name.
# fortunately this is abstracted into a #define
# in the file Hae_Impl.h
move_h_files: FORCE 
	@mkdir -p $(SHARE_NATIVE_DIR)
	@mkdir -p $(PLATFORM_NATIVE_DIR) 
	-cp $(DEFAULT_PLATFORM_NATIVE_DIR)/*.h $(PLATFORM_NATIVE_DIR) 
	-chmod u+w $(PLATFORM_NATIVE_DIR)/*.h
	-cp $(DEFAULT_SHARE_NATIVE_DIR)/*.h $(SHARE_NATIVE_DIR)
	-chmod u+w $(SHARE_NATIVE_DIR)/*.h
	-sed -e "s:$(DEFAULT_PKGDIR):$(PKGDIR):g" $(DEFAULT_SHARE_NATIVE_DIR)/Hae_Impl.h >$(SHARE_NATIVE_DIR)/Hae_Impl.h

else  

all: optimized debug soundbank

clean:: classheaders.clean classes.clean soundbank.clean

# Do nothing for the normal versions.
src_clean:  

move_c_files:

move_h_files: 

endif

#
# Files
#
include $(MINCLUDES)sun_audio.jmk 
include $(MINCLUDES)sun_audio.cmk

#
# Add in the Solaris specific extra .c files.
#
FILES_platform_c = \
	$(TARGDIR)HAE_API_SolarisOS.c

FILES_export = \
	$(PKGDIR)/HaeMidiSong.java \
	$(PKGDIR)/HaeMidiNoise.java \
	$(PKGDIR)/HaeMixer.java \
	$(PKGDIR)/HaeRmfSong.java \
	$(PKGDIR)/HaeThread.java \
	$(PKGDIR)/HaeWaveStream.java
#	$(PKGDIR)/HaeWaveDirect.java \
#	$(PKGDIR)/HaeWaveMemory.java 
#	$(PKGDIR)/HaeMidiPlayer.java \
#	$(PKGDIR)/HaeWaveFile.java \

JAVA_FILES_BASE=$(FILES_java:$(PKGDIR)/%=%) 
JAVA_SRC_FILES=$(JAVA_FILES_BASE:%=$(SHARE_SRC_DIR)/%) 

CPP_SRC_FILES=$(FILES_cpp:%=$(SHARE_NATIVE_DIR)/%)
C_SRC_FILES=$(FILES_c:%=$(SHARE_NATIVE_DIR)/%) \
	    $(FILES_platform_c:%=$(PLATFORM_NATIVE_DIR)/%

# this needs to be here to keep the seperation from platform
# and share.
FILES_c += $(FILES_platform_c)

SRC: $(JAVA_SRC_FILES) $(CPP_SRC_FILES) move_c_files move_h_files
	@echo +++ Done making source files. 


#
# We're building a library so go get those definitions.
#
include $(BUILDDIR)/makefiles/Library.gmk

#
# The General MIDI Soundbank used by the Audio Engine to render
# midi data.
#
SOUNDBANK_SRC_DIR  = $(SHARE_SRC)/lib/audio
SOUNDBANK_DEST_DIR = $(LIBDIR)/audio

soundbank: $(SOUNDBANK_DEST_DIR)/soundbank.gm

$(SOUNDBANK_DEST_DIR)/soundbank.gm: $(SOUNDBANK_SRC_DIR)/soundbank.gm
	rm -fr $(SOUNDBANK_DEST_DIR)
	mkdir -p $(SOUNDBANK_DEST_DIR)
	cp $(SOUNDBANK_SRC_DIR)/soundbank.gm $(SOUNDBANK_DEST_DIR)
	chmod 444 $(SOUNDBANK_DEST_DIR)/soundbank.gm

soundbank.clean:
	rm -f $(SOUNDBANK_DEST_DIR)/soundbank.gm


# Search path for native method implementations files.
vpath %.cpp $(SHARE_SRC)/native/$(PKGDIR) $(PLATFORM_SRC)/native/$(PKGDIR)

# Need to look in the default src directory for include files 
#  as well.
#INCLUDES += -I$(SHARE_SRC)/native/$(DEFAULT_PKGDIR) -I$(PLATFORM_SRC)/native/$(DEFAULT_PKGDIR)

#
# Handle C++ style comments in the .c and .h files from Headspace
#
ifneq ($(CC_VERSION),gcc)
CFLAGS += -xCC 
endif

#
# Select the Solaris platform. Used by the native engine code.
#
CFLAGS   += -DX_PLATFORM=X_SOLARIS
CXXFLAGS += -DX_PLATFORM=X_SOLARIS

#
# define JAVA_SOUND here
#
CFLAGS   += -DJAVA_SOUND
CXXFLAGS += -DJAVA_SOUND

#
# define JAVA_THREAD here
#
CFLAGS   += -DJAVA_THREAD
CXXFLAGS += -DJAVA_THREAD

#
# Turn off C++ exception handling.
#
ifneq ($(CC_VERSION),gcc)
CXXFLAGS += -noex
endif

# use JNI for native method linkage.
JAVAHFLAGS += -jni

ifeq ($(AUDIO_EXTENSION), true)

#
# $(JAVAHOME) is some default (e.g. /usr/local/java/latest)
# unless $(ALT_JAVAHOME) is set on in which case $(ALT_JAVAHOME) is
# used.
# 

	# Where the JDK commands live
	BINDIR=$(JAVAHOME)/bin

	# Where the JDK includes live
	INCLUDEDIR= $(JAVAHOME)/include
	INCLUDES += -I$(INCLUDEDIR) -I$(INCLUDEDIR)/$(PLATFORM)

	# Classpath for java compiles and javah
	CLASSPATH=$(PLATFORM_SRC)/classes:$(SHARE_SRC)/classes:$(CLASSBINDIR):$(JAVAHOME)/lib/classes.zip

	# The commands need to be redefined.
	# In Defs.gmk they've all got a threads_flag argument
	# they are using which older versions of the commands
	# don't know anything about.	
	JAVA = $(BINDIR)/java$(SUFFIX)
	JAVAC = $(BINDIR)/javac$(SUFFIX)
	JAVAH = $(BINDIR)/javah$(SUFFIX)
	JAVADOC = $(BINDIR)/javadoc$(SUFFIX)
	JDB = $(BINDIR)/jdb$(SUFFIX)


# Some of the rest of this stuff is version dependent.
# Get the java version that we'll be using.
AUDIO_JDK_RELEASE = $(shell $(JAVA) -version 2>&1 | awk '{ print $3; }' | sed 's:\"::g')


# Command line hack for 1.2 to use threads flag
ifeq ($(AUDIO_JDK_RELEASE), 1.2)
	JAVA += -$(THREADS_FLAG)
	JAVAC += -$(THREADS_FLAG)
	JAVAH += -$(THREADS_FLAG) 
	JAVADOC += -$(THREADS_FLAG)
	JDB += -$(THREADS_FLAG)
endif

	# JMCD is defined here only to make it look like
	# what's currently in the Defs.gmk
	JCMD = $(JAVA)
	JAVAC_CMD = $(JCMD) -ms16m -mx64m -classpath $(CLASSPATH) sun.tools.javac.Main

	# Location of the JDK libs
	OTHER_LDLIBS += -L$(JAVAHOME)/lib/$(ARCH)/$(TSOBJDIR)

	# In 1.2 the old libjava.so was split into libjava.so and libjvm.so
	# Unfortunately we must overide the LDLIBS options for pre-1.2 builds.
	ifneq ($(AUDIO_JDK_RELEASE), 1.2)
		LDLIBS_OPT = -L$(LIB_LOCATION)
		LDLIBS_DBG = -L$(LIB_LOCATION)
	else 
		LDLIBS_OPT = -L$(LIB_LOCATION) -ljvm$(SUFFIX) -ljava$(SUFFIX) 
		LDLIBS_DBG = -L$(LIB_LOCATION) -ljvm$(SUFFIX) -ljava$(SUFFIX)
	endif

endif

# Useful for debugging this nightmare
MF_DEBUG: FORCE
	@echo PKGDIR = $(PKGDIR)
	@echo CLASSDESTDIR = $(CLASSDESTDIR)
	@echo DEFAULT_PKGDIR = $(DEFAULT_PKGDIR)
	@echo DEFAULT_SHARE_SRC_DIR = $(DEFAULT_SHARE_SRC_DIR)
	@echo DEFAULT_PLATFORM_SRC_DIR = $(DEFAULT_PLATFORM_SRC_DIR)
	@echo SHARE_NATIVE_DIR = $(SHARE_NATIVE_DIR)
	@echo DEFAULT_SHARE_NATIVE_DIR = $(DEFAULT_SHARE_NATIVE_DIR)
	@echo PLATFORM_NATIVE_DIR = $(PLATFORM_NATIVE_DIR)
	@echo DEFAULT_PLATFORM_NATIVE_DIR = $(DEFAULT_PLATFORM_NATIVE_DIR)
	@echo JAVA_FROM_SED = \"$(JAVA_FROM_SED)\"
	@echo JAVA_TO_SED = \"$(JAVA_TO_SED)\"
	@echo JAVA_SED_CMD = $(JAVA_SED_CMD)
	@echo CPP_FROM_SED = \"$(CPP_FROM_SED)\"
	@echo CPP_TO_SED = \"$(CPP_TO_SED)\"
	@echo CPP_SED_CMD = \"$(CPP_SED_CMD)\"
#	@echo JAVA_FILES_BASE = $(JAVA_FILES_BASE)
#	@echo JAVA_SRC_FILES = $(JAVA_SRC_FILES)

