⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chp_dl_media_midi.c

📁 C625 midi播放源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
							IOU_OUT(IMUSIC_SCORE_L,0); //dacyli 050623
						}
			}
			IOU_OUT(IMUSIC_MUSIC_START,MIDI_PLAY);//start play midi ,set music start bit 1
			break;
		case IMUSIC_FILE_TYPE_MIDI_0:
			//send score fifo full
			while(p_media_midi_data->iMusic_file_count < p_media_midi_data->iMusic_file_size && i < (IMUSIC_SCORE_FIFO_COUNT/2) )
			{
				IOU_OUT( IMUSIC_SCORE_FIFO, p_media_midi_data->iMusic_file_pointer[p_media_midi_data->iMusic_file_count] );
				p_media_midi_data->iMusic_file_count++;
				i++;
			}
			//play loop
			if(p_media_midi_data->iMusic_file_count >= p_media_midi_data->iMusic_file_size )
			{
				if(p_media_midi_data->iMusic_play_status == IMUSIC_PLAY_STATUS_INFINITE)
					p_media_midi_data->iMusic_file_count = 0;
				else if (--p_media_midi_data->time_mode)
					{
					//ret = dl_media_midi_init();//added by tomybao  ,deleted by zhaolin
						p_media_midi_data->iMusic_file_count = 0;
					}
				else 
					{
						p_media_midi_data->iMusic_play_status = IMUSIC_PLAY_STATUS_END;					
						IOU_OUT(IMUSIC_SCORE_L, 0x00);//dacyli 050623
					}
			}		
			IOU_OUT(IMUSIC_MUSIC_START,MIDI_PLAY);//start play midi ,set music start bit 1
			break;
		case IMUSIC_FILE_TYPE_MMD:
			while(p_media_midi_data->iMusic_file_count < p_media_midi_data->iMusic_file_size)
			{
				IOU_IN(IMUSIC_FIFO_STATUS, val);
	                   if(val&0x10) break;

				IOU_OUT( IMUSIC_SCORE_FIFO, p_media_midi_data->iMusic_file_pointer[p_media_midi_data->iMusic_file_count] );
				p_media_midi_data->iMusic_file_count++;
				if(p_media_midi_data->iMusic_mmhd_head)
				{
					if(p_media_midi_data->iMusic_file_count == p_media_midi_data->iMusic_mmhd_size )
					{
						p_media_midi_data->iMusic_file_count = p_media_midi_data->iMusic_mmdd_start;
						p_media_midi_data->iMusic_mmhd_head = 0;
					}
				}
				
			}
			//play loop
			if(p_media_midi_data->iMusic_file_count >= p_media_midi_data->iMusic_file_size )
			{
				if(p_media_midi_data->iMusic_play_status == IMUSIC_PLAY_STATUS_INFINITE)
				{
					p_media_midi_data->iMusic_file_count = 0;
					p_media_midi_data->iMusic_mmhd_head=1;
				}
				else if (--p_media_midi_data->time_mode)
				{
					//ret = dl_media_midi_init();//added by tomybao ,deleted by zhaolin
					p_media_midi_data->iMusic_file_count = 0;
					p_media_midi_data->iMusic_mmhd_head=1;
				}
					else 
						{
							p_media_midi_data->iMusic_play_status = IMUSIC_PLAY_STATUS_END;					
							IOU_OUT(IMUSIC_SCORE_L, 0x00);//dacyli 050623
						}
			}			
			IOU_OUT(IMUSIC_MUSIC_START,MIDI_PLAY);//start play MMD file ,set music start bit 1			

			//////////////////////////////////////////////////
			// open tune
			IOU_OUT( IMUSIC_EVENT_FIFO, 0xb0);
			IOU_OUT( IMUSIC_EVENT_FIFO, 0x07);	
			IOU_OUT( IMUSIC_EVENT_FIFO, 0x7f);
			
			//open 3D effect
			IOU_OUT( IMUSIC_EVENT_FIFO, 0xb0);
			IOU_OUT( IMUSIC_EVENT_FIFO, 0x5b);
			IOU_OUT( IMUSIC_EVENT_FIFO, 0x7f);
			//////////////////////////////////////////////////	
			break;
#ifdef MIDI_MMF_ENABLE			
		case IMUSIC_FILE_TYPE_MMF:
			dl_media_MIDI_Mmf_Init(p_media_midi_data->iMusic_file_pointer);
			while(p_media_midi_data->MIDI_mmf_end_flg!=1 && i < (IMUSIC_SCORE_FIFO_COUNT-IMUSIC_SCORE_INT_COUNT)) 
			{
				dl_media_MIDI_Mmf_Read_Data_To_Buffer();
				dl_media_MIDI_Mmf_Write_Data_To_Fifo();
				i+=IMUSIC_SCORE_INT_COUNT;
			}
			if(p_media_midi_data->MIDI_mmf_end_flg != 0 )
			{
				if(p_media_midi_data->iMusic_play_status == IMUSIC_PLAY_STATUS_INFINITE)
					dl_media_MIDI_Mmf_Init(p_media_midi_data->iMusic_file_pointer);
				else if (--p_media_midi_data->time_mode)
					{
					//ret = dl_media_midi_init();//added by tomybao, deleted by zhaolin
						dl_media_MIDI_Mmf_Init(p_media_midi_data->iMusic_file_pointer);
					}else 
						{
							p_media_midi_data->iMusic_play_status = IMUSIC_PLAY_STATUS_END;					
							IOU_OUT(IMUSIC_SCORE_L, 0x00);//dacyli 050623
						}
			}
			IOU_OUT(IMUSIC_MUSIC_START,MIDI_PLAY);//start play midi ,set music start bit 1
			break;
#endif			
		default:
			return DL_MEDIA_RET_MIDI_FILE_FORMAT_ERR;
	}

	if ( play_mode == MIDI_ADPCM_PLAY_NORMAL )
	{
		if(dl_media_midi_read_data(IMUSIC_FIFO_STATUS) == MIDI_FIFO_EMPTY)
			return DL_MEDIA_RET_FAIL;
			
		dl_media_midi_midi_int_ena();					//enable score fifo interrupt
		dl_media_interrupt_enable();
	}
	else if (  play_mode == MIDI_ADPCM_PLAY_BLOCK  )
	{
		while(p_media_midi_data->iMusic_file_count <= p_media_midi_data->iMusic_file_size )//added by tomybao.
		{
			if(p_media_midi_data->iMusic_play_status == IMUSIC_PLAY_STATUS_END)					
					break;				
			if((p_media_midi_data->iMusic_play_status == IMUSIC_PLAY_STATUS_PLAY)||
			    (p_media_midi_data->iMusic_play_status == IMUSIC_PLAY_STATUS_PAUSE))
			{
			    	IOU_IN(IOU_INTER_STATUS,val);
				if ( (val & IMUSIC_SCORE_EMPTY) )
					dl_media_midi_input_midi_data();
			}
		}
		dl_media_delay(120);//dacyli 050623
		IOU_OUT(IMUSIC_MUSIC_START,0x00);		
		IOU_OUT(IMUSIC_FIFO_CLR, 0X02);	// CLEAR SCORE FIFO
		IOU_OUT(IMUSIC_FIFO_CLR, 0X00);
	}
#ifdef DL_MEDIA_TIMER_MODE_ENABLE
	else if(play_mode == MIDI_ADPCM_PLAY_TIMER)
	{
		//added by huangjie for timer mode
	//	if(dl_media_timer_set(10))
	//		return DL_MEDIA_RET_FAIL;
		dl_media_midi_midi_int_ena();					//enable score fifo interrupt
		if(dl_media_midi_read_data(IMUSIC_FIFO_STATUS) == MIDI_FIFO_EMPTY)
		{
			return DL_MEDIA_RET_FAIL;
		}
	}
#endif
	return DL_MEDIA_RET_SUCCESS;
}


DL_MEDIA_RET_T dl_media_adpcm_start(MIDI_ADPCM_PLAY_MODE_T play_mode,UINT8  time_mode)
{
	int i=0,ret;
	DL_MEDIA_MIDI_DATA_T *p_media_midi_data=p_g_media_midi_data;
	UINT16 val;
	
	p_media_midi_data->time_mode = time_mode;
	if(!p_media_midi_data->time_mode)
		p_media_midi_data->adp_play_status = IMUSIC_PLAY_STATUS_INFINITE;
	else
		p_media_midi_data->adp_play_status = IMUSIC_PLAY_STATUS_PLAY;

	p_media_midi_data->adp_file_count = 0;

	while(p_media_midi_data->adp_file_count < p_media_midi_data->adp_file_size && i < IMUSIC_ADPCM_FIFO_COUNT)
	{
		IOU_OUT( IMUSIC_ADPCM_FIFO, p_media_midi_data->adp_file_pointer[p_media_midi_data->adp_file_count] );
		p_media_midi_data->adp_file_count++;
		i++;
	}
	//play loop
	if(p_media_midi_data->adp_file_count >= p_media_midi_data->adp_file_size )
	{
		if(p_media_midi_data->adp_play_status == IMUSIC_PLAY_STATUS_INFINITE)
			p_media_midi_data->adp_file_count = 0;
		else if (--p_media_midi_data->time_mode)
			{
				ret = dl_media_midi_init();//added by tomybao.
				p_media_midi_data->adp_file_count = 0;		
			}			
			else 
				{
					p_media_midi_data->adp_play_status = IMUSIC_PLAY_STATUS_END;
					IOU_OUT(IMUSIC_ADPCM_L,0x00);//dacyli 050623
				}
	}
	IOU_OUT(IMUSIC_ADPCM_START,MIDI_PLAY);//start play ADPCM file ,set ADPCM start bit 1	

	if ( play_mode == MIDI_ADPCM_PLAY_NORMAL )
	{
		dl_media_interrupt_enable();
		dl_media_midi_adp_int_ena();					//enable score fifo interrupt
	 
		if(dl_media_midi_read_data(IMUSIC_FIFO_STATUS) == MIDI_FIFO_EMPTY)
			return DL_MEDIA_RET_FAIL;
	}
	else if (  play_mode == MIDI_ADPCM_PLAY_BLOCK  )
	{
		while(p_media_midi_data->adp_file_count <= p_media_midi_data->adp_file_size)
		{
			if(p_media_midi_data->adp_play_status == IMUSIC_PLAY_STATUS_END)
				{
					IOU_OUT(IMUSIC_ADPCM_L,0x00);//dacyli 050623
					break;
				}
			if((p_media_midi_data->adp_play_status == IMUSIC_PLAY_STATUS_PLAY)||
			    (p_media_midi_data->adp_play_status == IMUSIC_PLAY_STATUS_PAUSE))
			{
			    	IOU_IN(IOU_INTER_STATUS,val);
		
				if ( (val & IMUSIC_ADPCM_EMPTY) )
					dl_media_midi_input_adpcm_data();
			}
		}		
		dl_media_delay(120); //dacyli 050623
		IOU_OUT(IMUSIC_MUSIC_START,0x00);		
		IOU_OUT(IMUSIC_FIFO_CLR, 0X02);	// CLEAR SCORE FIFO
		IOU_OUT(IMUSIC_FIFO_CLR, 0X00);
	}
#ifdef DL_MEDIA_TIMER_MODE_ENABLE
	else if(play_mode == MIDI_ADPCM_PLAY_TIMER)
	{
		//added by huangjie for timer mode
	//	if(dl_media_timer_set(10))
	//		return DL_MEDIA_RET_FAIL;
		dl_media_midi_adp_int_ena();
		if(dl_media_midi_read_data(IMUSIC_FIFO_STATUS) == MIDI_FIFO_EMPTY)
		{
			return DL_MEDIA_RET_FAIL;
		}
	}
#endif	
	return DL_MEDIA_RET_SUCCESS;
}

UINT8  dl_media_midi_input_adpcm_data (void)
{
	UINT16 val,ret;
	 DL_MEDIA_MIDI_DATA_T *p_media_midi_data=p_g_media_midi_data;

	//ADPCM
	if ( p_media_midi_data->adp_play_status == IMUSIC_PLAY_STATUS_END )
	{
	//	dl_media_interrupt_restore();
		dl_media_midi_adp_int_disable();
		dl_media_callback.adp_callback = NULL;
		dl_media_callback.adp_para = NULL;
		return ADPCM_PLAY_END;
	}
	else
	{
		IOU_IN(IOU_INTER_STATUS,val);
		val &= ~IMUSIC_ADPCM_EMPTY;
		IOU_OUT(IOU_INTER_STATUS,val);//clear int
		
		while(p_media_midi_data->adp_file_count < p_media_midi_data->adp_file_size)
		{
			IOU_IN(IMUSIC_FIFO_STATUS, val);
			if(val&0x08) break;

			IOU_OUT( IMUSIC_ADPCM_FIFO, p_media_midi_data->adp_file_pointer[p_media_midi_data->adp_file_count] );
			p_media_midi_data->adp_file_count++;
		}
		//play loop
		if(p_media_midi_data->adp_file_count >= p_media_midi_data->adp_file_size )
		{
			if(p_media_midi_data->adp_play_status == IMUSIC_PLAY_STATUS_INFINITE)
				p_media_midi_data->adp_file_count = 0;
			else if (--p_media_midi_data->time_mode)
				{
//					ret = dl_media_midi_init();//added by tomybao.
					p_media_midi_data->adp_file_count = 0;
				}
				else 
					{
						p_media_midi_data->adp_play_status = IMUSIC_PLAY_STATUS_END;	
						sys_printf("Set adp end flag\n");
						IOU_OUT(IMUSIC_ADPCM_L, 0);//dacyli 050623
					}
		}
		return 0;
	}
	return 0;
}

UINT8 dl_media_midi_input_midi_data(void)
{
	UINT16 val;
	UINT32 i = 0,ret;
	DL_MEDIA_MIDI_DATA_T *p_media_midi_data=p_g_media_midi_data;
	UINT8 music_file_type = p_media_midi_data->iMusic_file_type;

	//MIDI
	if ( p_media_midi_data->iMusic_play_status == IMUSIC_PLAY_STATUS_END )
	{
	//	dl_media_interrupt_restore();
		dl_media_midi_midi_int_disable();
		dl_media_callback.midi_callback = NULL;
		dl_media_callback.midi_para = NULL;
		return MIDI_PLAY_END;
	}
	else
	{
		IOU_IN(IOU_INTER_STATUS,val);
		val &= ~IMUSIC_SCORE_EMPTY;
		IOU_OUT(IOU_INTER_STATUS,val);//clear int
		switch( music_file_type)
		{
			case IMUSIC_FILE_TYPE_MIDI_1:

				if(p_media_midi_data->write_pointer!=p_media_midi_data->read_pointer ) 
				{
		//			sys_printf("write_pointer=0x%x,read_pointer=0x%x\n",p_media_midi_data->write_pointer,p_media_midi_data->read_pointer);
					dl_media_midi_format1_write_data(p_media_midi_data);
					dl_media_midi_format1_read_data(p_media_midi_data);
				}
				//play loop
				if(p_media_midi_data->track_end_bit == 0 )
				{
					if(p_media_midi_data->iMusic_play_status == IMUSIC_PLAY_STATUS_INFINITE)
						dl_media_midi_format1_init(p_media_midi_data->iMusic_file_pointer,p_media_midi_data);
					else if (--p_media_midi_data->time_mode)
						{
							dl_media_midi_format1_init(p_media_midi_data->iMusic_file_pointer,p_media_midi_data);
						}
						
						else 
							{
								p_media_midi_data->iMusic_play_status = IMUSIC_PLAY_STATUS_END;
								IOU_OUT(IMUSIC_SCORE_L,0x00);//dacyli 050623
							}
				}					
				break;
			case IMUSIC_FILE_TYPE_MIDI_0:
				while(p_media_midi_data->iMusic_file_count < p_media_midi_data->iMusic_file_size)
				{
					IOU_IN(IMUSIC_FIFO_STATUS,val);  
					if( val & 0x10 )
						break;
					IOU_OUT( IMUSIC_SCORE_FIFO, p_media_midi_data->iMusic_file_pointer[p_media_midi_data->iMusic_file_count] );
					p_media_midi_data->iMusic_file_count++;
				}
				//play loop
				if(p_media_midi_data->iMusic_file_count >= p_media_midi_data->iMusic_file_size )
				{	
					if(p_media_midi_data->iMusic_play_status == IMUSIC_PLAY_STATUS_INFINITE)
						p_media_midi_data->iMusic_file_count = 0;
					else if (--p_media_midi_data->time_mode)
						{
							p_media_midi_data->iMusic_file_count = 0;
						}
					else 
						{
							p_media_midi_data->iMusic_play_status = IMUSIC_PLAY_STATUS_END;
							IOU_OUT(IMUSIC_SCORE_L, 0x0); //dacyli 050623
						//	dl_media_delay(2000);
						}
				}						
					
				break;
			case IMUSIC_FILE_TYPE_MMD:
				while(p_media_midi_data->iMusic_file_count < p_media_midi_data->iMusic_file_size)
				{
	   	                   IOU_IN(IMUSIC_FIFO_STATUS, val);
			             if(val&0x10) break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -