comparison AudioPlayer.cpp @ 402:74205b91647b

Слияние
author Ritor1
date Sat, 23 Feb 2013 15:10:34 +0600
parents 7189d0bddf07 35a62d1948d4
children c0700eaabeb8
comparison
equal deleted inserted replaced
401:787b2c441840 402:74205b91647b
626 626
627 //----- (004AA306) -------------------------------------------------------- 627 //----- (004AA306) --------------------------------------------------------
628 void AudioPlayer::PlaySound(SoundID eSoundID, signed int a3, unsigned int uNumRepeats, signed int PartyX, signed int PartyY, int a7, unsigned int uVolume, int sPlaybackRate) 628 void AudioPlayer::PlaySound(SoundID eSoundID, signed int a3, unsigned int uNumRepeats, signed int PartyX, signed int PartyY, int a7, unsigned int uVolume, int sPlaybackRate)
629 { 629 {
630 //AudioPlayer *pAudioPlayer1; // esi@1 630 //AudioPlayer *pAudioPlayer1; // esi@1
631 signed int pNum; // edx@5 631 //signed int pNum; // edx@5
632 int *pSoundID; // ecx@6 632 //int *pSoundID; // ecx@6
633 int v12; // edi@13 633 int v12; // edi@13
634 signed int v13; // ecx@17 634 signed int v13; // ecx@17
635 signed int v14; // eax@20 635 signed int v14; // eax@20
636 int v15; // eax@24 636 int v15; // eax@24
637 signed int v16; // eax@25 637 signed int v16; // eax@25
655 int v34; // eax@70 655 int v34; // eax@70
656 char v35; // zf@70 656 char v35; // zf@70
657 signed int v36; // ebx@74 657 signed int v36; // ebx@74
658 //AudioPlayer *pAudioPlayer2; // edi@79 658 //AudioPlayer *pAudioPlayer2; // edi@79
659 AudioPlayer_3DSample *pAudioPlayer_3DSample3; // esi@79 659 AudioPlayer_3DSample *pAudioPlayer_3DSample3; // esi@79
660 unsigned int v39; // ebx@80 660 //unsigned int v39; // ebx@80
661 int v40; // eax@81 661 int v40; // eax@81
662 char *v41; // edi@82 662 char *v41; // edi@82
663 int v42; // esi@82 663 int v42; // esi@82
664 double v43; // st7@91 664 double v43; // st7@91
665 LayingItem *pLayingItem2; // eax@92 665 LayingItem *pLayingItem2; // eax@92
674 float v53; // ST0C_4@106 674 float v53; // ST0C_4@106
675 float v54; // ST04_4@106 675 float v54; // ST04_4@106
676 //AudioPlayer *pAudioPlayer3; // edx@106 676 //AudioPlayer *pAudioPlayer3; // edx@106
677 SoundDesc *pSoundDesc; // edx@107 677 SoundDesc *pSoundDesc; // edx@107
678 LayingItem *pLayingItem3; // eax@114 678 LayingItem *pLayingItem3; // eax@114
679 int v58; // edx@115 679 //int v58; // edx@115
680 int v59; // ecx@115 680 //int v59; // ecx@115
681 Actor *pActor2; // eax@118 681 //Actor *pActor2; // eax@118
682 MixerChannel *pMixerChannel; // esi@126 682 //MixerChannel *pMixerChannel; // esi@126
683 signed int v62; // esi@133 683 signed int v62; // esi@133
684 //AudioPlayer *pAudioPlayer4; // ebx@133 684 //AudioPlayer *pAudioPlayer4; // ebx@133
685 MixerChannel *pMixerChannel2; // edi@134 685 //MixerChannel *pMixerChannel2; // edi@134
686 int v65; // ebx@141 686 //int v65; // ebx@141
687 //AudioPlayer *pAudioPlayer5; // ecx@142 687 //AudioPlayer *pAudioPlayer5; // ecx@142
688 MixerChannel *pMixerChannel3; // edi@142 688 //MixerChannel *pMixerChannel3; // edi@142
689 int v68; // eax@143 689 int v68; // eax@143
690 MixerChannel *pMixerChannel4; // edi@149 690 //MixerChannel *pMixerChannel4; // edi@149
691 int v70; // ecx@152 691 //int v70; // ecx@152
692 SoundDesc *pSoundDesc2; // eax@153 692 //SoundDesc *pSoundDesc2; // eax@153
693 int v72; // edi@156 693 //int v72; // edi@156
694 MixerChannel *pMixerChannel5; // esi@157 694 //MixerChannel *pMixerChannel5; // esi@157
695 unsigned int pVolume; // eax@157 695 //unsigned int pVolume; // eax@157
696 int pPartyX; // ebx@159 696 //int pPartyX; // ebx@159
697 int v76; // ebx@160 697 //int v76; // ebx@160
698 LayingItem *pLayingItem4; // edi@164 698 //LayingItem *pLayingItem4; // edi@164
699 unsigned int pPosY; // edx@166 699 //unsigned int pPosY; // edx@166
700 unsigned int pPosX; // ecx@166 700 //unsigned int pPosX; // ecx@166
701 int v80; // eax@167 701 //int v80; // eax@167
702 Actor *pActor3; // edi@168 702 //Actor *pActor3; // edi@168
703 BLVDoor *pBLVDoor2; // edi@173 703 //BLVDoor *pBLVDoor2; // edi@173
704 int v83; // eax@183 704 //int v83; // eax@183
705 int v84; // eax@183 705 //int v84; // eax@183
706 _SAMPLE *v85; // ST18_4@186 706 //_SAMPLE *v85; // ST18_4@186
707 unsigned int v86; // [sp+14h] [bp-60h]@84 707 unsigned int v86; // [sp+14h] [bp-60h]@84
708 int v87; // [sp+14h] [bp-60h]@115 708 //int v87; // [sp+14h] [bp-60h]@115
709 RenderVertexSoft pRenderVertexSoft; // [sp+24h] [bp-50h]@1 709 RenderVertexSoft pRenderVertexSoft; // [sp+24h] [bp-50h]@1
710 unsigned int v89; // [sp+54h] [bp-20h]@12 710 //unsigned int v89; // [sp+54h] [bp-20h]@12
711 int v90; // [sp+58h] [bp-1Ch]@68 711 int v90; // [sp+58h] [bp-1Ch]@68
712 float v91; // [sp+5Ch] [bp-18h]@68 712 float v91; // [sp+5Ch] [bp-18h]@68
713 //unsigned int v92; // [sp+60h] [bp-14h]@10 713 //unsigned int v92; // [sp+60h] [bp-14h]@10
714 float v93; // [sp+64h] [bp-10h]@1 714 float v93; // [sp+64h] [bp-10h]@1
715 signed int varC; // [sp+68h] [bp-Ch]@68 715 signed int varC; // [sp+68h] [bp-Ch]@68
716 AudioPlayer *pAudioPlayer; // [sp+6Ch] [bp-8h]@1 716 //AudioPlayer *pAudioPlayer; // [sp+6Ch] [bp-8h]@1
717 int v96; // [sp+70h] [bp-4h]@19 717 int v96; // [sp+70h] [bp-4h]@19
718 signed int uNumRepeatsb; // [sp+84h] [bp+10h]@93 718 signed int uNumRepeatsb; // [sp+84h] [bp+10h]@93
719 float uNumRepeatsa; // [sp+84h] [bp+10h]@104 719 float uNumRepeatsa; // [sp+84h] [bp+10h]@104
720 float v99; // [sp+8Ch] [bp+18h]@104 720 float v99; // [sp+8Ch] [bp+18h]@104
721 signed int v100; // [sp+90h] [bp+1Ch]@32 721 signed int v100; // [sp+90h] [bp+1Ch]@32
722 int v101; // [sp+90h] [bp+1Ch]@52 722 int v101; // [sp+90h] [bp+1Ch]@52
723 int v102; // [sp+90h] [bp+1Ch]@60 723 int v102; // [sp+90h] [bp+1Ch]@60
724 int v103; // [sp+90h] [bp+1Ch]@68 724 int v103; // [sp+90h] [bp+1Ch]@68
725 725
726 pAudioPlayer = this; 726 if (!bPlayerReady)
727 v35 = this->bPlayerReady == 0; 727 return;
728 if (!uSoundVolumeMultiplier)
729 return;
730 if (!hDigDriver)
731 return;
732 if (eSoundID == SOUND_Invalid)
733 return;
734
728 //pAudioPlayer = this; 735 //pAudioPlayer = this;
729 pRenderVertexSoft.flt_2C = 0.0; 736 //v35 = this->bPlayerReady == 0;
730 LODWORD(v93) = 10000; 737 //pAudioPlayer = this;
731 if ( v35 || !uSoundVolumeMultiplier || !this->hDigDriver || !eSoundID ) 738 //LODWORD(v93) = 10000;
739 int sample_volume = 10000;
740
741
742 int sound_id = 0;
743 for (uint i = 0; i < pSoundList->uNumSounds; ++i)
744 if (pSoundList->pSounds[i].uSoundID == eSoundID)
745 {
746 sound_id = i;
747 break;
748 }
749
750 if (!sound_id)
751 {
752 Log::Warning(L"SoundID = %u not found", eSoundID);
732 return; 753 return;
733 pNum = 0; 754 }
734 if ( (signed int)pSoundList->uNumSounds <= 0 ) 755
735 { 756 int start_channel = 0,
736 LABEL_9: 757 end_channel = 0;
737 pNum = 0; 758
738 } 759 assert(sound_id < pSoundList->uNumSounds);
739 else 760 auto sound_desc = pSoundList->pSounds + sound_id;
740 { 761 if (!b3DSoundInitialized || sound_desc->Is3D())
741 pSoundID = (int *)&pSoundList->pSounds->uSoundID; 762 {
742 while ( *pSoundID != eSoundID ) 763 if (!a3) // generic sound like from UI
743 { 764 {
744 ++pNum; 765 start_channel = 10;
745 pSoundID += 30; 766 end_channel = 12;
746 if ( pNum >= (signed int)pSoundList->uNumSounds ) 767 goto LABEL_133;
747 goto LABEL_9; 768 }
748 } 769 else if (a3 == -1) // exclusive sounds - can override
749 } 770 {
750 /* v92 = pNum;//38 771 start_channel = 13;
751 pNum = 0; 772 end_channel = 13;
752 for ( pSoundID = (int *)&pSoundList->pSounds->uSoundID; *pSoundID != eSoundID; pSoundID += 30) 773 goto LABEL_133;
753 { 774 }
754 ++pNum; 775 else
755 }*/ 776 {
756 if ( !pNum ) 777 if (a3 < 0) // exclusive sounds - no override
757 return; 778 {
758 if ( !pAudioPlayer->b3DSoundInitialized || (v89 = 120 * pNum, !(pSoundList->pSounds[pNum].uFlags & 2)) ) 779 start_channel = 14;
759 { 780 end_channel = 14;
760 //pSoundDesc = (SoundDesc *)7; 781 goto LABEL_123;
761 if ( a3 < 0 ) 782 }
762 { 783 else
763 if ( a3 == -1 ) 784 {
764 { 785 int object_type = a3 & 7,
765 varC = 13; 786 object_id = a3 >> 7;
766 v96 = 13; 787 switch (object_type)
767 goto LABEL_133; 788 {
768 } 789 case OBJECT_BLVDoor:
769 varC = 14; 790 case OBJECT_Player:
770 v96 = 14; 791 {
792 start_channel = 10;
793 end_channel = 12;
794 goto LABEL_133;
795 }
796 break;
797
798 case OBJECT_Actor:
799 {
800 start_channel = 0;
801 end_channel = 3;
802
803 assert(object_id < uNumActors);
804 auto actor = &pActors[object_id];
805
806 sample_volume = GetSoundStrengthByDistanceFromParty(actor->vPosition.x, actor->vPosition.y, actor->vPosition.z);
807 if (!sample_volume)
808 return;
809 goto LABEL_123;
810 }
811
812 case OBJECT_Decoration:
813 {
814 start_channel = 4;
815 end_channel = 4;
816
817 assert(object_id < uNumLevelDecorations);
818 auto decor = &pLevelDecorations[object_id];
819
820 sample_volume = GetSoundStrengthByDistanceFromParty(decor->vPosition.x, decor->vPosition.y, decor->vPosition.z);
821 if (!sample_volume)
822 return;
823 goto LABEL_123;
824 }
825 break;
826
827 case OBJECT_Item:
828 {
829 start_channel = 5;
830 end_channel = 7;
831
832 assert(object_id < uNumLayingItems);
833 auto object = &pLayingItems[object_id];
834
835 sample_volume = GetSoundStrengthByDistanceFromParty(object->vPosition.x, object->vPosition.y, object->vPosition.z);
836 if (!sample_volume)
837 return;
838 goto LABEL_123;
839 }
840 break;
841
842 case OBJECT_BModel:
843 {
844 start_channel = 8;
845 end_channel = 9;
846 goto LABEL_123;
847 }
848 break;
849
850 default:
851 assert(false);
852 }
853 }
854 }
855
856
857
858
859
860
771 LABEL_123: 861 LABEL_123:
772 if ( a3 ) 862 for (uint i = 0; i < uMixerChannels; ++i)
773 { 863 {
774 if ( a3 != -1 ) 864 auto channel = pMixerChannels + i;
775 { 865 if (channel->source_pid == a3 &&
776 LODWORD(v91) = 0; 866 AIL_sample_status(channel->hSample) == AIL::Sample::Playing)
777 if ( pAudioPlayer->uMixerChannels > 0 ) 867 {
778 { 868 if (channel->uSourceTrackIdx == sound_id)
779 pMixerChannel = pAudioPlayer->pMixerChannels; 869 return; // already playing the same sound from the same source - return
780 do 870
781 { 871 AIL_end_sample(channel->hSample); // requested new sound from the same source - end & switch
782 if ( AIL_sample_status(pMixerChannel->hSample) == AIL::Sample::Playing && pMixerChannel->source_pid == a3 872 _4ABE55(channel);
783 && AIL_sample_status(pMixerChannel->hSample) == AIL::Sample::Playing) 873 }
784 { 874 }
785 if ( pMixerChannel->uSourceTrackIdx == pNum ) 875
786 return;
787 AIL_end_sample(pMixerChannel->hSample);
788 _4ABE55(pMixerChannel);
789 }
790 ++LODWORD(v91);
791 ++pMixerChannel;
792 }
793 while ( SLODWORD(v91) < pAudioPlayer->uMixerChannels );
794 }
795 }
796 }
797 LABEL_133: 876 LABEL_133:
798 v62 = varC; 877 v62 = start_channel;
799 //pAudioPlayer4 = pAudioPlayer; 878 //pAudioPlayer4 = pAudioPlayer;
800 if ( varC <= v96 ) 879 for (v62 = start_channel; v62 <= end_channel; ++v62)
801 { 880 {
802 pMixerChannel2 = &pAudioPlayer->pMixerChannels[varC]; 881 auto channel = pMixerChannels + v62;
882 if (AIL_sample_status(channel->hSample) == AIL::Sample::Done)
883 {
884 AIL_end_sample(channel->hSample);
885 if (channel->uSourceTrackIdx)
886 _4ABE55(channel);
887 break;
888 }
889 }
890 /*if ( start_channel <= end_channel)
891 {
892 pMixerChannel2 = &pAudioPlayer->pMixerChannels[start_channel];
803 while ( AIL_sample_status(pMixerChannel2->hSample) != AIL::Sample::Done) 893 while ( AIL_sample_status(pMixerChannel2->hSample) != AIL::Sample::Done)
804 { 894 {
805 ++v62; 895 ++v62;
806 ++pMixerChannel2; 896 ++pMixerChannel2;
807 if ( v62 > v96 ) 897 if ( v62 > end_channel )
808 goto LABEL_140; 898 goto LABEL_140;
809 } 899 }
810 AIL_end_sample(pMixerChannel2->hSample); 900 AIL_end_sample(pMixerChannel2->hSample);
811 if ( pMixerChannel2->uSourceTrackIdx ) 901 if ( pMixerChannel2->uSourceTrackIdx )
812 _4ABE55(pMixerChannel2); 902 _4ABE55(pMixerChannel2);
813 } 903 }
814 LABEL_140: 904 LABEL_140:*/
815 if ( v62 != v96 + 1 )//10!=13 905
816 { 906 if (v62 > end_channel) // no free channel - occupy the quitest one
817 LABEL_150: 907 {
818 if ( LODWORD(v93) == 10000 ) 908 v62 = -1;
819 LODWORD(v93) = pAudioPlayer->uMasterVolume; 909
820 v70 = 0; 910 int min_volume = sample_volume;
821 if ( !a7 ) 911 for (uint i = start_channel; i <= end_channel; ++i)
822 { 912 {
823 //pSoundDesc = pSoundList->pSounds; 913 auto channel = pMixerChannels + i;
824 pSoundDesc2 = &pSoundList->pSounds[pNum]; 914
825 if ( !pSoundDesc2->pSoundData[0] ) 915 int volume = AIL_sample_volume(channel->hSample);
916 if (volume < min_volume)
826 { 917 {
827 if (pSoundDesc2->eType == SOUND_DESC_SWAP) 918 min_volume = volume;
828 pSoundList->LoadSound(eSoundID, 0); 919 v62 = i;
829 } 920 }
830 } 921 }
831 v72 = 4 * (a7 + 30 * pNum) + 44; 922 /*v65 = start_channel;
832 if ( !*(int *)&pSoundList->pSounds->pSoundName[v72] ) 923 v91 = v93;
833 return; 924 if (start_channel <= end_channel)
834 pMixerChannel5 = &pAudioPlayer->pMixerChannels[v62];
835 AIL_init_sample(pMixerChannel5->hSample);
836 AIL_set_sample_file(pMixerChannel5->hSample, (void *)(*(int *)&pSoundList->pSounds->pSoundName[v72] + 4 * (a7 == 0)), -1);
837 pVolume = uVolume;
838 if ( !uVolume )
839 pVolume = LODWORD(v93);
840 AIL_set_sample_volume(pMixerChannel5->hSample, pVolume);
841 pPartyX = PartyX;
842 if ( PartyX != -1 )
843 {
844 if ( !PartyX )
845 pPartyX = pParty->vPosition.x;
846 if ( !PartyY )
847 PartyY = pParty->vPosition.y;
848 if ( uNumRepeats )
849 AIL_set_sample_loop_count(pMixerChannel5->hSample, uNumRepeats - 1);
850 v83 = sub_4AB66C(pPartyX, PartyY);
851 AIL_set_sample_pan(pMixerChannel5->hSample, v83);
852 v84 = GetSoundStrengthByDistanceFromParty(pPartyX, PartyY, pParty->vPosition.z);
853 AIL_set_sample_volume(pMixerChannel5->hSample, v84);
854 v76 = a3;
855 goto LABEL_184;
856 }
857 v76 = a3;
858 if ( (a3 & 7) == 1 )
859 {
860 if ( uCurrentlyLoadedLevelType != LEVEL_Indoor )
861 goto LABEL_184;
862 pBLVDoor2 = &pIndoor->pDoors[a3 >> 3];
863 if ( !pBLVDoor2->uDoorID )
864 return;
865 if ( !GetSoundStrengthByDistanceFromParty(*pBLVDoor2->pXOffsets, *pBLVDoor2->pYOffsets, *pBLVDoor2->pZOffsets) )
866 {
867 AIL_end_sample(pMixerChannel5->hSample);
868 pAudioPlayer->AudioPlayer::_4ABE55(pMixerChannel5);
869 return;
870 }
871 pPosY = *pBLVDoor2->pYOffsets;
872 pPosX = *pBLVDoor2->pXOffsets;
873 //goto LABEL_167;
874 v80 = sub_4AB66C(pPosX, pPosY);
875 AIL_set_sample_pan(pMixerChannel5->hSample, v80);
876 goto LABEL_184;
877 }
878 if ( (a3 & 7) == 2 )
879 {
880 pLayingItem4 = &pLayingItems[a3 >> 3];
881 if ( !GetSoundStrengthByDistanceFromParty(pLayingItem4->vPosition.x, pLayingItem4->vPosition.y, pLayingItem4->vPosition.z) )
882 return;
883 }
884 else
885 {
886 if ( (a3 & 7) == 3 )
887 {
888 pActor3 = &pActors[a3 >> 3];
889 if ( !GetSoundStrengthByDistanceFromParty(pActor3->vPosition.x, pActor3->vPosition.y, pActor3->vPosition.z) )
890 return;
891 pPosY = pActor3->vPosition.y;
892 pPosX = pActor3->vPosition.x;
893 //goto LABEL_167;
894 v80 = sub_4AB66C(pPosX, pPosY);
895 AIL_set_sample_pan(pMixerChannel5->hSample, v80);
896 goto LABEL_184;
897 }
898 if ( (a3 & 7) != 5 )
899 {
900 LABEL_184:
901 if ( uNumRepeats )
902 AIL_set_sample_loop_count(pMixerChannel5->hSample, uNumRepeats - 1);
903 v85 = pMixerChannel5->hSample;
904 pMixerChannel5->uSourceTrackIdx = pNum;
905 pMixerChannel5->source_pid = v76;
906 pMixerChannel5->uSourceTrackID = eSoundID;
907 AIL_start_sample(v85);
908 if ( sPlaybackRate )
909 AIL_set_sample_playback_rate(pMixerChannel5->hSample, sPlaybackRate);
910 if ( (v76 & 7) == 4 )
911 AIL_sample_ms_position(pMixerChannel5->hSample, &sLastTrackLengthMS, 0);
912 return;
913 }
914 pLayingItem4 = (LayingItem *)&pLevelDecorations[a3 >> 3];
915 if ( !GetSoundStrengthByDistanceFromParty(pLayingItem4->vPosition.x, pLayingItem4->vPosition.y, pLayingItem4->vPosition.z) )
916 return;
917 AIL_set_sample_loop_count(pMixerChannel5->hSample, uNumRepeats - 1);
918 }
919 pPosY = pLayingItem4->vPosition.y;
920 pPosX = pLayingItem4->vPosition.x;
921 //LABEL_167:
922 v80 = sub_4AB66C(pPosX, pPosY);
923 AIL_set_sample_pan(pMixerChannel5->hSample, v80);
924 goto LABEL_184;
925 }
926 v65 = varC;
927 v62 = -1;
928 v91 = v93;
929 if ( varC <= v96 )
930 { 925 {
931 //pAudioPlayer5 = pAudioPlayer; 926 //pAudioPlayer5 = pAudioPlayer;
932 pMixerChannel3 = &pAudioPlayer->pMixerChannels[varC]; 927 pMixerChannel3 = &pAudioPlayer->pMixerChannels[start_channel];
933 do 928 do
934 { 929 {
935 v68 = AIL_sample_volume(pMixerChannel3->hSample); 930 v68 = AIL_sample_volume(pMixerChannel3->hSample);
936 if ( v68 < SLODWORD(v91) ) 931 if ( v68 < SLODWORD(v91) )
937 { 932 {
939 v62 = v65; 934 v62 = v65;
940 } 935 }
941 ++v65; 936 ++v65;
942 ++pMixerChannel3; 937 ++pMixerChannel3;
943 } 938 }
944 while ( v65 <= v96 ); 939 while ( v65 <= end_channel );*/
945 if ( v62 != -1 ) 940
946 { 941 if (v62 == -1) // no free channels at all - only channel 13 allows override (a3 == -1)
947 //LABEL_149: 942 {
948 //pAudioPlayer4 = pAudioPlayer; 943 if (start_channel != 13)
949 pMixerChannel4 = &pAudioPlayer->pMixerChannels[v62]; 944 return;
950 AIL_end_sample(pMixerChannel4->hSample); 945 v62 = 13;
951 _4ABE55(pMixerChannel4); 946 }
952 goto LABEL_150; 947
953 } 948 auto channel = &pMixerChannels[v62];
954 v65 = varC; 949 AIL_end_sample(channel->hSample);
955 } 950 _4ABE55(channel);
956 v62 = 13; 951 }
957 if ( v65 != 13 ) 952
953 if (v62 > end_channel)//10!=13
958 return; 954 return;
959 //goto LABEL_149; 955
960 //pAudioPlayer4 = pAudioPlayer; 956 //LABEL_150:
961 pMixerChannel4 = &pAudioPlayer->pMixerChannels[v62]; 957 if (sample_volume == 10000)
962 AIL_end_sample(pMixerChannel4->hSample); 958 sample_volume = uMasterVolume;
963 _4ABE55(pMixerChannel4); 959
964 goto LABEL_150; 960 //v70 = 0;
965 } 961 if ( !a7 )
966 if ( (a3 & 7) == 2 ) 962 {
967 { 963 //pSoundDesc = pSoundList->pSounds;
968 varC = 5; 964 //pSoundDesc2 = &pSoundList->pSounds[sound_id];
969 v96 = 7; 965 if (!sound_desc->pSoundData[0])
970 pLayingItem3 = &pLayingItems[a3 >> 3]; 966 {
971 } 967 if (sound_desc->eType == SOUND_DESC_SWAP)
972 else 968 pSoundList->LoadSound(eSoundID, 0);
973 { 969 }
974 if ( (a3 & 7) == 3 ) 970 }
975 { 971 //v72 = 4 * (a7 + 30 * sound_id) + 44;
976 *(float *)&varC = 0.0; 972 if (!pSoundList->pSounds[sound_id].pSoundData[a7])
977 pActor2 = &pActors[a3 >> 3]; 973 return;
978 v96 = 3; 974
979 v58 = pActor2->vPosition.y; 975 //pMixerChannel5 = &pAudioPlayer->pMixerChannels[v62];
980 v87 = pActor2->vPosition.z; 976 auto channel = &pMixerChannels[v62];
981 v59 = pActor2->vPosition.x; 977 AIL_init_sample(channel->hSample);
982 LABEL_116: 978 AIL_set_sample_file(channel->hSample, (char *)pSoundList->pSounds[sound_id].pSoundData[a7] + 4 * (a7 == 0), -1);
983 LODWORD(v93) = GetSoundStrengthByDistanceFromParty(v59, /*(int)pSoundDesc*/ v58, v87); 979 if (uVolume)
984 if ( v93 == 0.0 ) 980 sample_volume = uVolume;
981 AIL_set_sample_volume(channel->hSample, sample_volume);
982
983 int object_type = a3 & 7,
984 object_id = a3 >> 7;
985 if (PartyX != -1)
986 {
987 if (!PartyX) PartyX = pParty->vPosition.x;
988 if (!PartyY) PartyY = pParty->vPosition.y;
989 AIL_set_sample_pan(channel->hSample, sub_4AB66C(PartyX, PartyY));
990 AIL_set_sample_volume(channel->hSample, GetSoundStrengthByDistanceFromParty(PartyX, PartyY, pParty->vPosition.z));
991 }
992 else if (object_type == OBJECT_BLVDoor)
993 {
994 assert(uCurrentlyLoadedLevelType == LEVEL_Indoor);
995
996 assert(object_id < pIndoor->uNumDoors);
997 auto door = &pIndoor->pDoors[object_id];
998 if (!door->uDoorID)
985 return; 999 return;
986 goto LABEL_123; 1000
987 } 1001 if (!GetSoundStrengthByDistanceFromParty(door->pXOffsets[0], door->pYOffsets[0], door->pZOffsets[0]))
988 if ( (a3 & 7) != 5 ) 1002 {
989 { 1003 AIL_end_sample(channel->hSample);
990 if ( (a3 & 7) == 6 ) 1004 _4ABE55(channel);
991 { 1005 return;
992 varC = 8; 1006 }
993 v96 = 9; 1007 AIL_set_sample_pan(channel->hSample, sub_4AB66C(door->pXOffsets[0], door->pYOffsets[0]));
994 } 1008 }
995 else 1009 else if (object_type == OBJECT_Item)
996 { 1010 {
997 varC = 10; 1011 assert(object_id < uNumLayingItems);
998 v96 = 12; 1012 auto object = &pLayingItems[object_id];
999 } 1013 if (!GetSoundStrengthByDistanceFromParty(object->vPosition.x, object->vPosition.y, object->vPosition.z) )
1000 goto LABEL_123; 1014 return;
1001 } 1015 AIL_set_sample_pan(channel->hSample, sub_4AB66C(object->vPosition.x, object->vPosition.y));
1002 varC = 4; 1016 }
1003 v96 = 4; 1017 else if (object_type == OBJECT_Actor)
1004 pLayingItem3 = (LayingItem *)&pLevelDecorations[a3 >> 3]; 1018 {
1005 } 1019 assert(object_id < uNumActors);
1006 v87 = pLayingItem3->vPosition.z; 1020 auto actor = &pActors[object_id];
1007 v58 = pLayingItem3->vPosition.y; 1021 if (!GetSoundStrengthByDistanceFromParty(actor->vPosition.x, actor->vPosition.y, actor->vPosition.z))
1008 v59 = pLayingItem3->vPosition.x; 1022 return;
1009 goto LABEL_116; 1023 AIL_set_sample_pan(channel->hSample, sub_4AB66C(actor->vPosition.x, actor->vPosition.y));
1010 } 1024 }
1025 else if (object_type == OBJECT_Decoration)
1026 {
1027 assert(object_id < uNumLevelDecorations);
1028 auto decor = &pLevelDecorations[object_id];
1029 if (!GetSoundStrengthByDistanceFromParty(decor->vPosition.x, decor->vPosition.y, decor->vPosition.z))
1030 return;
1031 AIL_set_sample_pan(channel->hSample, sub_4AB66C(decor->vPosition.x, decor->vPosition.y));
1032 }
1033
1034 //LABEL_184:
1035 if (uNumRepeats)
1036 AIL_set_sample_loop_count(channel->hSample, uNumRepeats - 1);
1037 channel->uSourceTrackIdx = sound_id;
1038 channel->source_pid = a3;
1039 channel->uSourceTrackID = eSoundID;
1040 int rval = AIL_start_sample(channel->hSample);
1041 if ( sPlaybackRate )
1042 AIL_set_sample_playback_rate(channel->hSample, sPlaybackRate);
1043 if (object_type == OBJECT_Player)
1044 AIL_sample_ms_position(channel->hSample, &sLastTrackLengthMS, 0);
1045 return;
1046 }
1047
1048
1049
1050
1051 __debugbreak(); // 3d sound stuff, refactor
1011 v12 = 13; 1052 v12 = 13;
1012 if ( a3 < 0 ) 1053 if ( a3 < 0 )
1013 { 1054 {
1014 v15 = pAudioPlayer->uNum3DSamples; 1055 v15 = pAudioPlayer->uNum3DSamples;
1015 if ( a3 == -1 ) 1056 if ( a3 == -1 )
1141 do 1182 do
1142 { 1183 {
1143 if ( AIL_3D_sample_status(pAudioPlayer_3DSample->hSample) == 4 1184 if ( AIL_3D_sample_status(pAudioPlayer_3DSample->hSample) == 4
1144 && pAudioPlayer_3DSample->field_4 == a3 && AIL_3D_sample_status(pAudioPlayer_3DSample->hSample) == 4 ) 1185 && pAudioPlayer_3DSample->field_4 == a3 && AIL_3D_sample_status(pAudioPlayer_3DSample->hSample) == 4 )
1145 { 1186 {
1146 if ( pAudioPlayer_3DSample->field_8 == pNum ) 1187 if ( pAudioPlayer_3DSample->field_8 == sound_id )
1147 return; 1188 return;
1148 AIL_end_3D_sample(pAudioPlayer_3DSample->hSample); 1189 AIL_end_3D_sample(pAudioPlayer_3DSample->hSample);
1149 pAudioPlayer->_4ABF23(pAudioPlayer_3DSample); 1190 pAudioPlayer->_4ABF23(pAudioPlayer_3DSample);
1150 } 1191 }
1151 ++v101; 1192 ++v101;
1225 pAudioPlayer_3DSample3 = &pAudioPlayer->p3DSamples[v36]; 1266 pAudioPlayer_3DSample3 = &pAudioPlayer->p3DSamples[v36];
1226 AIL_end_3D_sample(pAudioPlayer_3DSample3->hSample); 1267 AIL_end_3D_sample(pAudioPlayer_3DSample3->hSample);
1227 pAudioPlayer->_4ABF23(pAudioPlayer_3DSample3); 1268 pAudioPlayer->_4ABF23(pAudioPlayer_3DSample3);
1228 v102 = v36; 1269 v102 = v36;
1229 } 1270 }
1230 v39 = v89; 1271 //v39 = v89;
1231 if ( pSoundList->pSounds[v89 / 0x78].p3DSound || (LOWORD(v40) = pSoundList->LoadSound(eSoundID, 0), v40) ) 1272 if ( pSoundList->pSounds[sound_id].p3DSound || (LOWORD(v40) = pSoundList->LoadSound(eSoundID, 0), v40) )
1232 { 1273 {
1233 v41 = (char *)pAudioPlayer + 16 * v102; 1274 v41 = (char *)pAudioPlayer + 16 * v102;
1234 v42 = (int)(v41 + 20); 1275 v42 = (int)(v41 + 20);
1235 if ( AIL_set_3D_sample_file(*((int *)v41 + 5), *(void **)((char *)&pSoundList->pSounds->p3DSound + v39)) ) 1276 if ( AIL_set_3D_sample_file(*((int *)v41 + 5), *(void **)((char *)&pSoundList->pSounds->p3DSound + sound_id * sizeof(SoundDesc))) )
1236 { 1277 {
1237 if ( uNumRepeats ) 1278 if ( uNumRepeats )
1238 v86 = uNumRepeats - 1; 1279 v86 = uNumRepeats - 1;
1239 else 1280 else
1240 v86 = 1; 1281 v86 = 1;
1279 v53 = -uNumRepeatsa; 1320 v53 = -uNumRepeatsa;
1280 v54 = -v99; 1321 v54 = -v99;
1281 AIL_set_3D_orientation((void *)*(int *)v42, LODWORD(v54), 0.0, LODWORD(v53), 0.0, 1.0, 0.0); 1322 AIL_set_3D_orientation((void *)*(int *)v42, LODWORD(v54), 0.0, LODWORD(v53), 0.0, 1.0, 0.0);
1282 //pAudioPlayer3 = pAudioPlayer; 1323 //pAudioPlayer3 = pAudioPlayer;
1283 *((int *)v41 + 6) = a3; 1324 *((int *)v41 + 6) = a3;
1284 *((int *)v41 + 7) = pNum; 1325 *((int *)v41 + 7) = sound_id;
1285 *(&pAudioPlayer->bEAXSupported + 4 * (v102 + 2)) = eSoundID; 1326 *(&pAudioPlayer->bEAXSupported + 4 * (v102 + 2)) = eSoundID;
1286 } 1327 }
1287 else 1328 else
1288 { 1329 {
1289 AIL_end_3D_sample(*(int **)v42); 1330 AIL_end_3D_sample(*(int **)v42);
1576 LABEL_37: 1617 LABEL_37:
1577 for (uint i = 0; i < uMixerChannels; ++i) 1618 for (uint i = 0; i < uMixerChannels; ++i)
1578 { 1619 {
1579 auto channel = pMixerChannels + i; 1620 auto channel = pMixerChannels + i;
1580 1621
1581 AIL_end_sample(channel->hSample); 1622 if (AIL_sample_status(channel->hSample) == AIL::Sample::Done)
1582 _4ABE55(channel); 1623 {
1624 AIL_end_sample(channel->hSample);
1625 _4ABE55(channel);
1626 }
1583 } 1627 }
1584 1628
1585 for (uint i = 0; i < uMixerChannels; ++i) 1629 for (uint i = 0; i < uMixerChannels; ++i)
1586 { 1630 {
1587 auto channel = pMixerChannels + i; 1631 auto channel = pMixerChannels + i;
1632 if (channel->source_pid <= 0)
1633 continue;
1634
1588 int source_type = channel->source_pid & 7, 1635 int source_type = channel->source_pid & 7,
1589 source_id = channel->source_pid >> 3; 1636 source_id = channel->source_pid >> 3;
1590 int source_x, 1637 int source_x,
1591 source_y, 1638 source_y,
1592 source_z; 1639 source_z;
2175 int v15; // [sp+4Ch] [bp-8h]@5 2222 int v15; // [sp+4Ch] [bp-8h]@5
2176 int v16; // [sp+50h] [bp-4h]@5 2223 int v16; // [sp+50h] [bp-4h]@5
2177 2224
2178 v2 = 0; 2225 v2 = 0;
2179 //v3 = this; 2226 //v3 = this;
2180 if ( pSoundList->pSounds ) 2227 if (!pSoundList->pSounds)
2181 { 2228 return;
2229
2182 v4 = &pSoundList->pSounds[pChannel->uSourceTrackIdx]; 2230 v4 = &pSoundList->pSounds[pChannel->uSourceTrackIdx];
2183 if ( v4->eType == SOUND_DESC_SWAP) 2231 if ( v4->eType == SOUND_DESC_SWAP)
2184 { 2232 {
2185 if ( v4->pSoundData[0] && !(v4->uFlags & 1) ) 2233 if ( v4->pSoundData[0] && !(v4->uFlags & 1) )
2186 { 2234 {
2225 while ( v6 ^ v13 ); 2273 while ( v6 ^ v13 );
2226 } 2274 }
2227 } 2275 }
2228 } 2276 }
2229 } 2277 }
2230 }
2231 } 2278 }
2232 2279
2233 2280
2234 2281
2235 //----- (004AAEA6) -------------------------------------------------------- 2282 //----- (004AAEA6) --------------------------------------------------------