comparison ALmixer.c @ 45:a44114dc8631

merged
author Eric Wing <ewing@anscamobile.com>
date Tue, 13 Sep 2011 18:11:12 -0700
parents 56855942fdc6
children 9b772c81b550
comparison
equal deleted inserted replaced
43:a55e1f3d8f10 45:a44114dc8631
2818 */ 2818 */
2819 alGetSourcei( 2819 alGetSourcei(
2820 ALmixer_Channel_List[channel].alsource, 2820 ALmixer_Channel_List[channel].alsource,
2821 AL_SOURCE_STATE, &state 2821 AL_SOURCE_STATE, &state
2822 ); 2822 );
2823 if((error = alGetError()) != AL_NO_ERROR) 2823 if((error = alGetError()) != AL_NO_ERROR)
2824 { 2824 {
2825 fprintf(stderr, "29Testing error: %s\n", 2825 fprintf(stderr, "Internal_PauseChannel specific channel error: %s\n",
2826 alGetString(error)); 2826 alGetString(error));
2827 } 2827 }
2828 if(AL_PLAYING == state) 2828 if(AL_PLAYING == state)
2829 { 2829 {
2830 /* Count the actual number of channels being paused */ 2830 /* Count the actual number of channels being paused */
2831 counter++; 2831 counter++;
2832 2832
2901 */ 2901 */
2902 alGetSourcei( 2902 alGetSourcei(
2903 ALmixer_Channel_List[i].alsource, 2903 ALmixer_Channel_List[i].alsource,
2904 AL_SOURCE_STATE, &state 2904 AL_SOURCE_STATE, &state
2905 ); 2905 );
2906 if((error = alGetError()) != AL_NO_ERROR) 2906 if((error = alGetError()) != AL_NO_ERROR)
2907 { 2907 {
2908 fprintf(stderr, "30Testing error: %s\n", 2908 fprintf(stderr, "Internal_PauseChannel all channels error: %s\n",
2909 alGetString(error)); 2909 alGetString(error));
2910 } 2910 }
2911 if(AL_PLAYING == state) 2911 if(AL_PLAYING == state)
2912 { 2912 {
2913 /* Count the actual number of channels being paused */ 2913 /* Count the actual number of channels being paused */
2914 counter++; 2914 counter++;
2915 2915
5230 5230
5231 ALuint unqueued_buffer_id; 5231 ALuint unqueued_buffer_id;
5232 ALuint number_of_buffers_to_queue_this_pass = ALmixer_Channel_List[i].almixer_data->num_target_buffers_per_pass; 5232 ALuint number_of_buffers_to_queue_this_pass = ALmixer_Channel_List[i].almixer_data->num_target_buffers_per_pass;
5233 ALuint current_count_of_buffer_queue_passes = 0; 5233 ALuint current_count_of_buffer_queue_passes = 0;
5234 5234
5235 #if 0 5235 /* fprintf(stderr, "For Streamed\n"); */
5236 /********* Remove this **********/
5237 fprintf(stderr, "For Streamed\n");
5238 5236
5239 alGetSourcei( 5237 alGetSourcei(
5240 ALmixer_Channel_List[i].alsource, 5238 ALmixer_Channel_List[i].alsource,
5241 AL_SOURCE_STATE, &state 5239 AL_SOURCE_STATE, &state
5242 ); 5240 );
5243 switch(state) { 5241 #if 0
5242 /********* Remove this **********/
5243 switch(state)
5244 {
5244 case AL_PLAYING: 5245 case AL_PLAYING:
5245 fprintf(stderr, "Channel '%d' is PLAYING\n", i); 5246 fprintf(stderr, "Channel '%d' is PLAYING\n", i);
5246 break; 5247 break;
5247 case AL_PAUSED: 5248 case AL_PAUSED:
5248 fprintf(stderr, "Channel '%d' is PAUSED\n",i); 5249 fprintf(stderr, "Channel '%d' is PAUSED\n",i);
7460 { 7461 {
7461 if((AL_TRUE == g_inInterruption) || (AL_FALSE == ALmixer_Initialized)) 7462 if((AL_TRUE == g_inInterruption) || (AL_FALSE == ALmixer_Initialized))
7462 { 7463 {
7463 return; 7464 return;
7464 } 7465 }
7465 #ifdef ENABLE_ALMIXER_THREADS 7466
7466 /* Kill bookkeeping thread to help minimize wasted CPU resources */ 7467 ALmixer_SuspendUpdates();
7467 7468
7468 /* Is locking really necessary here? */
7469 /* SDL_LockMutex(s_simpleLock); */
7470 g_StreamThreadEnabled = AL_FALSE;
7471 /* SDL_UnlockMutex(s_simpleLock); */
7472
7473 SDL_WaitThread(Stream_Thread_global, NULL);
7474 Stream_Thread_global = NULL;
7475
7476 #endif
7477 s_interruptionContext = alcGetCurrentContext(); 7469 s_interruptionContext = alcGetCurrentContext();
7478 if(NULL != s_interruptionContext) 7470 if(NULL != s_interruptionContext)
7479 { 7471 {
7480 /* iOS alcSuspendContext is a no-op */ 7472 /* iOS alcSuspendContext is a no-op */
7481 alcSuspendContext(s_interruptionContext); 7473 alcSuspendContext(s_interruptionContext);
7511 { 7503 {
7512 alcMakeContextCurrent(s_interruptionContext); 7504 alcMakeContextCurrent(s_interruptionContext);
7513 alcProcessContext(s_interruptionContext); 7505 alcProcessContext(s_interruptionContext);
7514 s_interruptionContext = NULL; 7506 s_interruptionContext = NULL;
7515 } 7507 }
7516 #ifdef ENABLE_ALMIXER_THREADS 7508
7509 ALmixer_ResumeUpdates();
7510 g_inInterruption = AL_FALSE;
7511 }
7512
7513
7514 ALboolean ALmixer_IsInInterruption()
7515 {
7516 if(AL_FALSE == ALmixer_Initialized)
7517 {
7518 return AL_FALSE;
7519 }
7520 return g_inInterruption;
7521 }
7522
7523 void ALmixer_SuspendUpdates()
7524 {
7525 if(AL_TRUE == ALmixer_AreUpdatesSuspended())
7526 {
7527 return;
7528 }
7529 #ifdef ENABLE_ALMIXER_THREADS
7530 /* Kill bookkeeping thread to help minimize wasted CPU resources */
7531
7532 /* Is locking really necessary here? */
7533 /* SDL_LockMutex(s_simpleLock); */
7534 g_StreamThreadEnabled = AL_FALSE;
7535 /* SDL_UnlockMutex(s_simpleLock); */
7536
7537 SDL_WaitThread(Stream_Thread_global, NULL);
7538 Stream_Thread_global = NULL;
7539 #endif
7540 }
7541
7542 void ALmixer_ResumeUpdates()
7543 {
7544 if(AL_FALSE == ALmixer_AreUpdatesSuspended())
7545 {
7546 return;
7547 }
7548
7549 #ifdef ENABLE_ALMIXER_THREADS
7550 /* This must be set before the thread is created to prevent the thread from exiting. */
7517 g_StreamThreadEnabled = AL_TRUE; 7551 g_StreamThreadEnabled = AL_TRUE;
7518 7552
7519 Stream_Thread_global = SDL_CreateThread(Stream_Data_Thread_Callback, NULL); 7553 Stream_Thread_global = SDL_CreateThread(Stream_Data_Thread_Callback, NULL);
7520 if(NULL == Stream_Thread_global) 7554 if(NULL == Stream_Thread_global)
7521 { 7555 {
7522 fprintf(stderr, "Critical Error: Could not create bookkeeping thread in EndInterruption\n"); 7556 fprintf(stderr, "Critical Error: Could not create bookkeeping thread in EndInterruption\n");
7523 } 7557 }
7524 #endif 7558 /* Note: Only a few platforms change the priority. See implementation for notes. */
7525 g_inInterruption = AL_FALSE; 7559 Internal_LowerThreadPriority(Stream_Thread_global);
7526 } 7560 #endif
7527 7561 }
7528 7562
7529 ALboolean ALmixer_IsInInterruption() 7563 ALboolean ALmixer_AreUpdatesSuspended()
7530 { 7564 {
7531 if(AL_FALSE == ALmixer_Initialized) 7565 #ifdef ENABLE_ALMIXER_THREADS
7566 if(AL_FALSE == g_StreamThreadEnabled)
7567 {
7568 return AL_TRUE;
7569 }
7570 else
7532 { 7571 {
7533 return AL_FALSE; 7572 return AL_FALSE;
7534 } 7573 }
7535 return g_inInterruption; 7574 #else
7575 return AL_FALSE;
7576 #endif
7536 } 7577 }
7537 7578
7538 /* Keep the return value void to allow easy use with 7579 /* Keep the return value void to allow easy use with
7539 * atexit() 7580 * atexit()
7540 */ 7581 */
8485 * 0 tells SDL_sound to use the "actual" values 8526 * 0 tells SDL_sound to use the "actual" values
8486 */ 8527 */
8487 target.channels = 0; 8528 target.channels = 0;
8488 target.rate = 0; 8529 target.rate = 0;
8489 8530
8531 if(0 == buffersize)
8532 {
8533 buffersize = ALMIXER_DEFAULT_BUFFERSIZE;
8534 }
8490 #if 0 8535 #if 0
8491 /* This requires my new additions to SDL_sound. It will 8536 /* This requires my new additions to SDL_sound. It will
8492 * convert the sample to the proper endian order. 8537 * convert the sample to the proper endian order.
8493 * If the actual is 8-bit, it will do unsigned, if 8538 * If the actual is 8-bit, it will do unsigned, if
8494 * the actual is 16-bit, it will do signed. 8539 * the actual is 16-bit, it will do signed.