Esempio n. 1
0
        public virtual int sceAudiocodecDecode(TPointer workArea, int codecType)
        {
            workArea.setValue32(8, 0);             // err FieldInfo

            AudiocodecInfo info = infos[workArea.Address];

            if (info == null)
            {
                Console.WriteLine(string.Format("sceAudiocodecDecode no info available for workArea={0}", workArea));
                return(-1);
            }

            int inputBuffer  = workArea.getValue32(24);
            int outputBuffer = workArea.getValue32(32);
            int unknown1     = workArea.getValue32(40);
            int codingMode   = 0;
            int channels     = info.outputChannels;

            int inputBufferSize;

            switch (codecType)
            {
            case PSP_CODEC_AT3PLUS:
                if (workArea.getValue32(48) == 0)
                {
                    inputBufferSize = workArea.getValue32(64) + 2;
                }
                else
                {
                    inputBufferSize = 0x100A;
                }

                // Skip any audio frame header (found in PSMF files)
                Memory mem = workArea.Memory;
                if (mem.read8(inputBuffer) == 0x0F && mem.read8(inputBuffer + 1) == 0xD0)
                {
                    int frameHeader23    = (mem.read8(inputBuffer + 2) << 8) | mem.read8(inputBuffer + 3);
                    int audioFrameLength = (frameHeader23 & 0x3FF) << 3;
                    inputBufferSize = audioFrameLength;
                    inputBuffer    += 8;
                }
                break;

            case PSP_CODEC_AT3:
                switch (workArea.getValue32(40))
                {
                case 0x4:
                    inputBufferSize = 0x180;
                    break;

                case 0x6:
                    inputBufferSize = 0x130;
                    break;

                case 0xB:
                    inputBufferSize = 0xC0;
                    codingMode      = 1;
                    break;                                     // JOINT_STEREO
                    goto case 0xE;

                case 0xE:
                    inputBufferSize = 0xC0;
                    break;

                case 0xF:
                    inputBufferSize = 0x98;
                    channels        = 1;
                    break;                                     // MONO
                    goto default;

                default:
                    Console.WriteLine(string.Format("sceAudiocodecDecode Atrac3 unknown value 0x{0:X} at offset 40", workArea.getValue32(40)));
                    inputBufferSize = 0x180;
                    break;
                }
                break;

            case PSP_CODEC_MP3:
                inputBufferSize = workArea.getValue32(40);
                break;

            case PSP_CODEC_AAC:
                if (workArea.getValue8(44) == 0)
                {
                    inputBufferSize = 0x600;
                }
                else
                {
                    inputBufferSize = 0x609;
                }
                break;

            case 0x1004:
                inputBufferSize = workArea.getValue32(40);
                break;

            default:
                return(-1);
            }

            int outputBufferSize = getOutputBufferSize(workArea, codecType);

            workArea.setValue32(36, outputBufferSize);

            //if (log.DebugEnabled)
            {
                Console.WriteLine(string.Format("sceAudiocodecDecode inputBuffer=0x{0:X8}, outputBuffer=0x{1:X8}, inputBufferSize=0x{2:X}, outputBufferSize=0x{3:X}", inputBuffer, outputBuffer, inputBufferSize, outputBufferSize));
                Console.WriteLine(string.Format("sceAudiocodecDecode unknown1=0x{0:X8}", unknown1));
                if (log.TraceEnabled)
                {
                    log.trace(string.Format("sceAudiocodecDecode inputBuffer: {0}", Utilities.getMemoryDump(inputBuffer, inputBufferSize)));
                }
            }

            ICodec codec = info.Codec;

            if (!info.CodecInitialized)
            {
                codec.init(inputBufferSize, channels, info.outputChannels, codingMode);
                info.setCodecInitialized();
            }

            if (codec == null)
            {
                Console.WriteLine(string.Format("sceAudiocodecDecode no codec available for codecType=0x{0:X}", codecType));
                return(-1);
            }

            int bytesConsumed = codec.decode(inputBuffer, inputBufferSize, outputBuffer);

            //if (log.DebugEnabled)
            {
                if (bytesConsumed < 0)
                {
                    Console.WriteLine(string.Format("codec.decode returned error 0x{0:X8}, data: {1}", bytesConsumed, Utilities.getMemoryDump(inputBuffer, inputBufferSize)));
                }
                else
                {
                    Console.WriteLine(string.Format("sceAudiocodecDecode bytesConsumed=0x{0:X}", bytesConsumed));
                }
            }

            if (codec is Mp3Decoder)
            {
                Mp3Header mp3Header = ((Mp3Decoder)codec).Mp3Header;
                if (mp3Header != null)
                {
                    // See https://github.com/uofw/uofw/blob/master/src/avcodec/audiocodec.c
                    workArea.setValue32(68, mp3Header.bitrateIndex);                     // MP3 bitrateIndex [0..14]
                    workArea.setValue32(72, mp3Header.rawSampleRateIndex);               // MP3 freqType [0..3]

                    int type;
                    if (mp3Header.mpeg25 != 0)
                    {
                        type = 2;
                    }
                    else if (mp3Header.lsf != 0)
                    {
                        type = 0;
                    }
                    else
                    {
                        type = 1;
                    }
                    workArea.setValue32(56, type);                     // type [0..2]

                    //if (log.DebugEnabled)
                    {
                        Console.WriteLine(string.Format("sceAudiocodecDecode MP3 bitrateIndex={0:D}, rawSampleRateIndex={1:D}, type={2:D}", mp3Header.bitrateIndex, mp3Header.rawSampleRateIndex, type));
                    }
                }
            }

            workArea.setValue32(28, bytesConsumed > 0 ? bytesConsumed : inputBufferSize);

            Modules.ThreadManForUserModule.hleKernelDelayThread(sceMpeg.atracDecodeDelay, false);

            return(0);
        }
Esempio n. 2
0
        public void GetInfoFromWeb(IMyCollectionsData item)
        {
            Music objEntity = item as Music;

            if (objEntity == null)
            {
                return;
            }

            bool      bFind      = false;
            Hashtable objResults = null;

            if (objEntity.IsComplete == false)
            {
                string strSearch = objEntity.Title.Trim();
                string artist    = string.Empty;
                if (objEntity.Artists.Any() && string.IsNullOrWhiteSpace(objEntity.Artists.First().FulleName) == false)
                {
                    artist = objEntity.Artists.First().FulleName;
                }


                if (MySettings.CleanTitle == true)
                {
                    strSearch = Util.CleanExtensions(strSearch);
                }

                string search = strSearch;
                Task.Factory.StartNew(() => Util.NotifyEvent("getInfoFromWeb: Music : " + search));

                if (bFind == false && MySettings.EnableNokiaMusicUs == true &&
                    string.IsNullOrWhiteSpace(strSearch) == false)
                {
                    Collection <PartialMatche> results = NokiaServices.Search(strSearch);

                    if (results != null && results.Any())
                    {
                        objResults = NokiaServices.Parse(results[0].Link);
                    }

                    if (objResults != null)
                    {
                        bFind = Fill(objResults, objEntity);
                    }
                }
                if (bFind == false && MySettings.EnableMusicBrainzUs == true && string.IsNullOrWhiteSpace(strSearch) == false)
                {
                    Collection <PartialMatche> results = MusicbrainzServices.Search(strSearch, artist);

                    if (results != null && results.Any())
                    {
                        objResults = MusicbrainzServices.Parse(results[0].Link);
                    }

                    if (objResults != null)
                    {
                        bFind = Fill(objResults, objEntity);
                    }
                }
                if (bFind == false && MySettings.EnableAmazonMusic == true)
                {
                    Collection <PartialMatche> results = AmazonServices.Search(strSearch, artist, AmazonIndex.Music,
                                                                               AmazonCountry.com, AmazonBrowserNode.None);

                    if (results != null && results.Any())
                    {
                        objResults = AmazonServices.Parse(results[0].Link, AmazonCountry.com,
                                                          !string.IsNullOrWhiteSpace(objEntity.BarCode),
                                                          AmazonIndex.Music, string.Empty);
                    }

                    if (objResults != null)
                    {
                        bFind = Fill(objResults, objEntity);
                    }
                }

                if (bFind == false && MySettings.EnableGraceNoteUs == true)
                {
                    Collection <PartialMatche> results = GraceNoteServices.Search(strSearch, GraceNoteLanguage.eng,
                                                                                  artist);

                    if (results != null && results.Any())
                    {
                        objResults = GraceNoteServices.Parse(results[0].Link, GraceNoteLanguage.eng);
                    }

                    if (objResults != null)
                    {
                        bFind = Fill(objResults, objEntity);
                    }
                }

                if (bFind == false && MySettings.EnableAmazonFrMusic == true)
                {
                    Collection <PartialMatche> results = AmazonServices.Search(strSearch, artist, AmazonIndex.Music,
                                                                               AmazonCountry.fr, AmazonBrowserNode.None);

                    if (results != null && results.Any())
                    {
                        objResults = AmazonServices.Parse(results[0].Link, AmazonCountry.fr,
                                                          !string.IsNullOrWhiteSpace(objEntity.BarCode),
                                                          AmazonIndex.Music, string.Empty);
                    }

                    if (objResults != null)
                    {
                        bFind = Fill(objResults, objEntity);
                    }
                }

                if (bFind == false && MySettings.EnableAmazonDeMusic == true)
                {
                    Collection <PartialMatche> results = AmazonServices.Search(strSearch, artist, AmazonIndex.Music,
                                                                               AmazonCountry.de, AmazonBrowserNode.None);

                    if (results != null && results.Any())
                    {
                        objResults = AmazonServices.Parse(results[0].Link, AmazonCountry.de,
                                                          !string.IsNullOrWhiteSpace(objEntity.BarCode),
                                                          AmazonIndex.Music, string.Empty);
                    }

                    if (objResults != null)
                    {
                        bFind = Fill(objResults, objEntity);
                    }
                }

                if (bFind == false && MySettings.EnableAmazonItMusic == true)
                {
                    Collection <PartialMatche> results = AmazonServices.Search(strSearch, artist, AmazonIndex.Music,
                                                                               AmazonCountry.it, AmazonBrowserNode.None);

                    if (results != null && results.Any())
                    {
                        objResults = AmazonServices.Parse(results[0].Link, AmazonCountry.it,
                                                          !string.IsNullOrWhiteSpace(objEntity.BarCode),
                                                          AmazonIndex.Music, string.Empty);
                    }

                    if (objResults != null)
                    {
                        bFind = Fill(objResults, objEntity);
                    }
                }

                if (bFind == false && MySettings.EnableAmazonCnMusic == true)
                {
                    Collection <PartialMatche> results = AmazonServices.Search(strSearch, artist, AmazonIndex.Music,
                                                                               AmazonCountry.cn, AmazonBrowserNode.None);

                    if (results != null && results.Any())
                    {
                        objResults = AmazonServices.Parse(results[0].Link, AmazonCountry.cn,
                                                          !string.IsNullOrWhiteSpace(objEntity.BarCode),
                                                          AmazonIndex.Music, string.Empty);
                    }

                    if (objResults != null)
                    {
                        bFind = Fill(objResults, objEntity);
                    }
                }

                if (bFind == false && MySettings.EnableAmazonSpMusic == true)
                {
                    Collection <PartialMatche> results = AmazonServices.Search(strSearch, artist, AmazonIndex.Music,
                                                                               AmazonCountry.es, AmazonBrowserNode.None);

                    if (results != null && results.Any())
                    {
                        objResults = AmazonServices.Parse(results[0].Link, AmazonCountry.es,
                                                          !string.IsNullOrWhiteSpace(objEntity.BarCode),
                                                          AmazonIndex.Music, string.Empty);
                    }

                    if (objResults != null)
                    {
                        bFind = Fill(objResults, objEntity);
                    }
                }

                if (bFind == false && MySettings.EnableLastFM == true &&
                    string.IsNullOrWhiteSpace(strSearch) == false)
                {
                    Collection <PartialMatche> results = LastFmServices.Search(strSearch);

                    if (results != null && results.Any())
                    {
                        objResults = LastFmServices.Parse(results[0].Link, results[0].Title, results[0].Artist);
                    }

                    if (objResults != null)
                    {
                        bFind = Fill(objResults, objEntity);
                    }
                }

                if (bFind == false && MySettings.EnableFnacMusic == true &&
                    string.IsNullOrWhiteSpace(strSearch) == false)
                {
                    Collection <PartialMatche> results = FnacServices.Search(strSearch, artist);

                    if (results != null && results.Any())
                    {
                        objResults = FnacServices.Parse(results[0].Link, true, strSearch);
                    }

                    if (objResults != null)
                    {
                        bFind = Fill(objResults, objEntity);
                    }
                }

                if (objEntity.Runtime == null || objEntity.BitRate == null)
                {
                    if (File.Exists(objEntity.FilePath + @"\" + objEntity.FileName))
                    {
                        Mp3Header objMp3Header = new Mp3Header();
                        if (objMp3Header.ReadMP3Information(objEntity.FilePath + @"\" + objEntity.FileName))
                        {
                            if (objEntity.Runtime == null)
                            {
                                objEntity.Runtime = objMp3Header.intLength;
                            }
                            if (objEntity.BitRate == null)
                            {
                                objEntity.BitRate = objMp3Header.intBitRate;
                            }
                        }
                    }
                }

                CommonServices.Update(objEntity);
            }
        }