/* 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); }
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; }