示例#1
0
文件: img.c 项目: Gingar/port
/* Frees all data allocated by cached_image including cached image itself */
void img_destruct_cached_image(struct cached_image *cimg)
{
	switch (cimg->state){
		case 0:
		case 1:
		case 2:
		case 3:
		case 9:
		case 11:
		break;
		
		case 12:
		case 14:
		if (cimg->gamma_table) mem_free(cimg->gamma_table);
		if (cimg->bmp.user){
			drv->unregister_bitmap(&(cimg->bmp));
		}
		if (cimg->strip_optimized){
			if (cimg->dregs) mem_free(cimg->dregs);
		}else{
			mem_free(cimg->buffer);
		}
		case 8:
		case 10:
		destroy_decoder(cimg);
		break;

		case 13:
		case 15:
		drv->unregister_bitmap(&(cimg->bmp));
		break;
		
#ifdef DEBUG
		default:
		fprintf(stderr,"img_destruct_cached_image: state=%d\n",cimg->state);
		internal("Invalid state in struct cached_image");
#endif /* #ifdef DEBUG */
	}
	mem_free(cimg->url);
	mem_free(cimg);
}
示例#2
0
int create_decoder(int dev)
{
 if(dev<0 || dev>=MAX_KX_DEVICES)
 {
  debug("kxmixer: invalid call [ac3 decode] - %d\n",dev);
  return -4;
 }

 if(first_time)
 {
  first_time=0;
  memset(&decoders,0,sizeof(decoders));
 }

 if(decoders[dev]==0)
 {
    UINT wavein_num=manager->get_ikx(dev)->get_winmm_device(KX_WINMM_WAVE,0);
    UINT waveout_num=manager->get_ikx(dev)->get_winmm_device(KX_WINMM_WAVE,1);
    if(wavein_num==0xffffffff)
    {
     debug("!!! kxmixer: error enumerating wave-in [%x %d]\n",GetLastError(),wavein_num);
     return -1;
    }
    if(waveout_num==0xffff)
    {
     debug("!!! kxmixer: error enumerating wave-out [%x %d]\n",GetLastError(),waveout_num);
     return -1;
    }

    ac3_decode *ac3;
    ac3=(ac3_decode *)malloc(sizeof(ac3_decode));
    if(ac3)
    {
	memset(ac3,0,sizeof(ac3_decode));

	decoders[dev]=ac3;

	ac3->ikx_t=manager->get_ikx(dev);
	ac3->device_num=dev;

	ac3->last_in_buffer=-1;
	ac3->last_out_buffer=-1;

        MMRESULT res;

        WAVEFORMATEXTENSIBLE format;
        format.Format.nChannels=2;
        format.Format.nSamplesPerSec=48000;
        format.Format.nAvgBytesPerSec=48000*4;
        format.Format.nBlockAlign=2*16/8;
        format.Format.wBitsPerSample=16;

        format.Samples.wValidBitsPerSample=16;
        format.dwChannelMask=3;
        memcpy(&format.SubFormat,&KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF,sizeof(format.SubFormat));

        format.Format.cbSize=0;
        format.Format.wFormatTag=WAVE_FORMAT_PCM;
        //format.Format.cbSize=22;
        //format.Format.wFormatTag=WAVE_FORMAT_EXTENSIBLE;

        res=waveInOpen(&ac3->wave_in,wavein_num,(WAVEFORMATEX *)&format,(DWORD_PTR)wave_in_proc,(DWORD_PTR)ac3,CALLBACK_FUNCTION);
        if(res==MMSYSERR_NOERROR)
        {
          format.Format.cbSize=22;
          format.Format.wFormatTag=WAVE_FORMAT_EXTENSIBLE;

          res=waveOutOpen(&ac3->wave_out,waveout_num,(WAVEFORMATEX *)&format,(DWORD_PTR)wave_out_proc,(DWORD_PTR)ac3,CALLBACK_FUNCTION);
          if(res==MMSYSERR_NOERROR)
          {
           for(int i=0;i<TOTAL_BUFFERS;i++)
           {
            memset(&ac3->in_buffer[i],0,sizeof(ac3->in_buffer[i]));
            memset(&ac3->out_buffer[i],0,sizeof(ac3->out_buffer[i]));

            ac3->in_buffer[i].lpData=(LPSTR)ac3->in_data[i];
            ac3->in_buffer[i].dwBufferLength=BUFFER_LENGTH;
            ac3->in_buffer[i].dwUser=i+1;

            if(waveInPrepareHeader(ac3->wave_in,&ac3->in_buffer[i],sizeof(ac3->in_buffer[i]))!=MMSYSERR_NOERROR)
            {
             debug("kxmixer: error preparing wavein header [%x]\n",GetLastError());
             res=-1;
             break;
            }

            ac3->out_buffer[i].lpData=(LPSTR)ac3->out_data[i];
            ac3->out_buffer[i].dwBufferLength=BUFFER_LENGTH;
            ac3->out_buffer[i].dwUser=i+1;

            if(waveOutPrepareHeader(ac3->wave_out,&ac3->out_buffer[i],sizeof(ac3->out_buffer[i]))!=MMSYSERR_NOERROR)
            {
             debug("kxmixer: error preparing waveout header [%x]\n",GetLastError());
             res=-1;
             break;
            }
           }
           if(res==0)
           {
            res=waveInAddBuffer(ac3->wave_in,&ac3->in_buffer[0],sizeof(WAVEHDR));
            if(res==0)
            {
             res=waveInAddBuffer(ac3->wave_in,&ac3->in_buffer[1],sizeof(WAVEHDR));
             if(res==0)
             {
               res=waveInAddBuffer(ac3->wave_in,&ac3->in_buffer[2],sizeof(WAVEHDR));
               if(res==0)
               {
                debug("kxmixer: ac-3 decoding engine instantiated\n");
                //  create thread here:
                ac3->thread=_beginthread(ac3_thread,0,ac3);
                return 0;
               }
               else
                debug("kxmixer: error adding third wave-in buffer [%x]\n",GetLastError());
             }
             else
              debug("kxmixer: error adding second wave-in buffer [%x]\n",GetLastError());
            }
            else
             debug("kxmixer: error adding wave-in buffer [%x]\n",GetLastError());
           }
          }
          else debug("!!! kxmixer: error opening wave-out [%x]\n",GetLastError());
        } else debug("!!! kxmixer: error opening wave-in [%x]\n",GetLastError());

        destroy_decoder(dev);

    } else debug("kxmixer: ac3 decoder: not enought memory!\n");
  }
  else
   debug("!! kxmixer: ac3 decoder already started\n");

  return 0;
}