Bit sonore énervant!!!

theidiot

Membre confirmé
1 Septembre 2004
41
0
44
Bonjours,

J'ai un bug avec cocoa combiner avec opengl. Lorsque j'appuis sur une touche on m'emvoit un bit sonore. Comment faire disparaître ce bit dérengeant.

voici le code

Bloc de code:
#import <Cocoa/Cocoa.h>
#include <OpenGL/OpenGL.h>
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>

#include "BigWindowEvent.h"

/*================================================

	Structure memorisant tous les elements de la plateform de mac:
	fenetre, evenement, etc...

/*================================================*/

struct BigContext
{
	NSAutoreleasePool *Pool;
	NSApplication* App;
	NSWindow* Window;
	NSEvent* Event;
	NSOpenGLView *GLview;
	NSOpenGLContext* WindowCtx;
	NSOpenGLContext* FullscreenCtx;
	NSModalSession Session;
	NSPoint mouseLoc;
	
	BIGenum eventType;
	BIGboolean isActive;
	BIGboolean isWindowDestroyed;
	BIGboolean isFullscreen;
	
	BIGstring windowTitle;
	BIGsizei width;
	BIGsizei height;
	BIGushort bpp;
	
	BIGboolean isKeyActive[255];
	
}BigContext;


/*================================================

	Fonction permettant d'inicialiser les elements central de 
	la plateforme.

/*================================================*/

void bigInit(BIGvoid)
{

	 /* On a besoin de la classe de l'application */
	 BigContext.App = [NSApplication sharedApplication];
	 /* On a besoin d'inicialiser le pool des evenement */
	 //BigContext.Pool = [[NSAutoreleasePool alloc] init];
	
}

/*================================================

	Fonction permettant de cree une fenetre ou sera dessine les elements graphique.
	@param title
		titre de la fenetre
	@param width
		largeur de la fenetre
	@param height
		hauteur de la fenetre
	@param bpp
		resolution couleur de la fenetre
	@param fullscreen
		indication d'une fenetre plein ecran ou non.

/*================================================*/

void bigCreateWindow( const char* title, BIGsizei width, BIGsizei height, BIGushort bpp, BIGboolean fullscreen )
{
	/* creation de la fenetre*/
	 BigContext.Window =  [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, width, height)            
	                                   styleMask:NSClosableWindowMask | NSTitledWindowMask           
									   backing:NSBackingStoreBuffered defer:NO];   // Create an FSInterpreterView
									   
	
									   
	if(fullscreen)
	{
		CGLContextObj cglContext;
		long oldSwapInterval;
		long newSwapInterval;
		/* l'attribution des pixels */
		
		NSOpenGLPixelFormatAttribute attribs[] =
		{
			NSOpenGLPFANoRecovery,
			NSOpenGLPFAAccelerated,
			NSOpenGLPFADoubleBuffer,
			NSOpenGLPFAColorSize, (NSOpenGLPixelFormatAttribute) bpp,
			NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute) 24,
			NSOpenGLPFAStencilSize, (NSOpenGLPixelFormatAttribute) 0,
			NSOpenGLPFAAccumSize, (NSOpenGLPixelFormatAttribute) 0,
			NSOpenGLPFAFullScreen,
			NSOpenGLPFAScreenMask, (NSOpenGLPixelFormatAttribute) CGDisplayIDToOpenGLDisplayMask(0),
			(NSOpenGLPixelFormatAttribute) 0
		};

		NSOpenGLPixelFormat* PixelFormat = [[[NSOpenGLPixelFormat alloc] initWithAttributes: attribs] autorelease];

		/* Creation du context openGL */
		BigContext.FullscreenCtx = [[NSOpenGLContext alloc] initWithFormat: PixelFormat shareContext: nil];
		
		if (BigContext.FullscreenCtx == nil) {
			NSLog(@"Failed to create fullScreenContext");
			exit(1);
        }
		
		CGCaptureAllDisplays();
		
		/* Optimisation de la surface */
		CGDisplaySwitchToMode( kCGDirectMainDisplay,
								CGDisplayBestModeForParameters( kCGDirectMainDisplay, bpp, width, height, 0 ) ) ;
		
		/* Application du context openGL en mode plein ecran */
		[BigContext.FullscreenCtx setFullScreen];
		[BigContext.FullscreenCtx makeCurrentContext];
		
		cglContext = CGLGetCurrentContext();
		CGLGetParameter(cglContext, kCGLCPSwapInterval, &oldSwapInterval);
		newSwapInterval = 1;
		CGLSetParameter(cglContext, kCGLCPSwapInterval, &newSwapInterval);
		
		/* application sur une surface */
		BigContext.GLview = [[NSOpenGLView alloc] initWithFrame:NSMakeRect(0, 0, width, height)];
		
	}else
	{	
		[ BigContext.Window setAcceptsMouseMovedEvents: YES];
		/* l'attribution des pixels */
		NSOpenGLPixelFormatAttribute attribs[] =
		{
			NSOpenGLPFANoRecovery,
			NSOpenGLPFAAccelerated,
			NSOpenGLPFADoubleBuffer,
			NSOpenGLPFAColorSize, (NSOpenGLPixelFormatAttribute) bpp,
			NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute) 24,
			NSOpenGLPFAStencilSize, (NSOpenGLPixelFormatAttribute) 0,
			NSOpenGLPFAAccumSize, (NSOpenGLPixelFormatAttribute) 0,
			NSOpenGLPFAWindow,
			(NSOpenGLPixelFormatAttribute) 0,
		};
  
		NSOpenGLPixelFormat* PixelFormat = [[[NSOpenGLPixelFormat alloc] initWithAttributes: attribs]autorelease];
	
		BigContext.WindowCtx = [[NSOpenGLContext alloc] initWithFormat: PixelFormat shareContext:nil];
									   
		BigContext.GLview = [[NSOpenGLView alloc] initWithFrame:NSMakeRect(0, 0, width, height)];

		/* on attribut la projection a la fenetre */							   
		[BigContext.Window setContentView:BigContext.GLview];
		[BigContext.WindowCtx setView:BigContext.GLview];
		[BigContext.GLview setOpenGLContext:BigContext.WindowCtx];
	}
	
	/* on ne veut pas detruire la fenetre lorsqu'on quite
		Cela cree un bug a cause de la classe Pool. */
	[BigContext.Window setReleasedWhenClosed: NO];
	
	NSString * String = [[[NSString alloc] initWithFormat:
	                           @"%s", title] autorelease];
	[BigContext.Window setTitle: String];
	
	/* memorisation des parametres de la fenetre*/
	BigContext.isActive = BIG_TRUE;
	BigContext.isWindowDestroyed = BIG_FALSE;
	BigContext.windowTitle = (BIGstring)title;
	BigContext.width = width;
	BigContext.height= height;
	BigContext.isFullscreen = fullscreen;
	
	/* On active la session de boucle */
	BigContext.Session = [BigContext.App beginModalSessionForWindow:BigContext.Window];

		
}

/*================================================

	Fonction qui permet de detruire la fenetre

/*================================================*/

void bigDestroyWindow( BIGvoid )
{
	if(!BigContext.isWindowDestroyed)
	{
		BigContext.isActive = BIG_FALSE;
		BigContext.isWindowDestroyed = BIG_TRUE;

		//[BigContext.Window release];
	}
}

/*
=====================================================

	Fonction permettant d'optenir le titre de la fenetre
	@return
		titre de la fenetre

====================================================
*/

BIGstring bigGetWindowTitle(BIGvoid)
{
	return BigContext.windowTitle;
}

/*================================================

	Fonction permettant d'optenir l'information consernant
	la fenetre
	@param mode
		choix de l'information à obtenir
	@return
		l'information choisie

/*================================================*/

BIGsizei bigGetIntegerWindow(BIGenum mode)
{
	switch( mode )
	{
		case BIG_GET_WIDTH: return BigContext.width;
		
		case BIG_GET_HEIGHT: return BigContext.height;
		
		case BIG_GET_BPP: return BigContext.bpp;
		
		case BIG_GET_FULLSCREEN: return BigContext.isFullscreen;
		
		default: return -1;
	}
}

void bigBeginFrame( BIGvoid)
{

	if ([BigContext.App runModalSession:BigContext.Session] != NSRunContinuesResponse)
	{
		[BigContext.App endModalSession:BigContext.Session];
		BigContext.isActive = BIG_FALSE;
	}
	
	if(![BigContext.Window isVisible] && !BigContext.isFullscreen ) [BigContext.App abortModal];
	
	BigContext.Event = [ BigContext.Window  currentEvent];
	
	switch([BigContext.Event type])
	{
		case NSLeftMouseDown:  BigContext.eventType = BIG_LEFT_MOUSE_DOWN;
							   printf("mouseDown\n");
							   break;
		case NSLeftMouseUp:	   BigContext.eventType = BIG_LEFT_MOUSE_UP;
		                       printf("mouseUp\n");
							   break;
		case NSRightMouseDown: BigContext.eventType = BIG_RIGHT_MOUSE_DOWN;
							   break;
		case NSRightMouseUp:   BigContext.eventType = BIG_RIGHT_MOUSE_UP;
							   break;
		case NSMouseMoved:	   BigContext.eventType = BIG_MOUSE_MOUVED;
							   if(!BigContext.isFullscreen)
								{
										BigContext.mouseLoc = [BigContext.GLview convertPoint:[BigContext.Event locationInWindow] 
										fromView:BigContext.GLview];
								}else
								{
										BigContext.mouseLoc = [NSEvent mouseLocation];
										CGRect screenBounds = CGDisplayBounds(kCGDirectMainDisplay);
										BigContext.mouseLoc.y += screenBounds.size.height;
										BigContext.mouseLoc.y -= ([[NSScreen mainScreen] frame].size.height + 1);
								}
							   break;
		case NSKeyDown:		   BigContext.eventType = BIG_KEY_DOWN;
							   printf("KeyDown\n");
							   break;
		case NSKeyUp:		   BigContext.eventType = BIG_KEY_UP;
							   //BigContext.isKeyActive[[BigContext.Event keyCode]] = BIG_FALSE;
							   break;
		case NSScrollWheel:	   BigContext.eventType = BIG_SCROLL_MOUVED;
							   break;
		case NSOtherMouseDown: BigContext.eventType = BIG_MIDDLE_MOUSE_DOWN;
							   break;
		case NSOtherMouseUp:   BigContext.eventType = BIG_MIDDLE_MOUSE_UP;
							   break;
		default:			   BigContext.eventType = BIG_EVENT_NOTHING;
								[ NSApp sendEvent:BigContext.Event ];
							   break;
	}
	
	
	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	
}

void bigEndFrame( BIGvoid)
{
	[[NSOpenGLContext currentContext] flushBuffer];
}

BIGboolean bigWindowIsActive( BIGvoid )
{
	return( BigContext.isActive );
}

void bigExit(BIGvoid)
{

	[BigContext.Pool release];
	//[BigContext.App release];
	
	bigDestroyWindow();

}

BIGboolean bigGetIntegerEvent(BIGenum mode)
{
	return( BigContext.eventType == mode);
}

BIGenum bigGetEventType(BIGvoid)
{
	return( BigContext.eventType );
}

BIGenum bigGetKeyCode(BIGvoid)
{
	return [BigContext.Event keyCode];
}

BIGboolean bigIsActiveKey(BIGenum key)
{		
	return BigContext.isKeyActive[key];	
}

void bigGetMouseLocation(BIGint* loc)
{
	
	loc[0] = BigContext.mouseLoc.x;
	loc[1] = BigContext.mouseLoc.y;
	
}

void bigCreateAlertMessageBox(const char* title, const char* msg)
{
	NSString *StrTitle = [[[NSString alloc] initWithFormat:
							@"%s", title] autorelease];
							
	NSString *StrMsg = [[[NSString alloc] initWithFormat:
							@"%s", msg] autorelease];
							
	NSRunCriticalAlertPanel(StrTitle, StrMsg, @"ok", nil, nil);
}

BIGshort bigCreateYesNoMessageBox(const char* title, const char* msg )
{
	NSString *StrTitle = [[[NSString alloc] initWithFormat:
							@"%s", title] autorelease];
							
	NSString *StrMsg = [[[NSString alloc] initWithFormat:
							@"%s", msg] autorelease];
							
	return NSRunInformationalAlertPanel(StrTitle, StrMsg, @"Yes", @"No", nil);
	
}
 
bon, j'ai trouver la faille.

cela vient de [BigContext.App runModalSession:BigContext.Session] qui accroche probablement l'événementielle d'où le bruit du bip.:)

Maintenant je cherche une manière d'activer le bouton de fermeture de la fenêtre et ce sans [BigContext.App runModalSession:BigContext.Session].
 
C'est bien ça tu te fais les question et les réponses en même temps...
Pratique !
:up: