diff options
Diffstat (limited to 'indra/media_plugins')
| -rw-r--r-- | indra/media_plugins/example/media_plugin_example.cpp | 733 | ||||
| -rw-r--r-- | indra/media_plugins/webkit/CMakeLists.txt | 5 | ||||
| -rw-r--r-- | indra/media_plugins/webkit/media_plugin_webkit.cpp | 93 | ||||
| -rw-r--r-- | indra/media_plugins/winmmshim/CMakeLists.txt | 6 | ||||
| -rw-r--r-- | indra/media_plugins/winmmshim/forwarding_api.cpp | 173 | ||||
| -rw-r--r-- | indra/media_plugins/winmmshim/forwarding_api.h | 1 | ||||
| -rw-r--r-- | indra/media_plugins/winmmshim/winmm_shim.cpp | 22 | 
7 files changed, 620 insertions, 413 deletions
| diff --git a/indra/media_plugins/example/media_plugin_example.cpp b/indra/media_plugins/example/media_plugin_example.cpp index f8a871930e..da7de01799 100644 --- a/indra/media_plugins/example/media_plugin_example.cpp +++ b/indra/media_plugins/example/media_plugin_example.cpp @@ -6,21 +6,21 @@   * $LicenseInfo:firstyear=2008&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2010, Linden Research, Inc. - *  + *   * 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;   * version 2.1 of the License only. - *  + *   * 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; if not, write to the Free Software   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  + *   * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   * @endcond @@ -39,48 +39,48 @@  ////////////////////////////////////////////////////////////////////////////////  //  class MediaPluginExample : -		public MediaPluginBase +        public MediaPluginBase  { -	public: -		MediaPluginExample( LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data ); -		~MediaPluginExample(); - -		/*virtual*/ void receiveMessage( const char* message_string ); - -	private: -		bool init(); -		void update( F64 milliseconds ); -		void write_pixel( int x, int y, unsigned char r, unsigned char g, unsigned char b ); -		bool mFirstTime; - -		time_t mLastUpdateTime; -		enum Constants { ENumObjects = 10 }; -		unsigned char* mBackgroundPixels; -		int mColorR[ ENumObjects ]; -		int mColorG[ ENumObjects ]; -		int mColorB[ ENumObjects ]; -		int mXpos[ ENumObjects ]; -		int mYpos[ ENumObjects ]; -		int mXInc[ ENumObjects ]; -		int mYInc[ ENumObjects ]; -		int mBlockSize[ ENumObjects ]; -		bool mMouseButtonDown; -		bool mStopAction; +    public: +        MediaPluginExample( LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data ); +        ~MediaPluginExample(); + +        /*virtual*/ void receiveMessage( const char* message_string ); + +    private: +        bool init(); +        void update( F64 milliseconds ); +        void write_pixel( int x, int y, unsigned char r, unsigned char g, unsigned char b ); +        bool mFirstTime; + +        time_t mLastUpdateTime; +        enum Constants { ENumObjects = 10 }; +        unsigned char* mBackgroundPixels; +        int mColorR[ ENumObjects ]; +        int mColorG[ ENumObjects ]; +        int mColorB[ ENumObjects ]; +        int mXpos[ ENumObjects ]; +        int mYpos[ ENumObjects ]; +        int mXInc[ ENumObjects ]; +        int mYInc[ ENumObjects ]; +        int mBlockSize[ ENumObjects ]; +        bool mMouseButtonDown; +        bool mStopAction;  };  ////////////////////////////////////////////////////////////////////////////////  //  MediaPluginExample::MediaPluginExample( LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data ) : -	MediaPluginBase( host_send_func, host_user_data ) +    MediaPluginBase( host_send_func, host_user_data )  { -	mFirstTime = true; -	mWidth = 0; -	mHeight = 0; -	mDepth = 4; -	mPixels = 0; -	mMouseButtonDown = false; -	mStopAction = false; -	mLastUpdateTime = 0; +    mFirstTime = true; +    mWidth = 0; +    mHeight = 0; +    mDepth = 4; +    mPixels = 0; +    mMouseButtonDown = false; +    mStopAction = false; +    mLastUpdateTime = 0;  }  //////////////////////////////////////////////////////////////////////////////// @@ -93,395 +93,320 @@ MediaPluginExample::~MediaPluginExample()  //  void MediaPluginExample::receiveMessage( const char* message_string )  { -	LLPluginMessage message_in; - -	if ( message_in.parse( message_string ) >= 0 ) -	{ -		std::string message_class = message_in.getClass(); -		std::string message_name = message_in.getName(); - -		if ( message_class == LLPLUGIN_MESSAGE_CLASS_BASE ) -		{ -			if ( message_name == "init" ) -			{ -				LLPluginMessage message( "base", "init_response" ); -				LLSD versions = LLSD::emptyMap(); -				versions[ LLPLUGIN_MESSAGE_CLASS_BASE ] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION; -				versions[ LLPLUGIN_MESSAGE_CLASS_MEDIA ] = LLPLUGIN_MESSAGE_CLASS_MEDIA_VERSION; -				versions[ LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER ] = LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER_VERSION; -				message.setValueLLSD( "versions", versions ); - -				std::string plugin_version = "Example media plugin, Example Version 1.0.0.0"; -				message.setValue( "plugin_version", plugin_version ); -				sendMessage( message ); -			} -			else -			if ( message_name == "idle" ) -			{ -				// no response is necessary here. -				F64 time = message_in.getValueReal( "time" ); - -				// Convert time to milliseconds for update() -				update( time ); -			} -			else -			if ( message_name == "cleanup" ) -			{ -				// clean up here -			} -			else -			if ( message_name == "shm_added" ) -			{ -				SharedSegmentInfo info; -				info.mAddress = message_in.getValuePointer( "address" ); -				info.mSize = ( size_t )message_in.getValueS32( "size" ); -				std::string name = message_in.getValue( "name" ); - -				mSharedSegments.insert( SharedSegmentMap::value_type( name, info ) ); - -			} -			else -			if ( message_name == "shm_remove" ) -			{ -				std::string name = message_in.getValue( "name" ); - -				SharedSegmentMap::iterator iter = mSharedSegments.find( name ); -				if( iter != mSharedSegments.end() ) -				{ -					if ( mPixels == iter->second.mAddress ) -					{ -						// This is the currently active pixel buffer. -						// Make sure we stop drawing to it. -						mPixels = NULL; -						mTextureSegmentName.clear(); -					}; -					mSharedSegments.erase( iter ); -				} -				else -				{ -					//std::cerr << "MediaPluginExample::receiveMessage: unknown shared memory region!" << std::endl; -				}; - -				// Send the response so it can be cleaned up. -				LLPluginMessage message( "base", "shm_remove_response" ); -				message.setValue( "name", name ); -				sendMessage( message ); -			} -			else -			{ -				//std::cerr << "MediaPluginExample::receiveMessage: unknown base message: " << message_name << std::endl; -			}; -		} -		else -		if ( message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA ) -		{ -			if ( message_name == "init" ) -			{ -				// Plugin gets to decide the texture parameters to use. -				LLPluginMessage message( LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params" ); -				message.setValueS32( "default_width", mWidth ); -				message.setValueS32( "default_height", mHeight ); -				message.setValueS32( "depth", mDepth ); -				message.setValueU32( "internalformat", GL_RGBA ); -				message.setValueU32( "format", GL_RGBA ); -				message.setValueU32( "type", GL_UNSIGNED_BYTE ); -				message.setValueBoolean( "coords_opengl", false ); -				sendMessage( message ); -			} -			else if ( message_name == "size_change" ) -			{ -				std::string name = message_in.getValue( "name" ); -				S32 width = message_in.getValueS32( "width" ); -				S32 height = message_in.getValueS32( "height" ); -				S32 texture_width = message_in.getValueS32( "texture_width" ); -				S32 texture_height = message_in.getValueS32( "texture_height" ); - -				if ( ! name.empty() ) -				{ -					// Find the shared memory region with this name -					SharedSegmentMap::iterator iter = mSharedSegments.find( name ); -					if ( iter != mSharedSegments.end() ) -					{ -						mPixels = ( unsigned char* )iter->second.mAddress; -						mWidth = width; -						mHeight = height; - -						mTextureWidth = texture_width; -						mTextureHeight = texture_height; - -						init(); -					}; -				}; - -				LLPluginMessage message( LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response" ); -				message.setValue( "name", name ); -				message.setValueS32( "width", width ); -				message.setValueS32( "height", height ); -				message.setValueS32( "texture_width", texture_width ); -				message.setValueS32( "texture_height", texture_height ); -				sendMessage( message ); -			} -			else -			if ( message_name == "load_uri" ) -			{ -				std::string uri = message_in.getValue( "uri" ); -				if ( ! uri.empty() ) -				{ -				}; -			} -			else -			if ( message_name == "mouse_event" ) -			{ -				std::string event = message_in.getValue( "event" ); -				S32 button = message_in.getValueS32( "button" ); - -				// left mouse button -				if ( button == 0 ) -				{ -					int mouse_x = message_in.getValueS32( "x" ); -					int mouse_y = message_in.getValueS32( "y" ); -					std::string modifiers = message_in.getValue( "modifiers" ); - -					if ( event == "move" ) -					{ -						if ( mMouseButtonDown ) -							write_pixel( mouse_x, mouse_y, rand() % 0x80 + 0x80, rand() % 0x80 + 0x80, rand() % 0x80 + 0x80 ); -					} -					else -					if ( event == "down" ) -					{ -						mMouseButtonDown = true; -					} -					else -					if ( event == "up" ) -					{ -						mMouseButtonDown = false; -					} -					else -					if ( event == "double_click" ) -					{ -					}; -				}; -			} -			else -			if ( message_name == "key_event" ) -			{ -				std::string event = message_in.getValue( "event" ); -				S32 key = message_in.getValueS32( "key" ); -				std::string modifiers = message_in.getValue( "modifiers" ); - -				if ( event == "down" ) -				{ -					if ( key == ' ') -					{ -						mLastUpdateTime = 0; -						update( 0.0f ); -					}; -				}; -			} -			else -			{ -				//std::cerr << "MediaPluginExample::receiveMessage: unknown media message: " << message_string << std::endl; -			}; -		} -		else -		if ( message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER ) -		{ -			if ( message_name == "browse_reload" ) -			{ -				mLastUpdateTime = 0; -				mFirstTime = true; -				mStopAction = false; -				update( 0.0f ); -			} -			else -			if ( message_name == "browse_stop" ) -			{ -				for( int n = 0; n < ENumObjects; ++n ) -					mXInc[ n ] = mYInc[ n ] = 0; - -				mStopAction = true; -				update( 0.0f ); -			} -			else -			{ -				//std::cerr << "MediaPluginExample::receiveMessage: unknown media_browser message: " << message_string << std::endl; -			}; -		} -		else -		{ -			//std::cerr << "MediaPluginExample::receiveMessage: unknown message class: " << message_class << std::endl; -		}; -	}; +//  std::cerr << "MediaPluginWebKit::receiveMessage: received message: \"" << message_string << "\"" << std::endl; +    LLPluginMessage message_in; + +    if(message_in.parse(message_string) >= 0) +    { +        std::string message_class = message_in.getClass(); +        std::string message_name = message_in.getName(); +        if(message_class == LLPLUGIN_MESSAGE_CLASS_BASE) +        { +            if(message_name == "init") +            { +                LLPluginMessage message("base", "init_response"); +                LLSD versions = LLSD::emptyMap(); +                versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION; +                versions[LLPLUGIN_MESSAGE_CLASS_MEDIA] = LLPLUGIN_MESSAGE_CLASS_MEDIA_VERSION; +                versions[LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER] = LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER_VERSION; +                message.setValueLLSD("versions", versions); + +                std::string plugin_version = "Example plugin 1.0..0"; +                message.setValue("plugin_version", plugin_version); +                sendMessage(message); +            } +            else if(message_name == "idle") +            { +                // no response is necessary here. +                F64 time = message_in.getValueReal("time"); + +                // Convert time to milliseconds for update() +                update((int)(time * 1000.0f)); +            } +            else if(message_name == "cleanup") +            { +            } +            else if(message_name == "shm_added") +            { +                SharedSegmentInfo info; +                info.mAddress = message_in.getValuePointer("address"); +                info.mSize = (size_t)message_in.getValueS32("size"); +                std::string name = message_in.getValue("name"); + +                mSharedSegments.insert(SharedSegmentMap::value_type(name, info)); + +            } +            else if(message_name == "shm_remove") +            { +                std::string name = message_in.getValue("name"); + +                SharedSegmentMap::iterator iter = mSharedSegments.find(name); +                if(iter != mSharedSegments.end()) +                { +                    if(mPixels == iter->second.mAddress) +                    { +                        // This is the currently active pixel buffer.  Make sure we stop drawing to it. +                        mPixels = NULL; +                        mTextureSegmentName.clear(); +                    } +                    mSharedSegments.erase(iter); +                } +                else +                { +//                  std::cerr << "MediaPluginWebKit::receiveMessage: unknown shared memory region!" << std::endl; +                } + +                // Send the response so it can be cleaned up. +                LLPluginMessage message("base", "shm_remove_response"); +                message.setValue("name", name); +                sendMessage(message); +            } +            else +            { +//              std::cerr << "MediaPluginWebKit::receiveMessage: unknown base message: " << message_name << std::endl; +            } +        } +        else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA) +        { +            if(message_name == "init") +            { +                // Plugin gets to decide the texture parameters to use. +                mDepth = 4; +                LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params"); +                message.setValueS32("default_width", 1024); +                message.setValueS32("default_height", 1024); +                message.setValueS32("depth", mDepth); +                message.setValueU32("internalformat", GL_RGBA); +                message.setValueU32("format", GL_RGBA); +                message.setValueU32("type", GL_UNSIGNED_BYTE); +                message.setValueBoolean("coords_opengl", true); +                sendMessage(message); +            } +            else if(message_name == "size_change") +            { +                std::string name = message_in.getValue("name"); +                S32 width = message_in.getValueS32("width"); +                S32 height = message_in.getValueS32("height"); +                S32 texture_width = message_in.getValueS32("texture_width"); +                S32 texture_height = message_in.getValueS32("texture_height"); + +                if(!name.empty()) +                { +                    // Find the shared memory region with this name +                    SharedSegmentMap::iterator iter = mSharedSegments.find(name); +                    if(iter != mSharedSegments.end()) +                    { +                        mPixels = (unsigned char*)iter->second.mAddress; +                        mWidth = width; +                        mHeight = height; + +                        mTextureWidth = texture_width; +                        mTextureHeight = texture_height; +                    }; +                }; + +                LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response"); +                message.setValue("name", name); +                message.setValueS32("width", width); +                message.setValueS32("height", height); +                message.setValueS32("texture_width", texture_width); +                message.setValueS32("texture_height", texture_height); +                sendMessage(message); + +            } +            else if(message_name == "load_uri") +            { +            } +            else if(message_name == "mouse_event") +            { +                std::string event = message_in.getValue("event"); +                if(event == "down") +                { + +                } +                else if(event == "up") +                { +                } +                else if(event == "double_click") +                { +                } +            } +        } +        else +        { +//          std::cerr << "MediaPluginWebKit::receiveMessage: unknown message class: " << message_class << std::endl; +        }; +    }  }  ////////////////////////////////////////////////////////////////////////////////  //  void MediaPluginExample::write_pixel( int x, int y, unsigned char r, unsigned char g, unsigned char b )  { -	// make sure we don't write outside the buffer -	if ( ( x < 0 ) || ( x >= mWidth ) || ( y < 0 ) || ( y >= mHeight ) ) -		return; -		 -	if ( mBackgroundPixels != NULL ) -	{ -		unsigned char *pixel = mBackgroundPixels; -		pixel += y * mWidth * mDepth; -		pixel += ( x * mDepth ); -		pixel[ 0 ] = b; -		pixel[ 1 ] = g; -		pixel[ 2 ] = r; - -		setDirty( x, y, x + 1, y + 1 ); -	}; +    // make sure we don't write outside the buffer +    if ( ( x < 0 ) || ( x >= mWidth ) || ( y < 0 ) || ( y >= mHeight ) ) +        return; + +    if ( mBackgroundPixels != NULL ) +    { +        unsigned char *pixel = mBackgroundPixels; +        pixel += y * mWidth * mDepth; +        pixel += ( x * mDepth ); +        pixel[ 0 ] = b; +        pixel[ 1 ] = g; +        pixel[ 2 ] = r; + +        setDirty( x, y, x + 1, y + 1 ); +    };  }  ////////////////////////////////////////////////////////////////////////////////  //  void MediaPluginExample::update( F64 milliseconds )  { -	if ( mWidth < 1 || mWidth > 2048 || mHeight < 1 || mHeight > 2048 ) -		return; - -	if ( mPixels == 0 ) -			return; - -	if ( mFirstTime ) -	{ -		for( int n = 0; n < ENumObjects; ++n ) -		{ -			mXpos[ n ] = ( mWidth / 2 ) + rand() % ( mWidth / 16 ) - ( mWidth / 32 ); -			mYpos[ n ] = ( mHeight / 2 ) + rand() % ( mHeight / 16 ) - ( mHeight / 32 ); - -			mColorR[ n ] = rand() % 0x60 + 0x60; -			mColorG[ n ] = rand() % 0x60 + 0x60; -			mColorB[ n ] = rand() % 0x60 + 0x60; - -			mXInc[ n ] = 0; -			while ( mXInc[ n ] == 0 ) -				mXInc[ n ] = rand() % 7 - 3; - -			mYInc[ n ] = 0; -			while ( mYInc[ n ] == 0 ) -				mYInc[ n ] = rand() % 9 - 4; - -			mBlockSize[ n ] = rand() % 0x30 + 0x10; -		}; - -		delete [] mBackgroundPixels; -				 -		mBackgroundPixels = new unsigned char[ mWidth * mHeight * mDepth ]; - -		mFirstTime = false; -	}; - -	if ( mStopAction ) -		return; - -	if ( time( NULL ) > mLastUpdateTime + 3 ) -	{ -		const int num_squares = rand() % 20 + 4; -		int sqr1_r = rand() % 0x80 + 0x20; -		int sqr1_g = rand() % 0x80 + 0x20; -		int sqr1_b = rand() % 0x80 + 0x20; -		int sqr2_r = rand() % 0x80 + 0x20; -		int sqr2_g = rand() % 0x80 + 0x20; -		int sqr2_b = rand() % 0x80 + 0x20; - -		for ( int y1 = 0; y1 < num_squares; ++y1 ) -		{ -			for ( int x1 = 0; x1 < num_squares; ++x1 ) -			{ -				int px_start = mWidth * x1 / num_squares; -				int px_end = ( mWidth * ( x1 + 1 ) ) / num_squares; -				int py_start = mHeight * y1 / num_squares; -				int py_end = ( mHeight * ( y1 + 1 ) ) / num_squares; - -				for( int y2 = py_start; y2 < py_end; ++y2 ) -				{ -					for( int x2 = px_start; x2 < px_end; ++x2 ) -					{ -						int rowspan = mWidth * mDepth; - -						if ( ( y1 % 2 ) ^ ( x1 % 2 ) ) -						{ -							mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 0 ] = sqr1_r; -							mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 1 ] = sqr1_g; -							mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 2 ] = sqr1_b; -						} -						else -						{ -							mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 0 ] = sqr2_r; -							mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 1 ] = sqr2_g; -							mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 2 ] = sqr2_b; -						}; -					}; -				}; -			}; -		}; - -		time( &mLastUpdateTime ); -	}; - -	memcpy( mPixels, mBackgroundPixels, mWidth * mHeight * mDepth ); - -	for( int n = 0; n < ENumObjects; ++n ) -	{ -		if ( rand() % 50 == 0 ) -		{ -				mXInc[ n ] = 0; -				while ( mXInc[ n ] == 0 ) -					mXInc[ n ] = rand() % 7 - 3; - -				mYInc[ n ] = 0; -				while ( mYInc[ n ] == 0 ) -					mYInc[ n ] = rand() % 9 - 4; -		}; - -		if ( mXpos[ n ] + mXInc[ n ] < 0 || mXpos[ n ] + mXInc[ n ] >= mWidth - mBlockSize[ n ] ) -			mXInc[ n ] =- mXInc[ n ]; - -		if ( mYpos[ n ] + mYInc[ n ] < 0 || mYpos[ n ] + mYInc[ n ] >= mHeight - mBlockSize[ n ] ) -			mYInc[ n ] =- mYInc[ n ]; - -		mXpos[ n ] += mXInc[ n ]; -		mYpos[ n ] += mYInc[ n ]; - -		for( int y = 0; y < mBlockSize[ n ]; ++y ) -		{ -			for( int x = 0; x < mBlockSize[ n ]; ++x ) -			{ -				mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 0 ] = mColorR[ n ]; -				mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 1 ] = mColorG[ n ]; -				mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 2 ] = mColorB[ n ]; -			}; -		}; -	}; - -	setDirty( 0, 0, mWidth, mHeight ); +    if ( mWidth < 1 || mWidth > 2048 || mHeight < 1 || mHeight > 2048 ) +        return; + +    if ( mPixels == 0 ) +            return; + +    if ( mFirstTime ) +    { +        for( int n = 0; n < ENumObjects; ++n ) +        { +            mXpos[ n ] = ( mWidth / 2 ) + rand() % ( mWidth / 16 ) - ( mWidth / 32 ); +            mYpos[ n ] = ( mHeight / 2 ) + rand() % ( mHeight / 16 ) - ( mHeight / 32 ); + +            mColorR[ n ] = rand() % 0x60 + 0x60; +            mColorG[ n ] = rand() % 0x60 + 0x60; +            mColorB[ n ] = rand() % 0x60 + 0x60; + +            mXInc[ n ] = 0; +            while ( mXInc[ n ] == 0 ) +                mXInc[ n ] = rand() % 7 - 3; + +            mYInc[ n ] = 0; +            while ( mYInc[ n ] == 0 ) +                mYInc[ n ] = rand() % 9 - 4; + +            mBlockSize[ n ] = rand() % 0x30 + 0x10; +        }; + +        delete [] mBackgroundPixels; + +        mBackgroundPixels = new unsigned char[ mWidth * mHeight * mDepth ]; + +        mFirstTime = false; +    }; + +    if ( mStopAction ) +        return; + +    if ( time( NULL ) > mLastUpdateTime + 3 ) +    { +        const int num_squares = rand() % 20 + 4; +        int sqr1_r = rand() % 0x80 + 0x20; +        int sqr1_g = rand() % 0x80 + 0x20; +        int sqr1_b = rand() % 0x80 + 0x20; +        int sqr2_r = rand() % 0x80 + 0x20; +        int sqr2_g = rand() % 0x80 + 0x20; +        int sqr2_b = rand() % 0x80 + 0x20; + +        for ( int y1 = 0; y1 < num_squares; ++y1 ) +        { +            for ( int x1 = 0; x1 < num_squares; ++x1 ) +            { +                int px_start = mWidth * x1 / num_squares; +                int px_end = ( mWidth * ( x1 + 1 ) ) / num_squares; +                int py_start = mHeight * y1 / num_squares; +                int py_end = ( mHeight * ( y1 + 1 ) ) / num_squares; + +                for( int y2 = py_start; y2 < py_end; ++y2 ) +                { +                    for( int x2 = px_start; x2 < px_end; ++x2 ) +                    { +                        int rowspan = mWidth * mDepth; + +                        if ( ( y1 % 2 ) ^ ( x1 % 2 ) ) +                        { +                            mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 0 ] = sqr1_r; +                            mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 1 ] = sqr1_g; +                            mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 2 ] = sqr1_b; +                        } +                        else +                        { +                            mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 0 ] = sqr2_r; +                            mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 1 ] = sqr2_g; +                            mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 2 ] = sqr2_b; +                        }; +                    }; +                }; +            }; +        }; + +        time( &mLastUpdateTime ); +    }; + +    memcpy( mPixels, mBackgroundPixels, mWidth * mHeight * mDepth ); + +    for( int n = 0; n < ENumObjects; ++n ) +    { +        if ( rand() % 50 == 0 ) +        { +                mXInc[ n ] = 0; +                while ( mXInc[ n ] == 0 ) +                    mXInc[ n ] = rand() % 7 - 3; + +                mYInc[ n ] = 0; +                while ( mYInc[ n ] == 0 ) +                    mYInc[ n ] = rand() % 9 - 4; +        }; + +        if ( mXpos[ n ] + mXInc[ n ] < 0 || mXpos[ n ] + mXInc[ n ] >= mWidth - mBlockSize[ n ] ) +            mXInc[ n ] =- mXInc[ n ]; + +        if ( mYpos[ n ] + mYInc[ n ] < 0 || mYpos[ n ] + mYInc[ n ] >= mHeight - mBlockSize[ n ] ) +            mYInc[ n ] =- mYInc[ n ]; + +        mXpos[ n ] += mXInc[ n ]; +        mYpos[ n ] += mYInc[ n ]; + +        for( int y = 0; y < mBlockSize[ n ]; ++y ) +        { +            for( int x = 0; x < mBlockSize[ n ]; ++x ) +            { +                mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 0 ] = mColorR[ n ]; +                mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 1 ] = mColorG[ n ]; +                mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 2 ] = mColorB[ n ]; +            }; +        }; +    }; + +    setDirty( 0, 0, mWidth, mHeight );  };  ////////////////////////////////////////////////////////////////////////////////  //  bool MediaPluginExample::init()  { -	LLPluginMessage message( LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text" ); -	message.setValue( "name", "Example Plugin" ); -	sendMessage( message ); +    LLPluginMessage message( LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text" ); +    message.setValue( "name", "Example Plugin" ); +    sendMessage( message ); -	return true; +    return true;  };  ////////////////////////////////////////////////////////////////////////////////  //  int init_media_plugin( LLPluginInstance::sendMessageFunction host_send_func, -						void* host_user_data, -						LLPluginInstance::sendMessageFunction *plugin_send_func, -						void **plugin_user_data ) +                        void* host_user_data, +                        LLPluginInstance::sendMessageFunction *plugin_send_func, +                        void **plugin_user_data )  { -	MediaPluginExample* self = new MediaPluginExample( host_send_func, host_user_data ); -	*plugin_send_func = MediaPluginExample::staticReceiveMessage; -	*plugin_user_data = ( void* )self; +    MediaPluginExample* self = new MediaPluginExample( host_send_func, host_user_data ); +    *plugin_send_func = MediaPluginExample::staticReceiveMessage; +    *plugin_user_data = ( void* )self; -	return 0; +    return 0;  } + diff --git a/indra/media_plugins/webkit/CMakeLists.txt b/indra/media_plugins/webkit/CMakeLists.txt index 05f1236606..b36291f0e8 100644 --- a/indra/media_plugins/webkit/CMakeLists.txt +++ b/indra/media_plugins/webkit/CMakeLists.txt @@ -27,6 +27,7 @@ include_directories(      ${LLIMAGE_INCLUDE_DIRS}      ${LLRENDER_INCLUDE_DIRS}      ${LLWINDOW_INCLUDE_DIRS} +    ${LLQTWEBKIT_INCLUDE_DIR}  ) @@ -120,8 +121,8 @@ if (DARWIN)    add_custom_command(      TARGET media_plugin_webkit POST_BUILD  #    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/libllqtwebkit.dylib -    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libllqtwebkit.dylib ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/ -    DEPENDS media_plugin_webkit ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libllqtwebkit.dylib +    COMMAND ${CMAKE_COMMAND} -E copy ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/ +    DEPENDS media_plugin_webkit ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib      )  endif (DARWIN) diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp index bd1a44a930..9ba8edbb59 100644 --- a/indra/media_plugins/webkit/media_plugin_webkit.cpp +++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp @@ -341,7 +341,7 @@ private:  		url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundB * 255.0f);  		url << "%22%3E%3C/body%3E%3C/html%3E"; -		lldebugs << "data url is: " << url.str() << llendl; +		//lldebugs << "data url is: " << url.str() << llendl;  		LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, url.str() );  //		LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, "about:blank" ); @@ -407,6 +407,8 @@ private:  		{  			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin");  			message.setValue("uri", event.getEventUri()); +			message.setValueBoolean("history_back_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_BACK)); +			message.setValueBoolean("history_forward_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_FORWARD));  			sendMessage(message);  			setStatus(STATUS_LOADING); @@ -490,6 +492,15 @@ private:  	////////////////////////////////////////////////////////////////////////////////  	// virtual +	void onNavigateErrorPage(const EventType& event) +	{ +		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_error_page"); +		message.setValueS32("status_code", event.getIntValue()); +		sendMessage(message); +	} +	 +	//////////////////////////////////////////////////////////////////////////////// +	// virtual  	void onLocationChange(const EventType& event)  	{  		if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE) @@ -517,6 +528,11 @@ private:  	{  		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_nofollow");  		message.setValue("uri", event.getEventUri()); +#if LLQTWEBKIT_API_VERSION >= 7 +		message.setValue("nav_type", event.getNavigationType()); +#else +		message.setValue("nav_type", "clicked"); +#endif  		sendMessage(message);  	} @@ -569,6 +585,57 @@ private:  		return blockingPickFile();  	} +	std::string mAuthUsername; +	std::string mAuthPassword; +	bool mAuthOK; +	 +	//////////////////////////////////////////////////////////////////////////////// +	// virtual +	bool onAuthRequest(const std::string &in_url, const std::string &in_realm, std::string &out_username, std::string &out_password) +	{ +		mAuthOK = false; + +		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "auth_request"); +		message.setValue("url", in_url); +		message.setValue("realm", in_realm); +		message.setValueBoolean("blocking_request", true); +				 +		// The "blocking_request" key in the message means this sendMessage call will block until a response is received. +		sendMessage(message); +		 +		if(mAuthOK) +		{ +			out_username = mAuthUsername; +			out_password = mAuthPassword; +		} +		 +		return mAuthOK; +	} +	 +	void authResponse(LLPluginMessage &message) +	{ +		mAuthOK = message.getValueBoolean("ok"); +		if(mAuthOK) +		{ +			mAuthUsername = message.getValue("username"); +			mAuthPassword = message.getValue("password"); +		} +	} +	 +	//////////////////////////////////////////////////////////////////////////////// +	// virtual +	void onLinkHovered(const EventType& event) +	{ +		if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE) +		{ +			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "link_hovered"); +			message.setValue("link", event.getEventUri()); +			message.setValue("title", event.getStringValue()); +			message.setValue("text", event.getStringValue2()); +			sendMessage(message); +		} +	} +	  	LLQtWebKit::EKeyboardModifier decodeModifiers(std::string &modifiers)  	{  		int result = 0; @@ -1096,6 +1163,10 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  			{  				onPickFileResponse(message_in.getValue("file"));  			} +			if(message_name == "auth_response") +			{ +				authResponse(message_in); +			}  			else  			{  //				std::cerr << "MediaPluginWebKit::receiveMessage: unknown media message: " << message_string << std::endl; @@ -1174,7 +1245,9 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  				std::string url = message_in.getValue("url");  				if ( 404 == code )	// browser lib only supports 404 right now  				{ -					LLQtWebKit::getInstance()->set404RedirectUrl( mBrowserWindowId, url ); +#if LLQTWEBKIT_API_VERSION < 8 +				 	LLQtWebKit::getInstance()->set404RedirectUrl( mBrowserWindowId, url ); +#endif  				};  			}  			else if(message_name == "set_user_agent") @@ -1182,6 +1255,22 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  				mUserAgent = message_in.getValue("user_agent");  				LLQtWebKit::getInstance()->setBrowserAgentId( mUserAgent );  			} +			else if(message_name == "ignore_ssl_cert_errors") +			{ +#if LLQTWEBKIT_API_VERSION >= 3 +				LLQtWebKit::getInstance()->setIgnoreSSLCertErrors( message_in.getValueBoolean("ignore") ); +#else +				llwarns << "Ignoring ignore_ssl_cert_errors message (llqtwebkit version is too old)." << llendl; +#endif +			} +			else if(message_name == "add_certificate_file_path") +			{ +#if LLQTWEBKIT_API_VERSION >= 6 +				LLQtWebKit::getInstance()->addCAFile( message_in.getValue("path") ); +#else +				llwarns << "Ignoring add_certificate_file_path message (llqtwebkit version is too old)." << llendl; +#endif +			}  			else if(message_name == "init_history")  			{  				// Initialize browser history diff --git a/indra/media_plugins/winmmshim/CMakeLists.txt b/indra/media_plugins/winmmshim/CMakeLists.txt index 387214088f..bf74f81809 100644 --- a/indra/media_plugins/winmmshim/CMakeLists.txt +++ b/indra/media_plugins/winmmshim/CMakeLists.txt @@ -3,6 +3,12 @@  project(winmm_shim)  ### winmm_shim +# *HACK - override msvcrt implementation (intialized on 00-Common) to be +# statically linked for winmm.dll this relies on vc taking the last flag on +# the command line +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MT") +set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")  set(winmm_shim_SOURCE_FILES      forwarding_api.cpp diff --git a/indra/media_plugins/winmmshim/forwarding_api.cpp b/indra/media_plugins/winmmshim/forwarding_api.cpp index eff7e20451..495e08942b 100644 --- a/indra/media_plugins/winmmshim/forwarding_api.cpp +++ b/indra/media_plugins/winmmshim/forwarding_api.cpp @@ -389,90 +389,105 @@ void init_function_pointers(HMODULE winmm_handle)  extern "C" {  	LRESULT   WINAPI CloseDriver( HDRVR hDriver, LPARAM lParam1, LPARAM lParam2)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"CloseDriver\n");  		return CloseDriver_orig( hDriver, lParam1, lParam2);  	}  	HDRVR     WINAPI OpenDriver( LPCWSTR szDriverName, LPCWSTR szSectionName, LPARAM lParam2)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"OpenDriver\n");  		return OpenDriver_orig( szDriverName, szSectionName, lParam2);  	}  	LRESULT   WINAPI SendDriverMessage( HDRVR hDriver, UINT message, LPARAM lParam1, LPARAM lParam2)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"SendDriverMessage\n");  		return SendDriverMessage_orig( hDriver, message, lParam1, lParam2);  	}  	HMODULE   WINAPI DrvGetModuleHandle( HDRVR hDriver)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"DrvGetModuleHandle\n");  		return DrvGetModuleHandle_orig( hDriver);  	}  	HMODULE   WINAPI GetDriverModuleHandle( HDRVR hDriver)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"GetDriverModuleHandle\n");  		return GetDriverModuleHandle_orig( hDriver);  	}  	LRESULT   WINAPI DefDriverProc( DWORD_PTR dwDriverIdentifier, HDRVR hdrvr, UINT uMsg, LPARAM lParam1, LPARAM lParam2)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"DefDriverProc\n");  		return DefDriverProc_orig( dwDriverIdentifier, hdrvr, uMsg, lParam1, lParam2);  	}  	BOOL WINAPI DriverCallback( DWORD dwCallBack, DWORD dwFlags, HDRVR hdrvr, DWORD msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"DriverCallback\n");  		return DriverCallback_orig(dwCallBack, dwFlags, hdrvr, msg, dwUser, dwParam1, dwParam2);  	}  	UINT WINAPI mmsystemGetVersion(void)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmsystemGetVersion\n");  		return mmsystemGetVersion_orig();  	}  	BOOL WINAPI sndPlaySoundA( LPCSTR pszSound, UINT fuSound)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"sndPlaySoundA\n");  		return sndPlaySoundA_orig( pszSound, fuSound);  	}  	BOOL WINAPI sndPlaySoundW( LPCWSTR pszSound, UINT fuSound)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"sndPlaySoundW\n");  		return sndPlaySoundW_orig( pszSound, fuSound);  	}  	BOOL WINAPI PlaySoundA( LPCSTR pszSound, HMODULE hmod, DWORD fdwSound)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"PlaySoundA\n");  		return PlaySoundA_orig( pszSound, hmod, fdwSound);  	}  	BOOL WINAPI PlaySoundW( LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"PlaySoundW\n");  		return PlaySoundW_orig( pszSound, hmod, fdwSound);  	}  	UINT WINAPI waveOutGetNumDevs(void)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveOutGetNumDevs\n");  		return waveOutGetNumDevs_orig();  	}  	MMRESULT WINAPI waveOutGetDevCapsA( UINT_PTR uDeviceID, LPWAVEOUTCAPSA pwoc, UINT cbwoc)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveOutGetDevCapsA\n");  		return waveOutGetDevCapsA_orig( uDeviceID, pwoc, cbwoc);  	}  	MMRESULT WINAPI waveOutGetDevCapsW( UINT_PTR uDeviceID, LPWAVEOUTCAPSW pwoc, UINT cbwoc)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveOutGetDevCapsW\n");  		return waveOutGetDevCapsW_orig( uDeviceID, pwoc, cbwoc);  	} @@ -480,24 +495,28 @@ extern "C" {  	MMRESULT WINAPI waveOutGetVolume( HWAVEOUT hwo, LPDWORD pdwVolume)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveOutGetVolume\n");  		return waveOutGetVolume_orig( hwo, pdwVolume);  	}  	MMRESULT WINAPI waveOutSetVolume( HWAVEOUT hwo, DWORD dwVolume)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveOutSetVolume\n");  		return waveOutSetVolume_orig( hwo, dwVolume);  	}  	MMRESULT WINAPI waveOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveOutGetErrorTextA\n");  		return waveOutGetErrorTextA_orig( mmrError, pszText, cchText);  	}  	MMRESULT WINAPI waveOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveOutGetErrorTextW\n");  		return waveOutGetErrorTextW_orig( mmrError, pszText, cchText);  	} @@ -516,12 +535,14 @@ extern "C" {  	MMRESULT WINAPI waveOutPrepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveOutPrepareHeader\n");  		return waveOutPrepareHeader_orig( hwo, pwh, cbwh);  	}  	MMRESULT WINAPI waveOutUnprepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveOutUnprepareHeader\n");  		return waveOutUnprepareHeader_orig( hwo, pwh, cbwh);  	} @@ -535,834 +556,973 @@ extern "C" {  	MMRESULT WINAPI waveOutPause( HWAVEOUT hwo)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveOutPause\n");  		return waveOutPause_orig( hwo);  	}  	MMRESULT WINAPI waveOutRestart( HWAVEOUT hwo)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveOutRestart\n");  		return waveOutRestart_orig( hwo);  	}  	MMRESULT WINAPI waveOutReset( HWAVEOUT hwo)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveOutReset\n");  		return waveOutReset_orig( hwo);  	}  	MMRESULT WINAPI waveOutBreakLoop( HWAVEOUT hwo)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveOutBreakLoop\n");  		return waveOutBreakLoop_orig( hwo);  	}  	MMRESULT WINAPI waveOutGetPosition( HWAVEOUT hwo, LPMMTIME pmmt, UINT cbmmt)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveOutGetPosition\n");  		return waveOutGetPosition_orig( hwo, pmmt, cbmmt);  	}  	MMRESULT WINAPI waveOutGetPitch( HWAVEOUT hwo, LPDWORD pdwPitch)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveOutGetPitch\n");  		return waveOutGetPitch_orig( hwo, pdwPitch);  	}  	MMRESULT WINAPI waveOutSetPitch( HWAVEOUT hwo, DWORD dwPitch)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveOutSetPitch\n");  		return waveOutSetPitch_orig( hwo, dwPitch);  	}  	MMRESULT WINAPI waveOutGetPlaybackRate( HWAVEOUT hwo, LPDWORD pdwRate)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveOutGetPlaybackRate\n");  		return waveOutGetPlaybackRate_orig( hwo, pdwRate);  	}  	MMRESULT WINAPI waveOutSetPlaybackRate( HWAVEOUT hwo, DWORD dwRate)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveOutSetPlaybackRate\n");  		return waveOutSetPlaybackRate_orig( hwo, dwRate);  	}  	MMRESULT WINAPI waveOutGetID( HWAVEOUT hwo, LPUINT puDeviceID)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveOutGetID\n");  		return waveOutGetID_orig( hwo, puDeviceID);  	}  	MMRESULT WINAPI waveOutMessage( HWAVEOUT hwo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveOutMessage\n");  		return waveOutMessage_orig( hwo, uMsg, dw1, dw2);  	}  	UINT WINAPI waveInGetNumDevs(void)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveInGetNumDevs\n");  		return waveInGetNumDevs_orig();  	}  	MMRESULT WINAPI waveInGetDevCapsA( UINT_PTR uDeviceID, LPWAVEINCAPSA pwic, UINT cbwic)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveInGetDevCapsA\n");  		return waveInGetDevCapsA_orig( uDeviceID, pwic, cbwic);  	}  	MMRESULT WINAPI waveInGetDevCapsW( UINT_PTR uDeviceID, LPWAVEINCAPSW pwic, UINT cbwic)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveInGetDevCapsW\n");  		return waveInGetDevCapsW_orig( uDeviceID, pwic, cbwic);  	}  	MMRESULT WINAPI waveInGetErrorTextA(MMRESULT mmrError, LPSTR pszText, UINT cchText)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveInGetErrorTextA\n");  		return waveInGetErrorTextA_orig(mmrError, pszText, cchText);  	}  	MMRESULT WINAPI waveInGetErrorTextW(MMRESULT mmrError, LPWSTR pszText, UINT cchText)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveInGetErrorTextW\n");  		return waveInGetErrorTextW_orig(mmrError, pszText, cchText);  	}  	MMRESULT WINAPI waveInOpen( LPHWAVEIN phwi, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveInOpen\n");  		return waveInOpen_orig(phwi, uDeviceID, pwfx, dwCallback, dwInstance, fdwOpen);  	}  	MMRESULT WINAPI waveInClose( HWAVEIN hwi)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveInClose\n");  		return waveInClose_orig( hwi);  	}  	MMRESULT WINAPI waveInPrepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveInPrepareHeader\n");  		return waveInPrepareHeader_orig( hwi, pwh, cbwh);  	}  	MMRESULT WINAPI waveInUnprepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveInUnprepareHeader\n");  		return waveInUnprepareHeader_orig( hwi, pwh, cbwh);  	}  	MMRESULT WINAPI waveInAddBuffer( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveInAddBuffer\n");  		return waveInAddBuffer_orig( hwi, pwh, cbwh);  	}  	MMRESULT WINAPI waveInStart( HWAVEIN hwi)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveInStart\n");  		return waveInStart_orig( hwi);  	}  	MMRESULT WINAPI waveInStop( HWAVEIN hwi)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveInStop\n");  		return waveInStop_orig(hwi);  	}  	MMRESULT WINAPI waveInReset( HWAVEIN hwi)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveInReset\n");  		return waveInReset_orig(hwi);  	}  	MMRESULT WINAPI waveInGetPosition( HWAVEIN hwi, LPMMTIME pmmt, UINT cbmmt)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveInGetPosition\n");  		return waveInGetPosition_orig( hwi, pmmt, cbmmt);  	}  	MMRESULT WINAPI waveInGetID( HWAVEIN hwi, LPUINT puDeviceID)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveInGetID\n");  		return waveInGetID_orig( hwi, puDeviceID);  	}  	MMRESULT WINAPI waveInMessage( HWAVEIN hwi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"waveInMessage\n");  		return waveInMessage_orig( hwi, uMsg, dw1, dw2);  	}  	UINT WINAPI midiOutGetNumDevs(void)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiOutGetNumDevs\n");  		return midiOutGetNumDevs_orig();  	}  	MMRESULT WINAPI midiStreamOpen( LPHMIDISTRM phms, LPUINT puDeviceID, DWORD cMidi, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiStreamOpen\n");  		return midiStreamOpen_orig( phms, puDeviceID, cMidi, dwCallback, dwInstance, fdwOpen);  	}  	MMRESULT WINAPI midiStreamClose( HMIDISTRM hms)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiStreamClose\n");  		return midiStreamClose_orig( hms);  	}  	MMRESULT WINAPI midiStreamProperty( HMIDISTRM hms, LPBYTE lppropdata, DWORD dwProperty)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiStreamProperty\n");  		return midiStreamProperty_orig( hms, lppropdata, dwProperty);  	}  	MMRESULT WINAPI midiStreamPosition( HMIDISTRM hms, LPMMTIME lpmmt, UINT cbmmt)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiStreamPosition\n");  		return midiStreamPosition_orig( hms, lpmmt, cbmmt);  	}  	MMRESULT WINAPI midiStreamOut( HMIDISTRM hms, LPMIDIHDR pmh, UINT cbmh)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiStreamOut\n");  		return midiStreamOut_orig( hms, pmh, cbmh);  	}  	MMRESULT WINAPI midiStreamPause( HMIDISTRM hms)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiStreamPause\n");  		return midiStreamPause_orig( hms);  	}  	MMRESULT WINAPI midiStreamRestart( HMIDISTRM hms)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiStreamRestart\n");  		return midiStreamRestart_orig( hms);  	}  	MMRESULT WINAPI midiStreamStop( HMIDISTRM hms)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiStreamStop\n");  		return midiStreamStop_orig( hms);  	}  	MMRESULT WINAPI midiConnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiConnect\n");  		return midiConnect_orig( hmi, hmo, pReserved);  	}  	MMRESULT WINAPI midiDisconnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiDisconnect\n");  		return midiDisconnect_orig( hmi, hmo, pReserved);  	}  	MMRESULT WINAPI midiOutGetDevCapsA( UINT_PTR uDeviceID, LPMIDIOUTCAPSA pmoc, UINT cbmoc)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiOutGetDevCapsA\n");  		return midiOutGetDevCapsA_orig( uDeviceID, pmoc, cbmoc);  	}  	MMRESULT WINAPI midiOutGetDevCapsW( UINT_PTR uDeviceID, LPMIDIOUTCAPSW pmoc, UINT cbmoc)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiOutGetDevCapsW\n");  		return midiOutGetDevCapsW_orig( uDeviceID, pmoc, cbmoc);  	}  	MMRESULT WINAPI midiOutGetVolume( HMIDIOUT hmo, LPDWORD pdwVolume)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiOutGetVolume\n");  		return midiOutGetVolume_orig( hmo, pdwVolume);  	}  	MMRESULT WINAPI midiOutSetVolume( HMIDIOUT hmo, DWORD dwVolume)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiOutSetVolume\n");  		return midiOutSetVolume_orig( hmo, dwVolume);  	}  	MMRESULT WINAPI midiOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiOutGetErrorTextA\n");  		return midiOutGetErrorTextA_orig( mmrError, pszText, cchText);  	}  	MMRESULT WINAPI midiOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiOutGetErrorTextW\n");  		return midiOutGetErrorTextW_orig( mmrError, pszText, cchText);  	}  	MMRESULT WINAPI midiOutOpen( LPHMIDIOUT phmo, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiOutOpen\n");  		return midiOutOpen_orig(phmo, uDeviceID, dwCallback, dwInstance, fdwOpen);  	}  	MMRESULT WINAPI midiOutClose( HMIDIOUT hmo)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiOutClose\n");  		return midiOutClose_orig( hmo);  	}  	MMRESULT WINAPI midiOutPrepareHeader( HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiOutPrepareHeader\n");  		return midiOutPrepareHeader_orig( hmo, pmh, cbmh);  	}  	MMRESULT WINAPI midiOutUnprepareHeader(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiOutUnprepareHeader\n");  		return midiOutUnprepareHeader_orig(hmo, pmh, cbmh);  	}  	MMRESULT WINAPI midiOutShortMsg( HMIDIOUT hmo, DWORD dwMsg)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiOutShortMsg\n");  		return midiOutShortMsg_orig( hmo, dwMsg);  	}  	MMRESULT WINAPI midiOutLongMsg(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiOutLongMsg\n");  		return midiOutLongMsg_orig(hmo, pmh, cbmh);  	}  	MMRESULT WINAPI midiOutReset( HMIDIOUT hmo)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiOutReset\n");  		return midiOutReset_orig( hmo);  	}  	MMRESULT WINAPI midiOutCachePatches( HMIDIOUT hmo, UINT uBank, LPWORD pwpa, UINT fuCache)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiOutCachePatches\n");  		return midiOutCachePatches_orig( hmo, uBank, pwpa, fuCache);  	}  	MMRESULT WINAPI midiOutCacheDrumPatches( HMIDIOUT hmo, UINT uPatch, LPWORD pwkya, UINT fuCache)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiOutCacheDrumPatches\n");  		return midiOutCacheDrumPatches_orig( hmo, uPatch, pwkya, fuCache);  	}  	MMRESULT WINAPI midiOutGetID( HMIDIOUT hmo, LPUINT puDeviceID)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiOutGetID\n");  		return midiOutGetID_orig( hmo, puDeviceID);  	}  	MMRESULT WINAPI midiOutMessage( HMIDIOUT hmo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiOutMessage\n");  		return midiOutMessage_orig( hmo, uMsg, dw1, dw2);  	}  	UINT WINAPI midiInGetNumDevs(void)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiInGetNumDevs\n");  		return midiInGetNumDevs_orig();  	}  	MMRESULT WINAPI midiInGetDevCapsA( UINT_PTR uDeviceID, LPMIDIINCAPSA pmic, UINT cbmic)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiInGetDevCapsA\n");  		return midiInGetDevCapsA_orig( uDeviceID, pmic, cbmic);  	}  	MMRESULT WINAPI midiInGetDevCapsW( UINT_PTR uDeviceID, LPMIDIINCAPSW pmic, UINT cbmic)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiInGetDevCapsW\n");  		return midiInGetDevCapsW_orig( uDeviceID, pmic, cbmic);  	}  	MMRESULT WINAPI midiInGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiInGetErrorTextA\n");  		return midiInGetErrorTextA_orig( mmrError, pszText, cchText);  	}  	MMRESULT WINAPI midiInGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiInGetErrorTextW\n");  		return midiInGetErrorTextW_orig( mmrError, pszText, cchText);  	}  	MMRESULT WINAPI midiInOpen( LPHMIDIIN phmi, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiInOpen\n");  		return midiInOpen_orig(phmi, uDeviceID, dwCallback, dwInstance, fdwOpen);  	}  	MMRESULT WINAPI midiInClose( HMIDIIN hmi)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiInClose\n");  		return midiInClose_orig( hmi);  	}  	MMRESULT WINAPI midiInPrepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiInPrepareHeader\n");  		return midiInPrepareHeader_orig( hmi, pmh, cbmh);  	}  	MMRESULT WINAPI midiInUnprepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiInUnprepareHeader\n");  		return midiInUnprepareHeader_orig( hmi, pmh, cbmh);  	}  	MMRESULT WINAPI midiInAddBuffer( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiInAddBuffer\n");  		return midiInAddBuffer_orig( hmi, pmh, cbmh);  	}  	MMRESULT WINAPI midiInStart( HMIDIIN hmi)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiInStart\n");  		return midiInStart_orig( hmi);  	}  	MMRESULT WINAPI midiInStop( HMIDIIN hmi)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiInStop\n");  		return midiInStop_orig(hmi);  	}  	MMRESULT WINAPI midiInReset( HMIDIIN hmi)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiInReset\n");  		return midiInReset_orig( hmi);  	}  	MMRESULT WINAPI midiInGetID( HMIDIIN hmi, LPUINT puDeviceID)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiInGetID\n");  		return midiInGetID_orig( hmi, puDeviceID);  	}  	MMRESULT WINAPI midiInMessage( HMIDIIN hmi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"midiInMessage\n");  		return midiInMessage_orig( hmi, uMsg, dw1, dw2);  	}  	UINT WINAPI auxGetNumDevs(void)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"auxGetNumDevs\n");  		return auxGetNumDevs_orig();  	}  	MMRESULT WINAPI auxGetDevCapsA( UINT_PTR uDeviceID, LPAUXCAPSA pac, UINT cbac)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"auxGetDevCapsA\n");  		return auxGetDevCapsA_orig( uDeviceID, pac, cbac);  	}  	MMRESULT WINAPI auxGetDevCapsW( UINT_PTR uDeviceID, LPAUXCAPSW pac, UINT cbac)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"auxGetDevCapsW\n");  		return auxGetDevCapsW_orig( uDeviceID, pac, cbac);  	}  	MMRESULT WINAPI auxSetVolume( UINT uDeviceID, DWORD dwVolume)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"auxSetVolume\n");  		return auxSetVolume_orig( uDeviceID, dwVolume);  	}  	MMRESULT WINAPI auxGetVolume( UINT uDeviceID, LPDWORD pdwVolume)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"auxGetVolume\n");  		return auxGetVolume_orig( uDeviceID, pdwVolume);  	}  	MMRESULT WINAPI auxOutMessage( UINT uDeviceID, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"auxOutMessage\n");  		return auxOutMessage_orig( uDeviceID, uMsg, dw1, dw2);  	}  	UINT WINAPI mixerGetNumDevs(void)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mixerGetNumDevs\n");  		return mixerGetNumDevs_orig();  	}  	MMRESULT WINAPI mixerGetDevCapsA( UINT_PTR uMxId, LPMIXERCAPSA pmxcaps, UINT cbmxcaps)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mixerGetDevCapsA\n");  		return mixerGetDevCapsA_orig( uMxId, pmxcaps, cbmxcaps);  	}  	MMRESULT WINAPI mixerGetDevCapsW( UINT_PTR uMxId, LPMIXERCAPSW pmxcaps, UINT cbmxcaps)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mixerGetDevCapsW\n");  		return mixerGetDevCapsW_orig( uMxId, pmxcaps, cbmxcaps);  	}  	MMRESULT WINAPI mixerOpen( LPHMIXER phmx, UINT uMxId, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mixerOpen\n");  		return mixerOpen_orig( phmx, uMxId, dwCallback, dwInstance, fdwOpen);  	}  	MMRESULT WINAPI mixerClose( HMIXER hmx)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mixerClose\n");  		return mixerClose_orig( hmx);  	}  	DWORD WINAPI mixerMessage( HMIXER hmx, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mixerMessage\n");  		return mixerMessage_orig( hmx, uMsg, dwParam1, dwParam2);  	}  	MMRESULT WINAPI mixerGetLineInfoA( HMIXEROBJ hmxobj, LPMIXERLINEA pmxl, DWORD fdwInfo)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mixerGetLineInfoA\n");  		return mixerGetLineInfoA_orig( hmxobj, pmxl, fdwInfo);  	}  	MMRESULT WINAPI mixerGetLineInfoW( HMIXEROBJ hmxobj, LPMIXERLINEW pmxl, DWORD fdwInfo)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mixerGetLineInfoW\n");  		return mixerGetLineInfoW_orig( hmxobj, pmxl, fdwInfo);  	}  	MMRESULT WINAPI mixerGetID( HMIXEROBJ hmxobj, UINT FAR *puMxId, DWORD fdwId)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mixerGetID\n");  		return mixerGetID_orig( hmxobj, puMxId, fdwId);  	}  	MMRESULT WINAPI mixerGetLineControlsA( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSA pmxlc, DWORD fdwControls)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mixerGetLineControlsA\n");  		return mixerGetLineControlsA_orig( hmxobj, pmxlc, fdwControls);  	}  	MMRESULT WINAPI mixerGetLineControlsW( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSW pmxlc, DWORD fdwControls)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mixerGetLineControlsW\n");  		return mixerGetLineControlsW_orig( hmxobj, pmxlc, fdwControls);  	}  	MMRESULT WINAPI mixerGetControlDetailsA( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mixerGetControlDetailsA\n");  		return mixerGetControlDetailsA_orig( hmxobj, pmxcd, fdwDetails);  	}  	MMRESULT WINAPI mixerGetControlDetailsW( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mixerGetControlDetailsW\n");  		return mixerGetControlDetailsW_orig( hmxobj, pmxcd, fdwDetails);  	}  	MMRESULT WINAPI mixerSetControlDetails( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mixerSetControlDetails\n");  		return mixerSetControlDetails_orig( hmxobj, pmxcd, fdwDetails);  	}  	DWORD    WINAPI mmGetCurrentTask(void)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmGetCurrentTask\n");  		return mmGetCurrentTask_orig();  	}  	void WINAPI mmTaskBlock(DWORD val)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmTaskBlock\n");  		return mmTaskBlock_orig(val);  	}  	UINT WINAPI mmTaskCreate(LPTASKCALLBACK a, HANDLE* b, DWORD_PTR c)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmTaskCreate\n");  		return mmTaskCreate_orig(a, b, c);  	}  	BOOL WINAPI mmTaskSignal(DWORD a)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmTaskSignal\n");  		return mmTaskSignal_orig(a);  	}  	VOID WINAPI mmTaskYield()  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmTaskYield\n");  		mmTaskYield_orig();  	}  	MMRESULT WINAPI timeGetSystemTime( LPMMTIME pmmt, UINT cbmmt)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"timeGetSystemTime\n");  		return timeGetSystemTime_orig( pmmt, cbmmt);  	}  	DWORD WINAPI timeGetTime(void)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"timeGetTime\n");  		return timeGetTime_orig();  	}  	MMRESULT WINAPI timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD_PTR dwUser, UINT fuEvent)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"timeSetEvent\n");  		return timeSetEvent_orig(uDelay, uResolution, fptc, dwUser, fuEvent);  	}  	MMRESULT WINAPI timeKillEvent( UINT uTimerID)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"timeKillEvent\n");  		return timeKillEvent_orig( uTimerID);  	}  	MMRESULT WINAPI timeGetDevCaps( LPTIMECAPS ptc, UINT cbtc)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"timeGetDevCaps\n");  		return timeGetDevCaps_orig( ptc, cbtc);  	}  	MMRESULT WINAPI timeBeginPeriod( UINT uPeriod)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"timeBeginPeriod\n");  		return timeBeginPeriod_orig( uPeriod);  	}  	MMRESULT WINAPI timeEndPeriod( UINT uPeriod)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"timeEndPeriod\n");  		return timeEndPeriod_orig( uPeriod);  	}  	UINT WINAPI joyGetNumDevs(void)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"joyGetNumDevs\n");  		return joyGetNumDevs_orig();  	}  	MMRESULT WINAPI joyConfigChanged(DWORD dwFlags)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"joyConfigChanged\n");  		return joyConfigChanged_orig(dwFlags);  	}  	MMRESULT WINAPI joyGetDevCapsA( UINT_PTR uJoyID, LPJOYCAPSA pjc, UINT cbjc)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"joyGetDevCapsA\n");  		return joyGetDevCapsA_orig( uJoyID, pjc, cbjc);  	}  	MMRESULT WINAPI joyGetDevCapsW( UINT_PTR uJoyID, LPJOYCAPSW pjc, UINT cbjc)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"joyGetDevCapsW\n");  		return joyGetDevCapsW_orig( uJoyID, pjc, cbjc);  	}  	MMRESULT WINAPI joyGetPos( UINT uJoyID, LPJOYINFO pji)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"joyGetPos\n");  		return joyGetPos_orig( uJoyID, pji);  	}  	MMRESULT WINAPI joyGetPosEx( UINT uJoyID, LPJOYINFOEX pji)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"joyGetPosEx\n");  		return joyGetPosEx_orig( uJoyID, pji);  	}  	MMRESULT WINAPI joyGetThreshold( UINT uJoyID, LPUINT puThreshold)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"joyGetThreshold\n");  		return joyGetThreshold_orig( uJoyID, puThreshold);  	}  	MMRESULT WINAPI joyReleaseCapture( UINT uJoyID)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"joyReleaseCapture\n");  		return joyReleaseCapture_orig( uJoyID);  	}  	MMRESULT WINAPI joySetCapture( HWND hwnd, UINT uJoyID, UINT uPeriod, BOOL fChanged)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"joySetCapture\n");  		return joySetCapture_orig(hwnd, uJoyID, uPeriod, fChanged);  	}  	MMRESULT WINAPI joySetThreshold( UINT uJoyID, UINT uThreshold)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"joySetThreshold\n");  		return joySetThreshold_orig( uJoyID, uThreshold);  	}  	BOOL WINAPI  mciDriverNotify(HWND hwndCallback, UINT uDeviceID, UINT uStatus)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mciDriverNotify\n");  		return mciDriverNotify_orig(hwndCallback, uDeviceID, uStatus);  	}  	UINT WINAPI  mciDriverYield(UINT uDeviceID)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mciDriverYield\n");  		return mciDriverYield_orig(uDeviceID);  	}	  	FOURCC WINAPI mmioStringToFOURCCA( LPCSTR sz, UINT uFlags)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmioStringToFOURCCA\n");  		return mmioStringToFOURCCA_orig( sz, uFlags);  	}  	FOURCC WINAPI mmioStringToFOURCCW( LPCWSTR sz, UINT uFlags)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmioStringToFOURCCW\n");  		return mmioStringToFOURCCW_orig( sz, uFlags);  	}  	LPMMIOPROC WINAPI mmioInstallIOProcA( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmioInstallIOProcA\n");  		return mmioInstallIOProcA_orig( fccIOProc, pIOProc, dwFlags);  	}  	LPMMIOPROC WINAPI mmioInstallIOProcW( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmioInstallIOProcW\n");  		return mmioInstallIOProcW_orig( fccIOProc, pIOProc, dwFlags);  	}  	HMMIO WINAPI mmioOpenA( LPSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmioOpenA\n");  		return mmioOpenA_orig( pszFileName, pmmioinfo, fdwOpen);  	}  	HMMIO WINAPI mmioOpenW( LPWSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmioOpenW\n");  		return mmioOpenW_orig( pszFileName, pmmioinfo, fdwOpen);  	}  	MMRESULT WINAPI mmioRenameA( LPCSTR pszFileName, LPCSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmioRenameA\n");  		return mmioRenameA_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename);  	}  	MMRESULT WINAPI mmioRenameW( LPCWSTR pszFileName, LPCWSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmioRenameW\n");  		return mmioRenameW_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename);  	}  	MMRESULT WINAPI mmioClose( HMMIO hmmio, UINT fuClose)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmioClose\n");  		return mmioClose_orig( hmmio, fuClose);  	}  	LONG WINAPI mmioRead( HMMIO hmmio, HPSTR pch, LONG cch)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmioRead\n");  		return mmioRead_orig( hmmio, pch, cch);  	}  	LONG WINAPI mmioWrite( HMMIO hmmio, const char _huge* pch, LONG cch)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmioWrite\n");  		return mmioWrite_orig( hmmio, pch, cch);  	}  	LONG WINAPI mmioSeek( HMMIO hmmio, LONG lOffset, int iOrigin)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmioSeek\n");  		return mmioSeek_orig(hmmio, lOffset, iOrigin);  	}  	MMRESULT WINAPI mmioGetInfo( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuInfo)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmioGetInfo\n");  		return mmioGetInfo_orig( hmmio, pmmioinfo, fuInfo);  	}  	MMRESULT WINAPI mmioSetInfo( HMMIO hmmio, LPCMMIOINFO pmmioinfo, UINT fuInfo)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmioSetInfo\n");  		return mmioSetInfo_orig( hmmio, pmmioinfo, fuInfo);  	}  	MMRESULT WINAPI mmioSetBuffer( HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer, UINT fuBuffer)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmioSetBuffer\n");  		return mmioSetBuffer_orig(hmmio, pchBuffer, cchBuffer, fuBuffer);  	}  	MMRESULT WINAPI mmioFlush( HMMIO hmmio, UINT fuFlush)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmioFlush\n");  		return mmioFlush_orig( hmmio, fuFlush);  	}  	MMRESULT WINAPI mmioAdvance( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuAdvance)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmioAdvance\n");  		return mmioAdvance_orig( hmmio, pmmioinfo, fuAdvance);  	}  	LRESULT WINAPI mmioSendMessage( HMMIO hmmio, UINT uMsg, LPARAM lParam1, LPARAM lParam2)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmioSendMessage\n");  		return mmioSendMessage_orig(hmmio, uMsg, lParam1, lParam2);  	}  	MMRESULT WINAPI mmioDescend( HMMIO hmmio, LPMMCKINFO pmmcki, const MMCKINFO FAR* pmmckiParent, UINT fuDescend)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmioDescend\n");  		return mmioDescend_orig(hmmio, pmmcki, pmmckiParent, fuDescend);  	}  	MMRESULT WINAPI mmioAscend( HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuAscend)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmioAscend\n");  		return mmioAscend_orig( hmmio, pmmcki, fuAscend);  	}  	MMRESULT WINAPI mmioCreateChunk(HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuCreate)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mmioCreateChunk\n");  		return mmioCreateChunk_orig(hmmio, pmmcki, fuCreate);  	}  	MCIERROR WINAPI mciSendCommandA( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mciSendCommandA\n");  		return mciSendCommandA_orig( mciId, uMsg, dwParam1, dwParam2);  	}  	MCIERROR WINAPI mciSendCommandW( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mciSendCommandW\n");  		return mciSendCommandW_orig( mciId, uMsg, dwParam1, dwParam2);  	}  	MCIERROR  WINAPI mciSendStringA( LPCSTR lpstrCommand, LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mciSendStringA\n");  		return mciSendStringA_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback);  	}  	MCIERROR  WINAPI mciSendStringW( LPCWSTR lpstrCommand, LPWSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mciSendStringW\n");  		return mciSendStringW_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback);  	} @@ -1375,72 +1535,84 @@ extern "C" {  	MCIDEVICEID WINAPI mciGetDeviceIDW( LPCWSTR pszDevice)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mciGetDeviceIDW\n");  		return mciGetDeviceIDW_orig( pszDevice);  	}  	MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDA( DWORD dwElementID, LPCSTR lpstrType )  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mciGetDeviceIDFromElementIDA\n");  		return mciGetDeviceIDFromElementIDA_orig( dwElementID, lpstrType );  	}  	MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDW( DWORD dwElementID, LPCWSTR lpstrType )  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mciGetDeviceIDFromElementIDW\n");  		return mciGetDeviceIDFromElementIDW_orig( dwElementID, lpstrType );  	}  	DWORD_PTR WINAPI  mciGetDriverData(UINT uDeviceID)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mciGetDriverData\n");  		return mciGetDriverData_orig(uDeviceID);  	}  	BOOL WINAPI mciGetErrorStringA( MCIERROR mcierr, LPSTR pszText, UINT cchText)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mciGetErrorStringA\n");  		return mciGetErrorStringA_orig( mcierr, pszText, cchText);  	}  	BOOL WINAPI mciGetErrorStringW( MCIERROR mcierr, LPWSTR pszText, UINT cchText)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mciGetErrorStringW\n");  		return mciGetErrorStringW_orig( mcierr, pszText, cchText);  	}  	BOOL WINAPI  mciSetDriverData(UINT uDeviceID, DWORD_PTR dwData)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mciSetDriverData_type\n");  		return mciSetDriverData_orig( uDeviceID, dwData );  	}  	BOOL WINAPI mciSetYieldProc( MCIDEVICEID mciId, YIELDPROC fpYieldProc, DWORD dwYieldData)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mciSetYieldProc\n");  		return mciSetYieldProc_orig(mciId, fpYieldProc, dwYieldData);  	}  	BOOL WINAPI  mciFreeCommandResource(UINT uTable)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mciFreeCommandResource\n");  		return mciFreeCommandResource_orig(uTable);  	}  	HTASK WINAPI mciGetCreatorTask( MCIDEVICEID mciId)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mciGetCreatorTask\n");  		return mciGetCreatorTask_orig( mciId);  	}  	YIELDPROC WINAPI mciGetYieldProc( MCIDEVICEID mciId, LPDWORD pdwYieldData)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mciGetYieldProc\n");  		return mciGetYieldProc_orig( mciId, pdwYieldData);  	}  	UINT WINAPI mciLoadCommandResource(HINSTANCE hInstance, LPCWSTR lpResName, UINT uType)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mciLoadCommandResource");  		return mciLoadCommandResource_orig(hInstance, lpResName, uType);  	} @@ -1448,6 +1620,7 @@ extern "C" {  	BOOL WINAPI mciExecute(LPCSTR pszCommand)  	{ +		ll_winmm_shim_initialize();  		//OutputDebugString(L"mciExecute\n");  		return mciExecute_orig(pszCommand);  	} diff --git a/indra/media_plugins/winmmshim/forwarding_api.h b/indra/media_plugins/winmmshim/forwarding_api.h index 89a6b347f3..076a08f769 100644 --- a/indra/media_plugins/winmmshim/forwarding_api.h +++ b/indra/media_plugins/winmmshim/forwarding_api.h @@ -30,6 +30,7 @@  #include <mmsystem.h>  void init_function_pointers(HMODULE winmm_handle); +void ll_winmm_shim_initialize();  typedef VOID (*LPTASKCALLBACK)(DWORD_PTR dwInst); diff --git a/indra/media_plugins/winmmshim/winmm_shim.cpp b/indra/media_plugins/winmmshim/winmm_shim.cpp index 9563a3b664..47a1e5c018 100644 --- a/indra/media_plugins/winmmshim/winmm_shim.cpp +++ b/indra/media_plugins/winmmshim/winmm_shim.cpp @@ -32,14 +32,21 @@ using std::wstring;  static float sVolumeLevel = 1.f;  static bool sMute = false; +static CRITICAL_SECTION sCriticalSection;  BOOL APIENTRY DllMain( HMODULE hModule,                         DWORD  ul_reason_for_call,                         LPVOID lpReserved  					 )  { +	InitializeCriticalSection(&sCriticalSection); +	return TRUE; +} + +void ll_winmm_shim_initialize(){  	static bool initialized = false;  	// do this only once +	EnterCriticalSection(&sCriticalSection);  	if (!initialized)  	{	// bind to original winmm.dll  		TCHAR system_path[MAX_PATH]; @@ -54,13 +61,15 @@ BOOL APIENTRY DllMain( HMODULE hModule,  		{	// we have a dll, let's get out pointers!  			initialized = true;  			init_function_pointers(winmm_handle); -			return true; +			::OutputDebugStringA("WINMM_SHIM.DLL: real winmm.dll initialized successfully\n"); +		} +		else +		{ +			// failed to initialize real winmm.dll +			::OutputDebugStringA("WINMM_SHIM.DLL: Failed to initialize real winmm.dll\n");  		} - -		// failed to initialize real winmm.dll -		return false;  	} -	return true; +	LeaveCriticalSection(&sCriticalSection);  } @@ -79,6 +88,7 @@ extern "C"  	MMRESULT WINAPI waveOutOpen( LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)  	{ +		ll_winmm_shim_initialize();  		if (pwfx->wFormatTag != WAVE_FORMAT_PCM  			|| (pwfx->wBitsPerSample != 8 && pwfx->wBitsPerSample != 16))  		{ // uncompressed 8 and 16 bit sound are the only types we support @@ -97,6 +107,7 @@ extern "C"  	MMRESULT WINAPI waveOutClose( HWAVEOUT hwo)  	{ +		ll_winmm_shim_initialize();  		wave_out_map_t::iterator found_it = sWaveOuts.find(hwo);  		if (found_it != sWaveOuts.end())  		{	// forget what we know about this handle @@ -108,6 +119,7 @@ extern "C"  	MMRESULT WINAPI waveOutWrite( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)  	{ +		ll_winmm_shim_initialize();  		MMRESULT result = MMSYSERR_NOERROR;  		if (sMute) | 
