Merge lp:~vrince/mixxx/waveform-2.0_pure-gl into lp:~mixxxdevelopers/mixxx/trunk

Proposed by Thomas Vincent
Status: Merged
Merged at revision: 3167
Proposed branch: lp:~vrince/mixxx/waveform-2.0_pure-gl
Merge into: lp:~mixxxdevelopers/mixxx/trunk
Diff against target: 3454 lines (+1509/-1139)
39 files modified
mixxx/build/depends.py (+12/-3)
mixxx/res/skins/Deere1280x800-WXGA/skin.xml (+10/-448)
mixxx/src/engine/cuecontrol.cpp (+0/-2)
mixxx/src/engine/cuecontrol.h (+2/-0)
mixxx/src/skin/legacyskinparser.cpp (+2/-3)
mixxx/src/waveform/renderers/glslwaveformrenderersignal.cpp (+21/-7)
mixxx/src/waveform/renderers/glslwaveformrenderersignal.h (+4/-8)
mixxx/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp (+177/-324)
mixxx/src/waveform/renderers/glwaveformrendererfilteredsignal.h (+4/-34)
mixxx/src/waveform/renderers/glwaveformrenderersimplesignal.cpp (+120/-185)
mixxx/src/waveform/renderers/glwaveformrenderersimplesignal.h (+4/-21)
mixxx/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp (+346/-0)
mixxx/src/waveform/renderers/qtwaveformrendererfilteredsignal.h (+36/-0)
mixxx/src/waveform/renderers/qtwaveformrenderersimplesignal.cpp (+223/-0)
mixxx/src/waveform/renderers/qtwaveformrenderersimplesignal.h (+31/-0)
mixxx/src/waveform/renderers/waveformmark.cpp (+0/-4)
mixxx/src/waveform/renderers/waveformrendererendoftrack.cpp (+4/-0)
mixxx/src/waveform/renderers/waveformrendererfilteredsignal.cpp (+107/-34)
mixxx/src/waveform/renderers/waveformrendererfilteredsignal.h (+7/-12)
mixxx/src/waveform/renderers/waveformrenderersignalbase.cpp (+83/-0)
mixxx/src/waveform/renderers/waveformrenderersignalbase.h (+38/-0)
mixxx/src/waveform/renderers/waveformrendermark.cpp (+43/-5)
mixxx/src/waveform/renderers/waveformrendermark.h (+1/-0)
mixxx/src/waveform/renderers/waveformwidgetrenderer.cpp (+9/-3)
mixxx/src/waveform/renderers/waveformwidgetrenderer.h (+1/-1)
mixxx/src/waveform/waveformwidgetfactory.cpp (+31/-23)
mixxx/src/waveform/widgets/glsimplewaveformwidget.cpp (+2/-6)
mixxx/src/waveform/widgets/glsimplewaveformwidget.h (+0/-3)
mixxx/src/waveform/widgets/glslwaveformwidget.cpp (+4/-4)
mixxx/src/waveform/widgets/glslwaveformwidget.h (+1/-1)
mixxx/src/waveform/widgets/glwaveformwidget.cpp (+3/-2)
mixxx/src/waveform/widgets/qtsimplewaveformwidget.cpp (+57/-0)
mixxx/src/waveform/widgets/qtsimplewaveformwidget.h (+30/-0)
mixxx/src/waveform/widgets/qtwaveformwidget.cpp (+56/-0)
mixxx/src/waveform/widgets/qtwaveformwidget.h (+30/-0)
mixxx/src/waveform/widgets/softwarewaveformwidget.cpp (+3/-2)
mixxx/src/waveform/widgets/softwarewaveformwidget.h (+1/-1)
mixxx/src/waveform/widgets/waveformwidgettype.h (+3/-1)
mixxx/src/widget/wwaveformviewer.cpp (+3/-2)
To merge this branch: bzr merge lp:~vrince/mixxx/waveform-2.0_pure-gl
Reviewer Review Type Date Requested Status
RJ Skerry-Ryan Pending
Review via email: mp+105570@code.launchpad.net

Description of the change

Add pure OpenGL line-based waveform to get back 1.10 rendering performances and try to make 1.11 usable.
Fix end of track for track not long enougth.

To post a comment you must log in.
Revision history for this message
Albert Santoni (gamegod) wrote :

Hey Thomas,

Have you considered using display lists or VBOs for the waveform
instead of immediate mode? I expect that would give you a fairly
significant drop in CPU usage. (Maybe you're already using VBOs for
the GLSL code?)

Thanks,
Albert

Revision history for this message
Thomas Vincent (vrince) wrote :

In GLSL version I don't even need VBO, waveform data is stored in a
texture. But we can switch to VBO.
For the pure-gl version I wanted to make a version that work for any
configure even old ones (Opengl < 1.5).
But of course we can test if ARB_vertex_buffer_object is available and
send data in a continuous chunk.
Should be faster and CPU depend should decrease.
Tom

2012/5/13 Albert Santoni <email address hidden>:
> Hey Thomas,
>
> Have you considered using display lists or VBOs for the waveform
> instead of immediate mode? I expect that would give you a fairly
> significant drop in CPU usage. (Maybe you're already using VBOs for
> the GLSL code?)
>
> Thanks,
> Albert
>
> --
> https://code.launchpad.net/~vrince/mixxx/waveform-2.0_pure-gl/+merge/105570
> You are the owner of lp:~vrince/mixxx/waveform-2.0_pure-gl.

2787. By Thomas Vincent

Add central waveform axe (and 'AxesColor' in skin) in all waveform renderer. Line is display under the signal.
Use 'AxesColor' to draw vertical line too.

2788. By Thomas Vincent

Some comments

2789. By Thomas Vincent

Waveform interactive zoom in accessible everywhere in the waveform viewer

2790. By Thomas Vincent

Add DefaulMark support (see example in <visual> of Deere1280x800 skin)
Add protection again multiple declaration of hotcue in skin

2791. By Thomas Vincent

Change defaul zoom to 3 (33%)
Fix zoom propagation of wavfeom type change

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'mixxx/build/depends.py'
--- mixxx/build/depends.py 2012-05-14 20:47:43 +0000
+++ mixxx/build/depends.py 2012-05-17 02:22:20 +0000
@@ -521,20 +521,29 @@
521 "waveform/renderers/waveformrenderbeat.cpp",521 "waveform/renderers/waveformrenderbeat.cpp",
522 "waveform/renderers/waveformrendererendoftrack.cpp",522 "waveform/renderers/waveformrendererendoftrack.cpp",
523 "waveform/renderers/waveformrendererpreroll.cpp",523 "waveform/renderers/waveformrendererpreroll.cpp",
524
524 "waveform/renderers/waveformrendererfilteredsignal.cpp",525 "waveform/renderers/waveformrendererfilteredsignal.cpp",
526 "waveform/renderers/qtwaveformrendererfilteredsignal.cpp",
527 "waveform/renderers/qtwaveformrenderersimplesignal.cpp",
525 "waveform/renderers/glwaveformrendererfilteredsignal.cpp",528 "waveform/renderers/glwaveformrendererfilteredsignal.cpp",
529 "waveform/renderers/glwaveformrenderersimplesignal.cpp",
526 "waveform/renderers/glslwaveformrenderersignal.cpp",530 "waveform/renderers/glslwaveformrenderersignal.cpp",
531
527 "waveform/renderers/waveformsignalcolors.cpp",532 "waveform/renderers/waveformsignalcolors.cpp",
528 "waveform/renderers/glwaveformrenderersimplesignal.cpp",533
534 "waveform/renderers/waveformrenderersignalbase.cpp",
529 "waveform/renderers/waveformmark.cpp",535 "waveform/renderers/waveformmark.cpp",
530 "waveform/renderers/waveformmarkrange.cpp",536 "waveform/renderers/waveformmarkrange.cpp",
531537
532 "waveform/widgets/waveformwidgetabstract.cpp",538 "waveform/widgets/waveformwidgetabstract.cpp",
533 "waveform/widgets/glwaveformwidget.cpp",
534 "waveform/widgets/emptywaveformwidget.cpp",539 "waveform/widgets/emptywaveformwidget.cpp",
535 "waveform/widgets/softwarewaveformwidget.cpp",540 "waveform/widgets/softwarewaveformwidget.cpp",
541 "waveform/widgets/qtwaveformwidget.cpp",
542 "waveform/widgets/qtsimplewaveformwidget.cpp",
543 "waveform/widgets/glwaveformwidget.cpp",
544 "waveform/widgets/glsimplewaveformwidget.cpp",
545
536 "waveform/widgets/glslwaveformwidget.cpp",546 "waveform/widgets/glslwaveformwidget.cpp",
537 "waveform/widgets/glsimplewaveformwidget.cpp",
538547
539 "skin/imginvert.cpp",548 "skin/imginvert.cpp",
540 "skin/imgloader.cpp",549 "skin/imgloader.cpp",
541550
=== modified file 'mixxx/res/skins/Deere1280x800-WXGA/skin.xml'
--- mixxx/res/skins/Deere1280x800-WXGA/skin.xml 2012-05-08 07:21:23 +0000
+++ mixxx/res/skins/Deere1280x800-WXGA/skin.xml 2012-05-17 02:22:20 +0000
@@ -3668,6 +3668,11 @@
3668 represented by a button in the current skin. Mixxx 1.8.x-1.9.0 support up to 32 hotcues. v1.9.1+ supports up to 36.3668 represented by a button in the current skin. Mixxx 1.8.x-1.9.0 support up to 32 hotcues. v1.9.1+ supports up to 36.
3669 Current skins uses up to 6 buttons per channel.3669 Current skins uses up to 6 buttons per channel.
3670 -->3670 -->
3671 <DefaultMark>
3672 <Align>center</Align>
3673 <Color>#AE5CFF</Color>
3674 <TextColor>#FFFFFF</TextColor>
3675 </DefaultMark>
3671 <Mark>3676 <Mark>
3672 <Control>hotcue_1_position</Control>3677 <Control>hotcue_1_position</Control>
3673 <Pixmap>marker_hotcue1_1.png</Pixmap>3678 <Pixmap>marker_hotcue1_1.png</Pixmap>
@@ -3701,230 +3706,6 @@
3701 <TextColor>#FFFFFF</TextColor>3706 <TextColor>#FFFFFF</TextColor>
3702 </Mark>3707 </Mark>
3703 <Mark>3708 <Mark>
3704 <Control>hotcue_5_position</Control>
3705 <Text> HOTCUE 5 </Text>
3706 <Align>center</Align>
3707 <Color>#AE5CFF</Color>
3708 <TextColor>#FFFFFF</TextColor>
3709 </Mark>
3710 <Mark>
3711 <Control>hotcue_6_position</Control>
3712 <Text> HOTCUE 6 </Text>
3713 <Align>center</Align>
3714 <Color>#AE5CFF</Color>
3715 <TextColor>#FFFFFF</TextColor>
3716 </Mark>
3717 <Mark>
3718 <Control>hotcue_7_position</Control>
3719 <Text> HOTCUE 7 </Text>
3720 <Align>center</Align>
3721 <Color>#AE5CFF</Color>
3722 <TextColor>#FFFFFF</TextColor>
3723 </Mark>
3724 <Mark>
3725 <Control>hotcue_8_position</Control>
3726 <Text> HOTCUE 8 </Text>
3727 <Align>center</Align>
3728 <Color>#AE5CFF</Color>
3729 <TextColor>#FFFFFF</TextColor>
3730 </Mark>
3731 <Mark>
3732 <Control>hotcue_9_position</Control>
3733 <Text> HOTCUE 9 </Text>
3734 <Align>center</Align>
3735 <Color>#AE5CFF</Color>
3736 <TextColor>#FFFFFF</TextColor>
3737 </Mark>
3738 <Mark>
3739 <Control>hotcue_10_position</Control>
3740 <Text> HOTCUE 10 </Text>
3741 <Align>center</Align>
3742 <Color>#AE5CFF</Color>
3743 <TextColor>#FFFFFF</TextColor>
3744 </Mark>
3745 <Mark>
3746 <Control>hotcue_11_position</Control>
3747 <Text> HOTCUE 11 </Text>
3748 <Align>center</Align>
3749 <Color>#AE5CFF</Color>
3750 <TextColor>#FFFFFF</TextColor>
3751 </Mark>
3752 <Mark>
3753 <Control>hotcue_12_position</Control>
3754 <Text> HOTCUE 12 </Text>
3755 <Align>center</Align>
3756 <Color>#AE5CFF</Color>
3757 <TextColor>#FFFFFF</TextColor>
3758 </Mark>
3759 <Mark>
3760 <Control>hotcue_13_position</Control>
3761 <Text> HOTCUE 13 </Text>
3762 <Align>center</Align>
3763 <Color>#AE5CFF</Color>
3764 <TextColor>#FFFFFF</TextColor>
3765 </Mark>
3766 <Mark>
3767 <Control>hotcue_14_position</Control>
3768 <Text> HOTCUE 14 </Text>
3769 <Align>center</Align>
3770 <Color>#AE5CFF</Color>
3771 <TextColor>#FFFFFF</TextColor>
3772 </Mark>
3773 <Mark>
3774 <Control>hotcue_15_position</Control>
3775 <Text> HOTCUE 15 </Text>
3776 <Align>center</Align>
3777 <Color>#AE5CFF</Color>
3778 <TextColor>#FFFFFF</TextColor>
3779 </Mark>
3780 <Mark>
3781 <Control>hotcue_16_position</Control>
3782 <Text> HOTCUE 16 </Text>
3783 <Align>center</Align>
3784 <Color>#AE5CFF</Color>
3785 <TextColor>#FFFFFF</TextColor>
3786 </Mark>
3787 <Mark>
3788 <Control>hotcue_17_position</Control>
3789 <Text> HOTCUE 17 </Text>
3790 <Align>center</Align>
3791 <Color>#AE5CFF</Color>
3792 <TextColor>#FFFFFF</TextColor>
3793 </Mark>
3794 <Mark>
3795 <Control>hotcue_18_position</Control>
3796 <Text> HOTCUE 18 </Text>
3797 <Align>center</Align>
3798 <Color>#AE5CFF</Color>
3799 <TextColor>#FFFFFF</TextColor>
3800 </Mark>
3801 <Mark>
3802 <Control>hotcue_19_position</Control>
3803 <Text> HOTCUE 19 </Text>
3804 <Align>center</Align>
3805 <Color>#AE5CFF</Color>
3806 <TextColor>#FFFFFF</TextColor>
3807 </Mark>
3808 <Mark>
3809 <Control>hotcue_20_position</Control>
3810 <Text> HOTCUE 20 </Text>
3811 <Align>center</Align>
3812 <Color>#AE5CFF</Color>
3813 <TextColor>#FFFFFF</TextColor>
3814 </Mark>
3815 <Mark>
3816 <Control>hotcue_21_position</Control>
3817 <Text> HOTCUE 21 </Text>
3818 <Align>center</Align>
3819 <Color>#AE5CFF</Color>
3820 <TextColor>#FFFFFF</TextColor>
3821 </Mark>
3822 <Mark>
3823 <Control>hotcue_22_position</Control>
3824 <Text> HOTCUE 22 </Text>
3825 <Align>center</Align>
3826 <Color>#AE5CFF</Color>
3827 <TextColor>#FFFFFF</TextColor>
3828 </Mark>
3829 <Mark>
3830 <Control>hotcue_23_position</Control>
3831 <Text> HOTCUE 23 </Text>
3832 <Align>center</Align>
3833 <Color>#AE5CFF</Color>
3834 <TextColor>#FFFFFF</TextColor>
3835 </Mark>
3836 <Mark>
3837 <Control>hotcue_24_position</Control>
3838 <Text> HOTCUE 24 </Text>
3839 <Align>center</Align>
3840 <Color>#AE5CFF</Color>
3841 <TextColor>#FFFFFF</TextColor>
3842 </Mark>
3843 <Mark>
3844 <Control>hotcue_25_position</Control>
3845 <Text> HOTCUE 25 </Text>
3846 <Align>center</Align>
3847 <Color>#AE5CFF</Color>
3848 <TextColor>#FFFFFF</TextColor>
3849 </Mark>
3850 <Mark>
3851 <Control>hotcue_26_position</Control>
3852 <Text> HOTCUE 26 </Text>
3853 <Align>center</Align>
3854 <Color>#AE5CFF</Color>
3855 <TextColor>#FFFFFF</TextColor>
3856 </Mark>
3857 <Mark>
3858 <Control>hotcue_27_position</Control>
3859 <Text> HOTCUE 27 </Text>
3860 <Align>center</Align>
3861 <Color>#AE5CFF</Color>
3862 <TextColor>#FFFFFF</TextColor>
3863 </Mark>
3864 <Mark>
3865 <Control>hotcue_28_position</Control>
3866 <Text> HOTCUE 28 </Text>
3867 <Align>center</Align>
3868 <Color>#AE5CFF</Color>
3869 <TextColor>#FFFFFF</TextColor>
3870 </Mark>
3871 <Mark>
3872 <Control>hotcue_29_position</Control>
3873 <Text> HOTCUE 29 </Text>
3874 <Align>center</Align>
3875 <Color>#AE5CFF</Color>
3876 <TextColor>#FFFFFF</TextColor>
3877 </Mark>
3878 <Mark>
3879 <Control>hotcue_30_position</Control>
3880 <Text> HOTCUE 30 </Text>
3881 <Align>center</Align>
3882 <Color>#AE5CFF</Color>
3883 <TextColor>#FFFFFF</TextColor>
3884 </Mark>
3885 <Mark>
3886 <Control>hotcue_31_position</Control>
3887 <Text> HOTCUE 31 </Text>
3888 <Align>center</Align>
3889 <Color>#AE5CFF</Color>
3890 <TextColor>#FFFFFF</TextColor>
3891 </Mark>
3892 <Mark>
3893 <Control>hotcue_32_position</Control>
3894 <Text> HOTCUE 32 </Text>
3895 <Align>center</Align>
3896 <Color>#AE5CFF</Color>
3897 <TextColor>#FFFFFF</TextColor>
3898 </Mark>
3899 <Mark>
3900 <Control>hotcue_33_position</Control>
3901 <Text> HOTCUE 33 </Text>
3902 <Align>center</Align>
3903 <Color>#AE5CFF</Color>
3904 <TextColor>#FFFFFF</TextColor>
3905 </Mark>
3906 <Mark>
3907 <Control>hotcue_34_position</Control>
3908 <Text> HOTCUE 34 </Text>
3909 <Align>center</Align>
3910 <Color>#AE5CFF</Color>
3911 <TextColor>#FFFFFF</TextColor>
3912 </Mark>
3913 <Mark>
3914 <Control>hotcue_35_position</Control>
3915 <Text> HOTCUE 35 </Text>
3916 <Align>center</Align>
3917 <Color>#AE5CFF</Color>
3918 <TextColor>#FFFFFF</TextColor>
3919 </Mark>
3920 <Mark>
3921 <Control>hotcue_36_position</Control>
3922 <Text> HOTCUE 36 </Text>
3923 <Align>center</Align>
3924 <Color>#AE5CFF</Color>
3925 <TextColor>#FFFFFF</TextColor>
3926 </Mark>
3927 <Mark>
3928 <Control>cue_point</Control>3709 <Control>cue_point</Control>
3929 <Pixmap>marker_cue1.png</Pixmap>3710 <Pixmap>marker_cue1.png</Pixmap>
3930 <Text> CUE </Text>3711 <Text> CUE </Text>
@@ -4946,230 +4727,11 @@
4946 <Color>#00FF00</Color>4727 <Color>#00FF00</Color>
4947 <TextColor>#FFFFFF</TextColor>4728 <TextColor>#FFFFFF</TextColor>
4948 </Mark>4729 </Mark>
4949 <Mark>4730 <DefaultMark>
4950 <Control>hotcue_5_position</Control>4731 <Align>center</Align>
4951 <Text> HOTCUE 5 </Text>4732 <Color>#AE5CFF</Color>
4952 <Align>center</Align>4733 <TextColor>#FFFFFF</TextColor>
4953 <Color>#AE5CFF</Color>4734 </DefaultMark>
4954 <TextColor>#FFFFFF</TextColor>
4955 </Mark>
4956 <Mark>
4957 <Control>hotcue_6_position</Control>
4958 <Text> HOTCUE 6 </Text>
4959 <Align>center</Align>
4960 <Color>#AE5CFF</Color>
4961 <TextColor>#FFFFFF</TextColor>
4962 </Mark>
4963 <Mark>
4964 <Control>hotcue_7_position</Control>
4965 <Text> HOTCUE 7 </Text>
4966 <Align>center</Align>
4967 <Color>#AE5CFF</Color>
4968 <TextColor>#FFFFFF</TextColor>
4969 </Mark>
4970 <Mark>
4971 <Control>hotcue_8_position</Control>
4972 <Text> HOTCUE 8 </Text>
4973 <Align>center</Align>
4974 <Color>#AE5CFF</Color>
4975 <TextColor>#FFFFFF</TextColor>
4976 </Mark>
4977 <Mark>
4978 <Control>hotcue_9_position</Control>
4979 <Text> HOTCUE 9 </Text>
4980 <Align>center</Align>
4981 <Color>#AE5CFF</Color>
4982 <TextColor>#FFFFFF</TextColor>
4983 </Mark>
4984 <Mark>
4985 <Control>hotcue_10_position</Control>
4986 <Text> HOTCUE 10 </Text>
4987 <Align>center</Align>
4988 <Color>#AE5CFF</Color>
4989 <TextColor>#FFFFFF</TextColor>
4990 </Mark>
4991 <Mark>
4992 <Control>hotcue_11_position</Control>
4993 <Text> HOTCUE 11 </Text>
4994 <Align>center</Align>
4995 <Color>#AE5CFF</Color>
4996 <TextColor>#FFFFFF</TextColor>
4997 </Mark>
4998 <Mark>
4999 <Control>hotcue_12_position</Control>
5000 <Text> HOTCUE 12 </Text>
5001 <Align>center</Align>
5002 <Color>#AE5CFF</Color>
5003 <TextColor>#FFFFFF</TextColor>
5004 </Mark>
5005 <Mark>
5006 <Control>hotcue_13_position</Control>
5007 <Text> HOTCUE 13 </Text>
5008 <Align>center</Align>
5009 <Color>#AE5CFF</Color>
5010 <TextColor>#FFFFFF</TextColor>
5011 </Mark>
5012 <Mark>
5013 <Control>hotcue_14_position</Control>
5014 <Text> HOTCUE 14 </Text>
5015 <Align>center</Align>
5016 <Color>#AE5CFF</Color>
5017 <TextColor>#FFFFFF</TextColor>
5018 </Mark>
5019 <Mark>
5020 <Control>hotcue_15_position</Control>
5021 <Text> HOTCUE 15 </Text>
5022 <Align>center</Align>
5023 <Color>#AE5CFF</Color>
5024 <TextColor>#FFFFFF</TextColor>
5025 </Mark>
5026 <Mark>
5027 <Control>hotcue_16_position</Control>
5028 <Text> HOTCUE 16 </Text>
5029 <Align>center</Align>
5030 <Color>#AE5CFF</Color>
5031 <TextColor>#FFFFFF</TextColor>
5032 </Mark>
5033 <Mark>
5034 <Control>hotcue_17_position</Control>
5035 <Text> HOTCUE 17 </Text>
5036 <Align>center</Align>
5037 <Color>#AE5CFF</Color>
5038 <TextColor>#FFFFFF</TextColor>
5039 </Mark>
5040 <Mark>
5041 <Control>hotcue_18_position</Control>
5042 <Text> HOTCUE 18 </Text>
5043 <Align>center</Align>
5044 <Color>#AE5CFF</Color>
5045 <TextColor>#FFFFFF</TextColor>
5046 </Mark>
5047 <Mark>
5048 <Control>hotcue_19_position</Control>
5049 <Text> HOTCUE 19 </Text>
5050 <Align>center</Align>
5051 <Color>#AE5CFF</Color>
5052 <TextColor>#FFFFFF</TextColor>
5053 </Mark>
5054 <Mark>
5055 <Control>hotcue_20_position</Control>
5056 <Text> HOTCUE 20 </Text>
5057 <Align>center</Align>
5058 <Color>#AE5CFF</Color>
5059 <TextColor>#FFFFFF</TextColor>
5060 </Mark>
5061 <Mark>
5062 <Control>hotcue_21_position</Control>
5063 <Text> HOTCUE 21 </Text>
5064 <Align>center</Align>
5065 <Color>#AE5CFF</Color>
5066 <TextColor>#FFFFFF</TextColor>
5067 </Mark>
5068 <Mark>
5069 <Control>hotcue_22_position</Control>
5070 <Text> HOTCUE 22 </Text>
5071 <Align>center</Align>
5072 <Color>#AE5CFF</Color>
5073 <TextColor>#FFFFFF</TextColor>
5074 </Mark>
5075 <Mark>
5076 <Control>hotcue_23_position</Control>
5077 <Text> HOTCUE 23 </Text>
5078 <Align>center</Align>
5079 <Color>#AE5CFF</Color>
5080 <TextColor>#FFFFFF</TextColor>
5081 </Mark>
5082 <Mark>
5083 <Control>hotcue_24_position</Control>
5084 <Text> HOTCUE 24 </Text>
5085 <Align>center</Align>
5086 <Color>#AE5CFF</Color>
5087 <TextColor>#FFFFFF</TextColor>
5088 </Mark>
5089 <Mark>
5090 <Control>hotcue_25_position</Control>
5091 <Text> HOTCUE 25 </Text>
5092 <Align>center</Align>
5093 <Color>#AE5CFF</Color>
5094 <TextColor>#FFFFFF</TextColor>
5095 </Mark>
5096 <Mark>
5097 <Control>hotcue_26_position</Control>
5098 <Text> HOTCUE 26 </Text>
5099 <Align>center</Align>
5100 <Color>#AE5CFF</Color>
5101 <TextColor>#FFFFFF</TextColor>
5102 </Mark>
5103 <Mark>
5104 <Control>hotcue_27_position</Control>
5105 <Text> HOTCUE 27 </Text>
5106 <Align>center</Align>
5107 <Color>#AE5CFF</Color>
5108 <TextColor>#FFFFFF</TextColor>
5109 </Mark>
5110 <Mark>
5111 <Control>hotcue_28_position</Control>
5112 <Text> HOTCUE 28 </Text>
5113 <Align>center</Align>
5114 <Color>#AE5CFF</Color>
5115 <TextColor>#FFFFFF</TextColor>
5116 </Mark>
5117 <Mark>
5118 <Control>hotcue_29_position</Control>
5119 <Text> HOTCUE 29 </Text>
5120 <Align>center</Align>
5121 <Color>#AE5CFF</Color>
5122 <TextColor>#FFFFFF</TextColor>
5123 </Mark>
5124 <Mark>
5125 <Control>hotcue_30_position</Control>
5126 <Text> HOTCUE 30 </Text>
5127 <Align>center</Align>
5128 <Color>#AE5CFF</Color>
5129 <TextColor>#FFFFFF</TextColor>
5130 </Mark>
5131 <Mark>
5132 <Control>hotcue_31_position</Control>
5133 <Text> HOTCUE 31 </Text>
5134 <Align>center</Align>
5135 <Color>#AE5CFF</Color>
5136 <TextColor>#FFFFFF</TextColor>
5137 </Mark>
5138 <Mark>
5139 <Control>hotcue_32_position</Control>
5140 <Text> HOTCUE 32 </Text>
5141 <Align>center</Align>
5142 <Color>#AE5CFF</Color>
5143 <TextColor>#FFFFFF</TextColor>
5144 </Mark>
5145 <Mark>
5146 <Control>hotcue_33_position</Control>
5147 <Text> HOTCUE 33 </Text>
5148 <Align>center</Align>
5149 <Color>#AE5CFF</Color>
5150 <TextColor>#FFFFFF</TextColor>
5151 </Mark>
5152 <Mark>
5153 <Control>hotcue_34_position</Control>
5154 <Text> HOTCUE 34 </Text>
5155 <Align>center</Align>
5156 <Color>#AE5CFF</Color>
5157 <TextColor>#FFFFFF</TextColor>
5158 </Mark>
5159 <Mark>
5160 <Control>hotcue_35_position</Control>
5161 <Text> HOTCUE 35 </Text>
5162 <Align>center</Align>
5163 <Color>#AE5CFF</Color>
5164 <TextColor>#FFFFFF</TextColor>
5165 </Mark>
5166 <Mark>
5167 <Control>hotcue_36_position</Control>
5168 <Text> HOTCUE 36 </Text>
5169 <Align>center</Align>
5170 <Color>#AE5CFF</Color>
5171 <TextColor>#FFFFFF</TextColor>
5172 </Mark>
5173 <Mark>4735 <Mark>
5174 <Control>cue_point</Control>4736 <Control>cue_point</Control>
5175 <Pixmap>marker_cue1.png</Pixmap>4737 <Pixmap>marker_cue1.png</Pixmap>
51764738
=== modified file 'mixxx/src/engine/cuecontrol.cpp'
--- mixxx/src/engine/cuecontrol.cpp 2012-04-27 07:47:21 +0000
+++ mixxx/src/engine/cuecontrol.cpp 2012-05-17 02:22:20 +0000
@@ -12,8 +12,6 @@
12#include "cachingreader.h"12#include "cachingreader.h"
13#include "mathstuff.h"13#include "mathstuff.h"
1414
15#define NUM_HOT_CUES 37
16
17CueControl::CueControl(const char * _group,15CueControl::CueControl(const char * _group,
18 ConfigObject<ConfigValue> * _config) :16 ConfigObject<ConfigValue> * _config) :
19 EngineControl(_group, _config),17 EngineControl(_group, _config),
2018
=== modified file 'mixxx/src/engine/cuecontrol.h'
--- mixxx/src/engine/cuecontrol.h 2011-12-10 18:36:04 +0000
+++ mixxx/src/engine/cuecontrol.h 2012-05-17 02:22:20 +0000
@@ -11,6 +11,8 @@
11#include "configobject.h"11#include "configobject.h"
12#include "trackinfoobject.h"12#include "trackinfoobject.h"
1313
14#define NUM_HOT_CUES 37
15
14class ControlObject;16class ControlObject;
15class ControlPushButton;17class ControlPushButton;
16class Cue;18class Cue;
1719
=== modified file 'mixxx/src/skin/legacyskinparser.cpp'
--- mixxx/src/skin/legacyskinparser.cpp 2012-05-15 21:42:29 +0000
+++ mixxx/src/skin/legacyskinparser.cpp 2012-05-17 02:22:20 +0000
@@ -431,7 +431,8 @@
431431
432 WWaveformViewer* viewer = new WWaveformViewer(pSafeChannelStr, m_pConfig, m_pParent);432 WWaveformViewer* viewer = new WWaveformViewer(pSafeChannelStr, m_pConfig, m_pParent);
433 viewer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);433 viewer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
434 WaveformWidgetFactory::instance()->setWaveformWidget(viewer, node);434 WaveformWidgetFactory* factory = WaveformWidgetFactory::instance();
435 factory->setWaveformWidget(viewer, node);
435436
436 //qDebug() << "::parseVisual: parent" << m_pParent << m_pParent->size();437 //qDebug() << "::parseVisual: parent" << m_pParent << m_pParent->size();
437 //qDebug() << "::parseVisual: viewer" << viewer << viewer->size();438 //qDebug() << "::parseVisual: viewer" << viewer << viewer->size();
@@ -439,8 +440,6 @@
439 viewer->installEventFilter(m_pKeyboard);440 viewer->installEventFilter(m_pKeyboard);
440 viewer->installEventFilter(m_pControllerManager->getControllerLearningEventFilter());441 viewer->installEventFilter(m_pControllerManager->getControllerLearningEventFilter());
441442
442 // Hook up the wheel Control Object to the Visual Controller
443
444 // Connect control proxy to widget, so delete can be handled by the QT object tree443 // Connect control proxy to widget, so delete can be handled by the QT object tree
445 ControlObjectThreadWidget * p = new ControlObjectThreadWidget(444 ControlObjectThreadWidget * p = new ControlObjectThreadWidget(
446 ControlObject::getControl(ConfigKey(channelStr, "wheel"))/*, viewer*/);445 ControlObject::getControl(ConfigKey(channelStr, "wheel"))/*, viewer*/);
447446
=== modified file 'mixxx/src/waveform/renderers/glslwaveformrenderersignal.cpp'
--- mixxx/src/waveform/renderers/glslwaveformrenderersignal.cpp 2012-04-05 03:21:25 +0000
+++ mixxx/src/waveform/renderers/glslwaveformrenderersignal.cpp 2012-05-17 02:22:20 +0000
@@ -2,13 +2,14 @@
2#include "waveformwidgetrenderer.h"2#include "waveformwidgetrenderer.h"
33
4#include "waveform/waveform.h"4#include "waveform/waveform.h"
5#include "waveform/waveformwidgetfactory.h"
56
6#include "mathstuff.h"7#include "mathstuff.h"
78
8#include <QGLFramebufferObject>9#include <QGLFramebufferObject>
910
10GLSLWaveformRendererSignal::GLSLWaveformRendererSignal(WaveformWidgetRenderer* waveformWidgetRenderer) :11GLSLWaveformRendererSignal::GLSLWaveformRendererSignal(WaveformWidgetRenderer* waveformWidgetRenderer) :
11 WaveformRendererAbstract(waveformWidgetRenderer) {12 WaveformRendererSignalBase(waveformWidgetRenderer) {
1213
13 m_signalMaxShaderProgram = 0;14 m_signalMaxShaderProgram = 0;
14 m_frameShaderProgram = 0;15 m_frameShaderProgram = 0;
@@ -204,7 +205,7 @@
204 //qDebug() << bufferWidth;205 //qDebug() << bufferWidth;
205}206}
206207
207void GLSLWaveformRendererSignal::init(){208void GLSLWaveformRendererSignal::onInit(){
208209
209 if(!m_signalMaxShaderProgram)210 if(!m_signalMaxShaderProgram)
210 m_signalMaxShaderProgram = new QGLShaderProgram();211 m_signalMaxShaderProgram = new QGLShaderProgram();
@@ -221,8 +222,8 @@
221 loadTexture();222 loadTexture();
222}223}
223224
224void GLSLWaveformRendererSignal::setup(const QDomNode& node) {225void GLSLWaveformRendererSignal::onSetup(const QDomNode& /*node*/) {
225 m_colors.setup(node);226
226}227}
227228
228void GLSLWaveformRendererSignal::onSetTrack(){229void GLSLWaveformRendererSignal::onSetTrack(){
@@ -346,8 +347,8 @@
346 float scale = (float)m_framebuffer->width()/(2.0*(float)m_waveformRenderer->getWidth());347 float scale = (float)m_framebuffer->width()/(2.0*(float)m_waveformRenderer->getWidth());
347 scale /= (1.0+m_waveformRenderer->getRateAdjust());348 scale /= (1.0+m_waveformRenderer->getRateAdjust());
348349
349 //NOTE: (vrince) try to move the camera to limit the stepping effect of actula versus current position centering350 //NOTE: (vrince) try to move the camera to limit the stepping effect of actual versus current position centering
350 //The following code must be paired with the shader hat compute signal value in texture/gemometry world351 //The following code must be paired with the shader that compute signal value in texture/gemometry world
351 /*const int visualSamplePerPixel = m_signalFrameBufferRatio * m_waveformRenderer->getZoomFactor();352 /*const int visualSamplePerPixel = m_signalFrameBufferRatio * m_waveformRenderer->getZoomFactor();
352 const int nearestCurrentIndex = int(floor(indexPosition));353 const int nearestCurrentIndex = int(floor(indexPosition));
353 const float actualIndexPosition = indexPosition - float(nearestCurrentIndex%(2*visualSamplePerPixel));354 const float actualIndexPosition = indexPosition - float(nearestCurrentIndex%(2*visualSamplePerPixel));
@@ -355,9 +356,22 @@
355 const float range = float(visualSamplePerPixel * m_waveformRenderer->getWidth());356 const float range = float(visualSamplePerPixel * m_waveformRenderer->getWidth());
356 const float deltaInGeometry = deltaPosition / range;*/357 const float deltaInGeometry = deltaPosition / range;*/
357358
359 WaveformWidgetFactory* factory = WaveformWidgetFactory::instance();
360 double visualGain = factory->getVisualGain(WaveformWidgetFactory::All);
361 visualGain *= m_waveformRenderer->getGain();
358362
359 glTranslatef( 0.0, 0.0, 0.0);363 glTranslatef( 0.0, 0.0, 0.0);
360 glScalef(scale, 1.0, 1.0);364 glScalef(scale, visualGain, 1.0);
365
366 /*
367 //TODO: (vrince) make this line work sometime
368 glBegin(GL_LINES); {
369 glColor4f(m_axesColor.redF(),m_axesColor.greenF(),m_axesColor.blueF(),m_axesColor.alphaF());
370 glVertex2f(0,0);
371 glVertex2f(m_waveformRenderer->getWidth(),0);
372 }
373 glEnd();
374 */
361375
362 //paint buffer into viewport376 //paint buffer into viewport
363 {377 {
364378
=== modified file 'mixxx/src/waveform/renderers/glslwaveformrenderersignal.h'
--- mixxx/src/waveform/renderers/glslwaveformrenderersignal.h 2012-03-27 00:54:20 +0000
+++ mixxx/src/waveform/renderers/glslwaveformrenderersignal.h 2012-05-17 02:22:20 +0000
@@ -1,20 +1,19 @@
1#ifndef GLWAVEFORMRENDERERSIGNALSHADER_H1#ifndef GLWAVEFORMRENDERERSIGNALSHADER_H
2#define GLWAVEFORMRENDERERSIGNALSHADER_H2#define GLWAVEFORMRENDERERSIGNALSHADER_H
33
4#include "waveformrendererabstract.h"4#include "waveformrenderersignalbase.h"
5#include "waveformsignalcolors.h"
65
7#include <QGLFramebufferObject>6#include <QGLFramebufferObject>
8#include <QGLShaderProgram>7#include <QGLShaderProgram>
9#include <QtOpenGL>8#include <QtOpenGL>
109
11class GLSLWaveformRendererSignal : public WaveformRendererAbstract {10class GLSLWaveformRendererSignal : public WaveformRendererSignalBase {
12public:11public:
13 explicit GLSLWaveformRendererSignal(WaveformWidgetRenderer* waveformWidgetRenderer);12 explicit GLSLWaveformRendererSignal(WaveformWidgetRenderer* waveformWidgetRenderer);
14 virtual ~GLSLWaveformRendererSignal();13 virtual ~GLSLWaveformRendererSignal();
1514
16 virtual void init();15 virtual void onInit();
17 virtual void setup(const QDomNode& node);16 virtual void onSetup(const QDomNode& node);
18 virtual void draw(QPainter* painter, QPaintEvent* event);17 virtual void draw(QPainter* painter, QPaintEvent* event);
1918
20 virtual void onSetTrack();19 virtual void onSetTrack();
@@ -28,13 +27,10 @@
28 void createFrameBuffer();27 void createFrameBuffer();
2928
30 GLint m_unitQuadListId;29 GLint m_unitQuadListId;
31
32 GLuint m_textureId;30 GLuint m_textureId;
3331
34 int m_loadedWaveform;32 int m_loadedWaveform;
3533
36 WaveformSignalColors m_colors;
37
38 //Frame buffer for two pass rendering34 //Frame buffer for two pass rendering
39 QGLFramebufferObject* m_signalMaxbuffer;35 QGLFramebufferObject* m_signalMaxbuffer;
40 QGLFramebufferObject* m_framebuffer;36 QGLFramebufferObject* m_framebuffer;
4137
=== modified file 'mixxx/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp'
--- mixxx/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp 2012-04-15 01:25:21 +0000
+++ mixxx/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp 2012-05-17 02:22:20 +0000
@@ -1,170 +1,75 @@
1#include <QDomNode>1#include "controlobjectthreadmain.h"
2#include <QLineF>
3#include <QLinearGradient>
4#include <QMutexLocker>
52
6#include "controlobject.h"
7#include "defs.h"3#include "defs.h"
8#include "glwaveformrendererfilteredsignal.h"4#include "glwaveformrendererfilteredsignal.h"
9#include "trackinfoobject.h"5#include "trackinfoobject.h"
10#include "waveform/waveform.h"6#include "waveform/waveform.h"
11#include "waveformwidgetrenderer.h"7#include "waveformwidgetrenderer.h"
12#include "widget/wskincolor.h"8
13#include "widget/wwidget.h"
14#include "waveform/waveformwidgetfactory.h"9#include "waveform/waveformwidgetfactory.h"
1510
11#include <QDomNode>
12
13#include <qgl.h>
14
16GLWaveformRendererFilteredSignal::GLWaveformRendererFilteredSignal(15GLWaveformRendererFilteredSignal::GLWaveformRendererFilteredSignal(
17 WaveformWidgetRenderer* waveformWidgetRenderer)16 WaveformWidgetRenderer* waveformWidgetRenderer)
18 : WaveformRendererAbstract(waveformWidgetRenderer) {17 : WaveformRendererSignalBase(waveformWidgetRenderer) {
19 m_lowFilterControlObject = NULL;18
20 m_midFilterControlObject = NULL;
21 m_highFilterControlObject = NULL;
22 m_lowKillControlObject = NULL;
23 m_midKillControlObject = NULL;
24 m_highKillControlObject = NULL;
25 m_alignment = Qt::AlignCenter;
26}19}
2720
28GLWaveformRendererFilteredSignal::~GLWaveformRendererFilteredSignal() {21GLWaveformRendererFilteredSignal::~GLWaveformRendererFilteredSignal() {
29}22
3023}
31void GLWaveformRendererFilteredSignal::init() {24
32 //create controls25void GLWaveformRendererFilteredSignal::onInit() {
33 m_lowFilterControlObject = ControlObject::getControl(ConfigKey(m_waveformRenderer->getGroup(),"filterLow"));26
34 m_midFilterControlObject = ControlObject::getControl(ConfigKey(m_waveformRenderer->getGroup(),"filterMid"));27}
35 m_highFilterControlObject = ControlObject::getControl(ConfigKey(m_waveformRenderer->getGroup(),"filterHigh"));28
36 m_lowKillControlObject = ControlObject::getControl(ConfigKey(m_waveformRenderer->getGroup(),"filterLowKill"));29void GLWaveformRendererFilteredSignal::onSetup(const QDomNode& /*node*/) {
37 m_midKillControlObject = ControlObject::getControl(ConfigKey(m_waveformRenderer->getGroup(),"filterMidKill"));30
38 m_highKillControlObject = ControlObject::getControl(ConfigKey(m_waveformRenderer->getGroup(),"filterHighKill"));31}
39}32
4033void GLWaveformRendererFilteredSignal::draw(QPainter* painter, QPaintEvent* /*event*/) {
41void GLWaveformRendererFilteredSignal::setup(const QDomNode& node) {34
42 QString alignString = WWidget::selectNodeQString(node, "Align");
43 if (alignString == "bottom") {
44 m_alignment = Qt::AlignBottom;
45 } else if (alignString == "top") {
46 m_alignment = Qt::AlignTop;
47 } else {
48 m_alignment = Qt::AlignCenter;
49 }
50
51 m_colors.setup(node);
52
53 QColor low = m_colors.getLowColor();
54 QColor mid = m_colors.getMidColor();
55 QColor high = m_colors.getHighColor();
56
57 QColor lowCenter = low;
58 QColor midCenter = mid;
59 QColor highCenter = high;
60
61 low.setAlphaF(0.9);
62 mid.setAlphaF(0.9);
63 high.setAlphaF(0.9);
64
65 lowCenter.setAlphaF(0.5);
66 midCenter.setAlphaF(0.5);
67 highCenter.setAlphaF(0.5);
68
69 QLinearGradient gradientLow(QPointF(0.0,-255.0/2.0),QPointF(0.0,255.0/2.0));
70 gradientLow.setColorAt(0.0, low);
71 gradientLow.setColorAt(0.25,low.lighter(85));
72 gradientLow.setColorAt(0.5, lowCenter.darker(115));
73 gradientLow.setColorAt(0.75,low.lighter(85));
74 gradientLow.setColorAt(1.0, low);
75 m_lowBrush = QBrush(gradientLow);
76
77 QLinearGradient gradientMid(QPointF(0.0,-255.0/2.0),QPointF(0.0,255.0/2.0));
78 gradientMid.setColorAt(0.0, mid);
79 gradientMid.setColorAt(0.35,mid.lighter(85));
80 gradientMid.setColorAt(0.5, midCenter.darker(115));
81 gradientMid.setColorAt(0.65,mid.lighter(85));
82 gradientMid.setColorAt(1.0, mid);
83 m_midBrush = QBrush(gradientMid);
84
85 QLinearGradient gradientHigh(QPointF(0.0,-255.0/2.0),QPointF(0.0,255.0/2.0));
86 gradientHigh.setColorAt(0.0, high);
87 gradientHigh.setColorAt(0.45,high.lighter(85));
88 gradientHigh.setColorAt(0.5, highCenter.darker(115));
89 gradientHigh.setColorAt(0.55,high.lighter(85));
90 gradientHigh.setColorAt(1.0, high);
91 m_highBrush = QBrush(gradientHigh);
92
93 low.setAlphaF(0.3);
94 mid.setAlphaF(0.3);
95 high.setAlphaF(0.3);
96
97 QLinearGradient gradientKilledLow(QPointF(0.0,-255.0/2.0),QPointF(0.0,255.0/2.0));
98 gradientKilledLow.setColorAt(0.0,low.darker(80));
99 gradientKilledLow.setColorAt(0.5,lowCenter.darker(150));
100 gradientKilledLow.setColorAt(1.0,low.darker(80));
101 m_lowKilledBrush = QBrush(gradientKilledLow);
102
103 QLinearGradient gradientKilledMid(QPointF(0.0,-255.0/2.0),QPointF(0.0,255.0/2.0));
104 gradientKilledMid.setColorAt(0.0,mid.darker(80));
105 gradientKilledMid.setColorAt(0.5,midCenter.darker(150));
106 gradientKilledMid.setColorAt(1.0,mid.darker(80));
107 m_midKilledBrush = QBrush(gradientKilledMid);
108
109 QLinearGradient gradientKilledHigh(QPointF(0.0,-255.0/2.0),QPointF(0.0,255.0/2.0));
110 gradientKilledHigh.setColorAt(0.0,high.darker(80));
111 gradientKilledHigh.setColorAt(0.5,highCenter.darker(150));
112 gradientKilledHigh.setColorAt(1.0,high.darker(80));
113 m_highKilledBrush = QBrush(gradientKilledHigh);
114}
115
116void GLWaveformRendererFilteredSignal::onResize() {
117 m_polygon[0].resize(2*m_waveformRenderer->getWidth()+2);
118 m_polygon[1].resize(2*m_waveformRenderer->getWidth()+2);
119 m_polygon[2].resize(2*m_waveformRenderer->getWidth()+2);
120}
121
122inline void setPoint(QPointF& point, qreal x, qreal y) {
123 point.setX(x);
124 point.setY(y);
125}
126
127int GLWaveformRendererFilteredSignal::buildPolygon() {
128 // We have to check the track is present because it might have been unloaded
129 // between the call to draw and the call to buildPolygon
130 TrackPointer pTrack = m_waveformRenderer->getTrackInfo();35 TrackPointer pTrack = m_waveformRenderer->getTrackInfo();
131 if (!pTrack) {36 if (!pTrack) {
132 return 0;37 return;
133 }38 }
13439
135 const Waveform* waveform = pTrack->getWaveform();40 const Waveform* waveform = pTrack->getWaveform();
136 if (waveform == NULL) {41 if (waveform == NULL) {
137 return 0;42 return;
138 }43 }
13944
140 const int dataSize = waveform->getDataSize();45 const int dataSize = waveform->getDataSize();
141 if (dataSize <= 1) {46 if (dataSize <= 1) {
142 return 0;47 return;
143 }48 }
14449
145 const WaveformData* data = waveform->data();50 const WaveformData* data = waveform->data();
146 if (data == NULL) {51 if (data == NULL) {
147 return 0;52 return;
148 }53 }
14954
150 const double firstVisualIndex = m_waveformRenderer->getFirstDisplayedPosition() * dataSize;55 double firstVisualIndex = m_waveformRenderer->getFirstDisplayedPosition() * dataSize;
151 const double lastVisualIndex = m_waveformRenderer->getLastDisplayedPosition() * dataSize;56 double lastVisualIndex = m_waveformRenderer->getLastDisplayedPosition() * dataSize;
152 int pointIndex = 0;57
153 setPoint(m_polygon[0][pointIndex], 0.0, 0.0);58 const int firstIndex = int(firstVisualIndex+0.5);
154 setPoint(m_polygon[1][pointIndex], 0.0, 0.0);59 firstVisualIndex = firstIndex - firstIndex%2;
155 setPoint(m_polygon[2][pointIndex], 0.0, 0.0);60
156 pointIndex++;61 const int lastIndex = int(lastVisualIndex+0.5);
15762 lastVisualIndex = lastIndex + lastIndex%2;
158 const double offset = firstVisualIndex;63
15964 // save the GL state set for QPainter
16065 painter->beginNativePainting();
161 // Represents the # of waveform data points per horizontal pixel.66
162 const double gain = (lastVisualIndex - firstVisualIndex) /67 glEnable(GL_BLEND);
163 (double)m_waveformRenderer->getWidth();68 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
16469
165 // The number of visual samples that should be represented within one pixel70 const QColor& l = m_colors.getLowColor();
166 // given our current zoom level and track speed.71 const QColor& m = m_colors.getMidColor();
167 const double visualSamplePerPixel = m_waveformRenderer->getVisualSamplePerPixel();72 const QColor& h = m_colors.getHighColor();
16873
169 // Per-band gain from the EQ knobs.74 // Per-band gain from the EQ knobs.
170 float lowGain(1.0), midGain(1.0), highGain(1.0);75 float lowGain(1.0), midGain(1.0), highGain(1.0);
@@ -176,195 +81,143 @@
176 highGain = m_highFilterControlObject->get();81 highGain = m_highFilterControlObject->get();
177 }82 }
17883
179 //apply separate visual gain
180 WaveformWidgetFactory* factory = WaveformWidgetFactory::instance();84 WaveformWidgetFactory* factory = WaveformWidgetFactory::instance();
85 double visualGain = factory->getVisualGain(::WaveformWidgetFactory::All);
181 lowGain *= factory->getVisualGain(WaveformWidgetFactory::Low);86 lowGain *= factory->getVisualGain(WaveformWidgetFactory::Low);
182 midGain *= factory->getVisualGain(WaveformWidgetFactory::Mid);87 midGain *= factory->getVisualGain(WaveformWidgetFactory::Mid);
183 highGain *= factory->getVisualGain(WaveformWidgetFactory::High);88 highGain *= factory->getVisualGain(WaveformWidgetFactory::High);
18489
185 //NOTE(vrince) Please help me find a better name for "channelSeparation"90 float maxLow[2];
186 //this variable stand for merged channel ... 1 = merged & 2 = separated91 float maxMid[2];
187 int channelSeparation = 2;92 float maxHigh[2];
188 if (m_alignment != Qt::AlignCenter)93
189 channelSeparation = 1;94 float meanIndex;
19095
191 for (int channel = 0; channel < channelSeparation; ++channel) {96 glPushMatrix();
192 int startPixel = 0;97
193 int endPixel = m_waveformRenderer->getWidth() - 1;98 if( m_alignment == Qt::AlignCenter) {
194 int delta = 1;99 glMatrixMode(GL_PROJECTION);
195 double direction = 1.0;100 glLoadIdentity();
196101 glOrtho(firstVisualIndex, lastVisualIndex, -255.0, 255.0, -10.0, 10.0);
197 //Reverse display for merged bottom channel102
198 if (m_alignment == Qt::AlignBottom)103 glMatrixMode(GL_MODELVIEW);
199 direction = -1.0;104 glLoadIdentity();
200105
201 if (channel == 1) {106 glScalef(1.f,2.f*visualGain*m_waveformRenderer->getGain(),1.f);
202 startPixel = m_waveformRenderer->getWidth() - 1;107
203 endPixel = 0;108 glLineWidth(1.0);
204 delta = -1;109 glDisable(GL_LINE_SMOOTH);
205 direction = -1.0;110
206111 //draw reference line
207 // After preparing the first channel, insert the pivot point.112 glBegin(GL_LINES); {
208 setPoint(m_polygon[0][pointIndex], m_waveformRenderer->getWidth(), 0.0);113 glColor4f(m_axesColor.redF(),m_axesColor.greenF(),m_axesColor.blueF(),m_axesColor.alphaF());
209 setPoint(m_polygon[1][pointIndex], m_waveformRenderer->getWidth(), 0.0);114 glVertex2f(firstVisualIndex,0);
210 setPoint(m_polygon[2][pointIndex], m_waveformRenderer->getWidth(), 0.0);115 glVertex2f(lastVisualIndex,0);
211 pointIndex++;116 }
212 }117 glEnd();
213118
214 for (int x = startPixel;119 glLineWidth(1.1);
215 (startPixel < endPixel) ? (x <= endPixel) : (x >= endPixel);120 glEnable(GL_LINE_SMOOTH);
216 x += delta) {121
217122 glBegin(GL_LINES); {
218 // TODO(rryan) remove before 1.11 release. I'm seeing crashes123 for( int visualIndex = firstVisualIndex;
219 // sometimes where the pointIndex is very very large. It hasn't come124 visualIndex < lastVisualIndex;
220 // back since adding locking, but I'm leaving this so that we can125 visualIndex += 2) {
221 // get some info about it before crashing. (The crash usually126
222 // corrupts a lot of the stack).127 if( visualIndex < 0)
223 if (pointIndex > 2*m_waveformRenderer->getWidth()+2) {128 continue;
224 qDebug() << "OUT OF CONTROL"129
225 << 2*m_waveformRenderer->getWidth()+2130 if( visualIndex > dataSize - 1)
226 << dataSize131 break;
227 << channel << pointIndex << x;132
228 }133 maxLow[0] = (float)data[visualIndex].filtered.low;
229134 maxMid[0] = (float)data[visualIndex].filtered.mid;
230 // Width of the x position in visual indices.135 maxHigh[0] = (float)data[visualIndex].filtered.high;
231 const double xSampleWidth = gain * x;136 maxLow[1] = (float)data[visualIndex+1].filtered.low;
232137 maxMid[1] = (float)data[visualIndex+1].filtered.mid;
233 // Effective visual index of x138 maxHigh[1] = (float)data[visualIndex+1].filtered.high;
234 const double xVisualSampleIndex = xSampleWidth + offset;139
235140 meanIndex = visualIndex;
236 // Our current pixel (x) corresponds to a number of visual samples141
237 // (visualSamplerPerPixel) in our waveform object. We take the max of142 glColor4f(l.redF(),l.greenF(),l.blueF(),0.8);
238 // all the data points on either side of xVisualSampleIndex within a143 glVertex2f(meanIndex,lowGain*maxLow[0]);
239 // window of 'maxSamplingRange' visual samples to measure the maximum144 glVertex2f(meanIndex,-1.f*lowGain*maxLow[1]);
240 // data point contained by this pixel.145
241 double maxSamplingRange = gain / 2.0;146 glColor4f(m.redF(),m.greenF(),m.blueF(),0.85);
242147 glVertex2f(meanIndex,midGain*maxMid[0]);
243 // Since xVisualSampleIndex is in visual-samples (e.g. R,L,R,L) we want148 glVertex2f(meanIndex,-1.f*midGain*maxMid[1]);
244 // to check +/- maxSamplingRange frames, not samples. To do this, divide149
245 // xVisualSampleIndex by 2. Since frames indices are integers, we round150 glColor4f(h.redF(),h.greenF(),h.blueF(),0.9);
246 // to the nearest integer by adding 0.5 before casting to int.151 glVertex2f(meanIndex,highGain*maxHigh[0]);
247 int visualFrameStart = int(xVisualSampleIndex / 2.0 - maxSamplingRange + 0.5);152 glVertex2f(meanIndex,-1.f*highGain*maxHigh[1]);
248 int visualFrameStop = int(xVisualSampleIndex / 2.0 + maxSamplingRange + 0.5);153 }
249154 }
250 // If the entire sample range is off the screen then don't calculate a155 glEnd();
251 // point for this pixel.156 } else { //top || bottom
252 const int lastVisualFrame = dataSize / 2 - 1;157 glMatrixMode(GL_PROJECTION);
253 if (visualFrameStop < 0 || visualFrameStart > lastVisualFrame) {158 glLoadIdentity();
254 setPoint(m_polygon[0][pointIndex], x, 0.0);159 if( m_alignment == Qt::AlignBottom)
255 setPoint(m_polygon[1][pointIndex], x, 0.0);160 glOrtho(firstVisualIndex, lastVisualIndex, 0.0, 255.0, -10.0, 10.0);
256 setPoint(m_polygon[2][pointIndex], x, 0.0);161 else
257 pointIndex++;162 glOrtho(firstVisualIndex, lastVisualIndex, 255.0, 0.0, -10.0, 10.0);
258 continue;163
259 }164 glMatrixMode(GL_MODELVIEW);
260165 glLoadIdentity();
261 // We now know that some subset of [visualFrameStart,166
262 // visualFrameStop] lies within the valid range of visual167 glScalef(1.f,visualGain*m_waveformRenderer->getGain(),1.f);
263 // frames. Clamp visualFrameStart/Stop to within [0,168
264 // lastVisualFrame].169 glLineWidth(1.1);
265 visualFrameStart = math_max(math_min(lastVisualFrame, visualFrameStart), 0);170 glEnable(GL_LINE_SMOOTH);
266 visualFrameStop = math_max(math_min(lastVisualFrame, visualFrameStop), 0);171
267172 glBegin(GL_LINES); {
268 int visualIndexStart = visualFrameStart * 2 + channel;173 for( int visualIndex = firstVisualIndex;
269 int visualIndexStop = visualFrameStop * 2 + channel;174 visualIndex < lastVisualIndex;
270175 visualIndex += 2) {
271 // if (x == m_waveformRenderer->getWidth() / 2) {176
272 // qDebug() << "audioVisualRatio" << waveform->getAudioVisualRatio();177 if( visualIndex < 0)
273 // qDebug() << "visualSampleRate" << waveform->getVisualSampleRate();178 continue;
274 // qDebug() << "audioSamplesPerVisualPixel" << waveform->getAudioSamplesPerVisualSample();179
275 // qDebug() << "visualSamplePerPixel" << visualSamplePerPixel;180 if( visualIndex > dataSize - 1)
276 // qDebug() << "xSampleWidth" << xSampleWidth;181 break;
277 // qDebug() << "xVisualSampleIndex" << xVisualSampleIndex;182
278 // qDebug() << "maxSamplingRange" << maxSamplingRange;;183 maxLow[0] = (float)data[visualIndex].filtered.low;
279 // qDebug() << "Sampling pixel " << x << "over [" << visualIndexStart << visualIndexStop << "]";184 maxLow[1] = (float)data[visualIndex+1].filtered.low;
280 // }185 maxMid[0] = (float)data[visualIndex].filtered.mid;
281186 maxMid[1] = (float)data[visualIndex+1].filtered.mid;
282 unsigned char maxLow = 0;187 maxHigh[0] = (float)data[visualIndex].filtered.high;
283 unsigned char maxBand = 0;188 maxHigh[1] = (float)data[visualIndex+1].filtered.high;
284 unsigned char maxHigh = 0;189
285190 glColor4f(l.redF(),l.greenF(),l.blueF(),0.8);
286 for (int i = visualIndexStart; i >= 0 && i < dataSize && i <= visualIndexStop;191 glVertex2f(float(visualIndex),0.f);
287 i += channelSeparation) {192 glVertex2f(float(visualIndex),lowGain*math_max(maxLow[0],maxLow[1]));
288 const WaveformData& waveformData = *(data + i);193
289 unsigned char low = waveformData.filtered.low;194 glColor4f(m.redF(),m.greenF(),m.blueF(),0.85);
290 unsigned char mid = waveformData.filtered.mid;195 glVertex2f(float(visualIndex),0.f);
291 unsigned char high = waveformData.filtered.high;196 glVertex2f(float(visualIndex),midGain*math_max(maxMid[0],maxMid[1]));
292 maxLow = math_max(maxLow, low);197
293 maxBand = math_max(maxBand, mid);198 glColor4f(h.redF(),h.greenF(),h.blueF(),0.9);
294 maxHigh = math_max(maxHigh, high);199 glVertex2f(float(visualIndex),0.f);
295 }200 glVertex2f(float(visualIndex),highGain*math_max(maxHigh[0],maxHigh[1]));
296201 }
297 setPoint(m_polygon[0][pointIndex], x, (float)maxLow*lowGain*direction);202 }
298 setPoint(m_polygon[1][pointIndex], x, (float)maxBand*midGain*direction);203 glEnd();
299 setPoint(m_polygon[2][pointIndex], x, (float)maxHigh*highGain*direction);204 }
300 pointIndex++;205
301 }206 glPopMatrix();
302 }207
303208 //DEBUG
304 //If channel are not displyed separatly we nne to close the loop properly209 /*glDisable(GL_ALPHA_TEST);
305 if (channelSeparation == 1) {210 glBegin(GL_LINE_LOOP);
306 setPoint(m_polygon[0][pointIndex], m_waveformRenderer->getWidth(), 0.0);211 {
307 setPoint(m_polygon[1][pointIndex], m_waveformRenderer->getWidth(), 0.0);212 glColor4f(0.5,1.0,0.5,0.25);
308 setPoint(m_polygon[2][pointIndex], m_waveformRenderer->getWidth(), 0.0);213 glVertex3f(firstVisualIndex,-1.0f, 0.0f);
309 pointIndex++;214 glVertex3f(lastVisualIndex, 1.0f, 0.0f);
310 }215 glVertex3f(lastVisualIndex,-1.0f, 0.0f);
311216 glVertex3f(firstVisualIndex, 1.0f, 0.0f);
312 return pointIndex;217 }
313}218 glEnd();*/
314219
315void GLWaveformRendererFilteredSignal::draw(QPainter* painter, QPaintEvent* /*event*/) {220 glDisable(GL_BLEND);
316 const TrackPointer pTrack = m_waveformRenderer->getTrackInfo();221
317 if (!pTrack)222 painter->endNativePainting();
318 return;
319
320 painter->save();
321
322 painter->setRenderHint(QPainter::Antialiasing);
323 painter->resetTransform();
324
325 //visual gain
326 WaveformWidgetFactory* factory = WaveformWidgetFactory::instance();
327 double visualGain = factory->getVisualGain(::WaveformWidgetFactory::All);
328
329 if (m_alignment == Qt::AlignTop) {
330 painter->translate(0.0,0.0);
331 painter->scale(1.0,2.0*visualGain*m_waveformRenderer->getGain()*(double)m_waveformRenderer->getHeight()/255.0);
332 } else if (m_alignment == Qt::AlignBottom) {
333 painter->translate(0.0,m_waveformRenderer->getHeight());
334 painter->scale(1.0,2.0*visualGain*m_waveformRenderer->getGain()*(double)m_waveformRenderer->getHeight()/255.0);
335 } else {
336 painter->translate(0.0,m_waveformRenderer->getHeight()/2.0);
337 painter->scale(1.0,1.0*visualGain*m_waveformRenderer->getGain()*(double)m_waveformRenderer->getHeight()/255.0);
338 }
339
340 int numberOfPoints = buildPolygon();
341
342 if (m_lowKillControlObject && m_lowKillControlObject->get() > 0.1) {
343 painter->setPen(QPen(m_lowKilledBrush, 0.0));
344 painter->setBrush(QColor(150,150,150,20));
345 } else {
346 painter->setPen(QPen(m_lowBrush, 0.0));
347 painter->setBrush(m_lowBrush);
348 }
349 painter->drawPolygon(&m_polygon[0][0],numberOfPoints);
350
351 if (m_midKillControlObject && m_midKillControlObject->get() > 0.1) {
352 painter->setPen(QPen(m_midKilledBrush, 0.0));
353 painter->setBrush(QColor(150,150,150,20));
354 } else {
355 painter->setPen(QPen(m_midBrush, 0.0));
356 painter->setBrush(m_midBrush);
357 }
358 painter->drawPolygon(&m_polygon[1][0],numberOfPoints);
359
360 if (m_highKillControlObject && m_highKillControlObject->get() > 0.1) {
361 painter->setPen(QPen(m_highKilledBrush, 0.0));
362 painter->setBrush(QColor(150,150,150,20));
363 } else {
364 painter->setPen(QPen(m_highBrush, 0.0));
365 painter->setBrush(m_highBrush);
366 }
367 painter->drawPolygon(&m_polygon[2][0],numberOfPoints);
368
369 painter->restore();
370}223}
371224
=== modified file 'mixxx/src/waveform/renderers/glwaveformrendererfilteredsignal.h'
--- mixxx/src/waveform/renderers/glwaveformrendererfilteredsignal.h 2012-04-03 00:51:35 +0000
+++ mixxx/src/waveform/renderers/glwaveformrendererfilteredsignal.h 2012-05-17 02:22:20 +0000
@@ -1,48 +1,18 @@
1#ifndef GLWAVEFROMRENDERERFILTEREDSIGNAL_H1#ifndef GLWAVEFROMRENDERERFILTEREDSIGNAL_H
2#define GLWAVEFROMRENDERERFILTEREDSIGNAL_H2#define GLWAVEFROMRENDERERFILTEREDSIGNAL_H
33
4#include "waveformrendererabstract.h"4#include "waveformrenderersignalbase.h"
5#include "waveformsignalcolors.h"
6
7#include <QBrush>
8
9#include <vector>
105
11class ControlObject;6class ControlObject;
127
13class GLWaveformRendererFilteredSignal : public WaveformRendererAbstract {8class GLWaveformRendererFilteredSignal : public WaveformRendererSignalBase {
14 public:9 public:
15 explicit GLWaveformRendererFilteredSignal( WaveformWidgetRenderer* waveformWidgetRenderer);10 explicit GLWaveformRendererFilteredSignal( WaveformWidgetRenderer* waveformWidgetRenderer);
16 virtual ~GLWaveformRendererFilteredSignal();11 virtual ~GLWaveformRendererFilteredSignal();
1712
18 virtual void init();13 virtual void onInit();
19 virtual void setup(const QDomNode &node);14 virtual void onSetup(const QDomNode &node);
20 virtual void draw(QPainter* painter, QPaintEvent* event);15 virtual void draw(QPainter* painter, QPaintEvent* event);
21
22 protected:
23 virtual void onResize();
24 int buildPolygon();
25
26 protected:
27 ControlObject* m_lowFilterControlObject;
28 ControlObject* m_midFilterControlObject;
29 ControlObject* m_highFilterControlObject;
30
31 ControlObject* m_lowKillControlObject;
32 ControlObject* m_midKillControlObject;
33 ControlObject* m_highKillControlObject;
34
35 WaveformSignalColors m_colors;
36 Qt::Alignment m_alignment;
37
38 QBrush m_lowBrush;
39 QBrush m_midBrush;
40 QBrush m_highBrush;
41 QBrush m_lowKilledBrush;
42 QBrush m_midKilledBrush;
43 QBrush m_highKilledBrush;
44
45 std::vector<QPointF> m_polygon[3];
46};16};
4717
48#endif // GLWAVEFROMRENDERERFILTEREDSIGNAL_H18#endif // GLWAVEFROMRENDERERFILTEREDSIGNAL_H
4919
=== modified file 'mixxx/src/waveform/renderers/glwaveformrenderersimplesignal.cpp'
--- mixxx/src/waveform/renderers/glwaveformrenderersimplesignal.cpp 2012-04-19 02:13:58 +0000
+++ mixxx/src/waveform/renderers/glwaveformrenderersimplesignal.cpp 2012-05-17 02:22:20 +0000
@@ -3,43 +3,23 @@
3#include "waveformwidgetrenderer.h"3#include "waveformwidgetrenderer.h"
4#include "waveform/waveform.h"4#include "waveform/waveform.h"
55
6#include "widget/wwidget.h"6#include "waveform/waveformwidgetfactory.h"
7#include "trackinfoobject.h"7
88#include <qgl.h>
9#include <QLinearGradient>9
1010GLWaveformRendererSimpleSignal::GLWaveformRendererSimpleSignal(
11GLWaveformRendererSimpleSignal::GLWaveformRendererSimpleSignal( WaveformWidgetRenderer* waveformWidgetRenderer) :11 WaveformWidgetRenderer* waveformWidgetRenderer)
12 WaveformRendererAbstract( waveformWidgetRenderer) {12 : WaveformRendererSignalBase(waveformWidgetRenderer) {
1313
14}14}
1515
16GLWaveformRendererSimpleSignal::~GLWaveformRendererSimpleSignal(){16GLWaveformRendererSimpleSignal::~GLWaveformRendererSimpleSignal(){
17}17}
1818
19void GLWaveformRendererSimpleSignal::init(){19void GLWaveformRendererSimpleSignal::onInit() {
20}20}
2121
22void GLWaveformRendererSimpleSignal::setup(const QDomNode &node){22void GLWaveformRendererSimpleSignal::onSetup(const QDomNode &node){
23 m_colors.setup(node);
24
25 QString alignString = WWidget::selectNodeQString(node, "Align");
26 if (alignString == "bottom") {
27 m_alignment = Qt::AlignBottom;
28 } else if (alignString == "top") {
29 m_alignment = Qt::AlignTop;
30 } else {
31 m_alignment = Qt::AlignCenter;
32 }
33
34 QColor signalColor = m_colors.getSignalColor();
35 signalColor.setAlphaF(0.8);
36
37 QColor bornderColor = m_colors.getSignalColor().lighter(125);
38 bornderColor.setAlphaF(0.5);
39 m_borderPen.setColor(bornderColor);
40 m_borderPen.setWidthF(1.25);
41
42 m_brush = QBrush(signalColor);
43}23}
4424
45inline void setPoint(QPointF& point, qreal x, qreal y) {25inline void setPoint(QPointF& point, qreal x, qreal y) {
@@ -69,160 +49,115 @@
69 return;49 return;
70 }50 }
7151
72 painter->save();52 double firstVisualIndex = m_waveformRenderer->getFirstDisplayedPosition() * dataSize;
7353 double lastVisualIndex = m_waveformRenderer->getLastDisplayedPosition() * dataSize;
74 painter->setRenderHint(QPainter::Antialiasing);54
75 painter->resetTransform();55 const int firstIndex = int(firstVisualIndex+0.5);
7656 firstVisualIndex = firstIndex - firstIndex%2;
77 if (m_alignment == Qt::AlignTop) {57
78 painter->translate(0.0,0.0);58 const int lastIndex = int(lastVisualIndex+0.5);
79 painter->scale(1.0,2.0*m_waveformRenderer->getGain()*(double)m_waveformRenderer->getHeight()/255.0);59 lastVisualIndex = lastIndex + lastIndex%2;
80 } else if (m_alignment == Qt::AlignBottom) {60
81 painter->translate(0.0,m_waveformRenderer->getHeight());61 // save the GL state set for QPainter
82 painter->scale(1.0,2.0*m_waveformRenderer->getGain()*(double)m_waveformRenderer->getHeight()/255.0);62 painter->beginNativePainting();
83 } else {63
84 painter->translate(0.0,m_waveformRenderer->getHeight()/2.0);64 glEnable(GL_BLEND);
85 painter->scale(1.0,1.0*m_waveformRenderer->getGain()*(double)m_waveformRenderer->getHeight()/255.0);65 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
86 }66
8767 const QColor& color = m_colors.getSignalColor();
88 const double firstVisualIndex = m_waveformRenderer->getFirstDisplayedPosition() * dataSize;68
89 const double lastVisualIndex = m_waveformRenderer->getLastDisplayedPosition() * dataSize;69 WaveformWidgetFactory* factory = WaveformWidgetFactory::instance();
90 int pointIndex = 0;70 const double visualGain = factory->getVisualGain(::WaveformWidgetFactory::All);
91 setPoint(m_polygon[pointIndex], 0.0, 0.0);71
92 pointIndex++;72 float maxAll[2];
9373
94 const double offset = firstVisualIndex;74 glPushMatrix();
9575
96 // Represents the # of waveform data points per horizontal pixel.76 if( m_alignment == Qt::AlignCenter) {
97 const double gain = (lastVisualIndex - firstVisualIndex) /77 glMatrixMode(GL_PROJECTION);
98 (double)m_waveformRenderer->getWidth();78 glLoadIdentity();
9979 glOrtho(firstVisualIndex, lastVisualIndex, -255.0, 255.0, -10.0, 10.0);
100 // The number of visual samples that should be represented within one pixel80
101 // given our current zoom level (this shoud be an dinterger in the 'simple' version81 glMatrixMode(GL_MODELVIEW);
102 const double visualSamplePerPixel = m_waveformRenderer->getVisualSamplePerPixel();82 glLoadIdentity();
10383
104 //NOTE(vrince) Please help me find a better name for "channelSeparation"84 glScalef(1.f,2.f*visualGain*m_waveformRenderer->getGain(),1.f);
105 //this variable stand for merged channel ... 1 = merged & 2 = separated85
106 int channelSeparation = 2;86 glLineWidth(1.0);
107 if (m_alignment != Qt::AlignCenter)87 glDisable(GL_LINE_SMOOTH);
108 channelSeparation = 1;88
10989 //draw reference line
110 for (int channel = 0; channel < channelSeparation; ++channel) {90 glBegin(GL_LINES); {
111 int startPixel = 0;91 glColor4f(m_axesColor.redF(),m_axesColor.greenF(),m_axesColor.blueF(),m_axesColor.alphaF());
112 int endPixel = m_waveformRenderer->getWidth() - 1;92 glVertex2f(firstVisualIndex,0);
113 int delta = 1;93 glVertex2f(lastVisualIndex,0);
114 double direction = 1.0;94 }
11595 glEnd();
116 //Reverse display for merged bottom channel96
117 if (m_alignment == Qt::AlignBottom)97 glLineWidth(1.1);
118 direction = -1.0;98 glEnable(GL_LINE_SMOOTH);
11999
120 if (channel == 1) {100 glBegin(GL_LINES); {
121 startPixel = m_waveformRenderer->getWidth() - 1;101 for( int visualIndex = firstVisualIndex;
122 endPixel = 0;102 visualIndex < lastVisualIndex;
123 delta = -1;103 visualIndex += 2) {
124 direction = -1.0;104
125105 if( visualIndex < 0)
126 // After preparing the first channel, insert the pivot point.106 continue;
127 setPoint(m_polygon[pointIndex], m_waveformRenderer->getWidth(), 0.0);107
128 pointIndex++;108 if( visualIndex > dataSize - 1)
129 }109 break;
130110
131 for (int x = startPixel;111 maxAll[0] = (float)data[visualIndex].filtered.all;
132 (startPixel < endPixel) ? (x <= endPixel) : (x >= endPixel);112 maxAll[1] = (float)data[visualIndex+1].filtered.all;
133 x += delta) {113 glColor4f(color.redF(),color.greenF(),color.blueF(),0.9);
134114 glVertex2f(visualIndex,maxAll[0]);
135 // TODO(rryan) remove before 1.11 release. I'm seeing crashes115 glVertex2f(visualIndex,-1.f*maxAll[1]);
136 // sometimes where the pointIndex is very very large. It hasn't come116 }
137 // back since adding locking, but I'm leaving this so that we can117 }
138 // get some info about it before crashing. (The crash usually118 glEnd();
139 // corrupts a lot of the stack).119 } else { //top || bottom
140 if (pointIndex > 2*m_waveformRenderer->getWidth()+2) {120 glMatrixMode(GL_PROJECTION);
141 qDebug() << "OUT OF CONTROL"121 glLoadIdentity();
142 << 2*m_waveformRenderer->getWidth()+2122 if( m_alignment == Qt::AlignBottom)
143 << dataSize123 glOrtho(firstVisualIndex, lastVisualIndex, 0.0, 255.0, -10.0, 10.0);
144 << channel << pointIndex << x;124 else
145 }125 glOrtho(firstVisualIndex, lastVisualIndex, 255.0, 0.0, -10.0, 10.0);
146126
147 // Width of the x position in visual indices.127 glMatrixMode(GL_MODELVIEW);
148 const double xSampleWidth = gain * x;128 glLoadIdentity();
149129
150 // Effective visual index of x130 glScalef(1.f,visualGain*m_waveformRenderer->getGain(),1.f);
151 const double xVisualSampleIndex = xSampleWidth + offset;131
152132 glLineWidth(1.1);
153 // Our current pixel (x) corresponds to a number of visual samples133 glEnable(GL_LINE_SMOOTH);
154 // (visualSamplerPerPixel) in our waveform object. We take the max of134
155 // all the data points on either side of xVisualSampleIndex within a135 glBegin(GL_LINES); {
156 // window of 'maxSamplingRange' visual samples to measure the maximum136 for( int visualIndex = firstVisualIndex;
157 // data point contained by this pixel.137 visualIndex < lastVisualIndex;
158 double maxSamplingRange = gain / 2.0;138 visualIndex += 2) {
159139
160 // Since xVisualSampleIndex is in visual-samples (e.g. R,L,R,L) we want140 if( visualIndex < 0)
161 // to check +/- maxSamplingRange frames, not samples. To do this, divide141 continue;
162 // xVisualSampleIndex by 2. Since frames indices are integers, we round142
163 // to the nearest integer by adding 0.5 before casting to int.143 if( visualIndex > dataSize - 1)
164 int visualFrameStart = int(xVisualSampleIndex / 2.0 - maxSamplingRange + 0.5);144 break;
165 int visualFrameStop = int(xVisualSampleIndex / 2.0 + maxSamplingRange + 0.5);145
166146 maxAll[0] = (float)data[visualIndex].filtered.all;
167 // If the entire sample range is off the screen then don't calculate a147 maxAll[1] = (float)data[visualIndex+1].filtered.all;
168 // point for this pixel.148 glColor4f(color.redF(),color.greenF(),color.blueF(),0.8);
169 const int lastVisualFrame = dataSize / 2 - 1;149 glVertex2f(float(visualIndex),0.f);
170 if (visualFrameStop < 0 || visualFrameStart > lastVisualFrame) {150 glVertex2f(float(visualIndex),math_max(maxAll[0],maxAll[1]));
171 setPoint(m_polygon[pointIndex], x, 0.0);151 }
172 pointIndex++;152 }
173 continue;153 glEnd();
174 }154 }
175155
176 // We now know that some subset of [visualFrameStart,156 glPopMatrix();
177 // visualFrameStop] lies within the valid range of visual157
178 // frames. Clamp visualFrameStart/Stop to within [0,158 glDisable(GL_BLEND);
179 // lastVisualFrame].159
180 visualFrameStart = math_max(math_min(lastVisualFrame, visualFrameStart), 0);160 painter->endNativePainting();
181 visualFrameStop = math_max(math_min(lastVisualFrame, visualFrameStop), 0);161}
182162
183 int visualIndexStart = visualFrameStart * 2 + channel;
184 int visualIndexStop = visualFrameStop * 2 + channel;
185
186 // if (x == m_waveformRenderer->getWidth() / 2) {
187 // qDebug() << "audioVisualRatio" << waveform->getAudioVisualRatio();
188 // qDebug() << "visualSampleRate" << waveform->getVisualSampleRate();
189 // qDebug() << "audioSamplesPerVisualPixel" << waveform->getAudioSamplesPerVisualSample();
190 // qDebug() << "visualSamplePerPixel" << visualSamplePerPixel;
191 // qDebug() << "xSampleWidth" << xSampleWidth;
192 // qDebug() << "xVisualSampleIndex" << xVisualSampleIndex;
193 // qDebug() << "maxSamplingRange" << maxSamplingRange;;
194 // qDebug() << "Sampling pixel " << x << "over [" << visualIndexStart << visualIndexStop << "]";
195 // }
196
197 unsigned char maxAll = 0;
198
199 for (int i = visualIndexStart; i >= 0 && i < dataSize && i <= visualIndexStop;
200 i += channelSeparation) {
201 const WaveformData& waveformData = *(data + i);
202 unsigned char all = waveformData.filtered.all;
203 maxAll = math_max(maxAll, all);
204 }
205
206 setPoint(m_polygon[pointIndex], x, (float)maxAll*direction);
207 pointIndex++;
208 }
209 }
210
211 //If channel are not displayed separatly we nne to close the loop properly
212 if (channelSeparation == 1) {
213 setPoint(m_polygon[pointIndex], m_waveformRenderer->getWidth(), 0.0);
214 pointIndex++;
215 }
216
217 painter->setPen(m_borderPen);
218 painter->setBrush(m_brush);
219
220 painter->drawPolygon(&m_polygon[0], pointIndex);
221
222 painter->restore();
223}
224
225void GLWaveformRendererSimpleSignal::onResize() {
226 m_polygon.resize(2*m_waveformRenderer->getWidth()+2);
227}
228163
229164
=== modified file 'mixxx/src/waveform/renderers/glwaveformrenderersimplesignal.h'
--- mixxx/src/waveform/renderers/glwaveformrenderersimplesignal.h 2012-04-12 22:03:01 +0000
+++ mixxx/src/waveform/renderers/glwaveformrenderersimplesignal.h 2012-05-17 02:22:20 +0000
@@ -1,35 +1,18 @@
1#ifndef GLWAVEFORMRENDERERSIMPLESIGNAL_H1#ifndef GLWAVEFORMRENDERERSIMPLESIGNAL_H
2#define GLWAVEFORMRENDERERSIMPLESIGNAL_H2#define GLWAVEFORMRENDERERSIMPLESIGNAL_H
33
4#include "waveformrendererabstract.h"4#include "waveformrenderersignalbase.h"
5#include "waveformsignalcolors.h"
6
7#include <QBrush>
8#include <QPen>
9
10#include <vector>
115
12class ControlObject;6class ControlObject;
137
14class GLWaveformRendererSimpleSignal : public WaveformRendererAbstract {8class GLWaveformRendererSimpleSignal : public WaveformRendererSignalBase {
15public:9public:
16 explicit GLWaveformRendererSimpleSignal( WaveformWidgetRenderer* waveformWidgetRenderer);10 explicit GLWaveformRendererSimpleSignal( WaveformWidgetRenderer* waveformWidgetRenderer);
17 virtual ~GLWaveformRendererSimpleSignal();11 virtual ~GLWaveformRendererSimpleSignal();
1812
19 virtual void init();13 virtual void onInit();
20 virtual void setup(const QDomNode &node);14 virtual void onSetup(const QDomNode &node);
21 virtual void draw(QPainter* painter, QPaintEvent* event);15 virtual void draw(QPainter* painter, QPaintEvent* event);
22
23protected:
24 virtual void onResize();
25
26private:
27 WaveformSignalColors m_colors;
28 Qt::Alignment m_alignment;
29
30 QBrush m_brush;
31 QPen m_borderPen;
32 std::vector<QPointF> m_polygon;
33};16};
3417
35#endif // GLWAVEFORMRENDERERSIMPLESIGNAL_H18#endif // GLWAVEFORMRENDERERSIMPLESIGNAL_H
3619
=== added file 'mixxx/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp'
--- mixxx/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp 1970-01-01 00:00:00 +0000
+++ mixxx/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp 2012-05-17 02:22:20 +0000
@@ -0,0 +1,346 @@
1#include "qtwaveformrendererfilteredsignal.h"
2
3#include "controlobjectthreadmain.h"
4#include "waveformwidgetrenderer.h"
5#include "waveform/waveform.h"
6#include "waveform/waveformwidgetfactory.h"
7
8#include "trackinfoobject.h"
9#include "defs.h"
10
11#include <QLineF>
12#include <QLinearGradient>
13
14QtWaveformRendererFilteredSignal::QtWaveformRendererFilteredSignal(
15 WaveformWidgetRenderer* waveformWidgetRenderer)
16 : WaveformRendererSignalBase(waveformWidgetRenderer) {
17}
18
19QtWaveformRendererFilteredSignal::~QtWaveformRendererFilteredSignal() {
20
21}
22
23void QtWaveformRendererFilteredSignal::onInit() {
24
25}
26
27void QtWaveformRendererFilteredSignal::onSetup(const QDomNode& /*node*/) {
28 QColor low = m_colors.getLowColor();
29 QColor mid = m_colors.getMidColor();
30 QColor high = m_colors.getHighColor();
31
32 QColor lowCenter = low;
33 QColor midCenter = mid;
34 QColor highCenter = high;
35
36 low.setAlphaF(0.9);
37 mid.setAlphaF(0.9);
38 high.setAlphaF(0.9);
39
40 lowCenter.setAlphaF(0.5);
41 midCenter.setAlphaF(0.5);
42 highCenter.setAlphaF(0.5);
43
44 QLinearGradient gradientLow(QPointF(0.0,-255.0/2.0),QPointF(0.0,255.0/2.0));
45 gradientLow.setColorAt(0.0, low);
46 gradientLow.setColorAt(0.25,low.lighter(85));
47 gradientLow.setColorAt(0.5, lowCenter.darker(115));
48 gradientLow.setColorAt(0.75,low.lighter(85));
49 gradientLow.setColorAt(1.0, low);
50 m_lowBrush = QBrush(gradientLow);
51
52 QLinearGradient gradientMid(QPointF(0.0,-255.0/2.0),QPointF(0.0,255.0/2.0));
53 gradientMid.setColorAt(0.0, mid);
54 gradientMid.setColorAt(0.35,mid.lighter(85));
55 gradientMid.setColorAt(0.5, midCenter.darker(115));
56 gradientMid.setColorAt(0.65,mid.lighter(85));
57 gradientMid.setColorAt(1.0, mid);
58 m_midBrush = QBrush(gradientMid);
59
60 QLinearGradient gradientHigh(QPointF(0.0,-255.0/2.0),QPointF(0.0,255.0/2.0));
61 gradientHigh.setColorAt(0.0, high);
62 gradientHigh.setColorAt(0.45,high.lighter(85));
63 gradientHigh.setColorAt(0.5, highCenter.darker(115));
64 gradientHigh.setColorAt(0.55,high.lighter(85));
65 gradientHigh.setColorAt(1.0, high);
66 m_highBrush = QBrush(gradientHigh);
67
68 low.setAlphaF(0.3);
69 mid.setAlphaF(0.3);
70 high.setAlphaF(0.3);
71
72 QLinearGradient gradientKilledLow(QPointF(0.0,-255.0/2.0),QPointF(0.0,255.0/2.0));
73 gradientKilledLow.setColorAt(0.0,low.darker(80));
74 gradientKilledLow.setColorAt(0.5,lowCenter.darker(150));
75 gradientKilledLow.setColorAt(1.0,low.darker(80));
76 m_lowKilledBrush = QBrush(gradientKilledLow);
77
78 QLinearGradient gradientKilledMid(QPointF(0.0,-255.0/2.0),QPointF(0.0,255.0/2.0));
79 gradientKilledMid.setColorAt(0.0,mid.darker(80));
80 gradientKilledMid.setColorAt(0.5,midCenter.darker(150));
81 gradientKilledMid.setColorAt(1.0,mid.darker(80));
82 m_midKilledBrush = QBrush(gradientKilledMid);
83
84 QLinearGradient gradientKilledHigh(QPointF(0.0,-255.0/2.0),QPointF(0.0,255.0/2.0));
85 gradientKilledHigh.setColorAt(0.0,high.darker(80));
86 gradientKilledHigh.setColorAt(0.5,highCenter.darker(150));
87 gradientKilledHigh.setColorAt(1.0,high.darker(80));
88 m_highKilledBrush = QBrush(gradientKilledHigh);
89}
90
91void QtWaveformRendererFilteredSignal::onResize() {
92 m_polygon[0].resize(2*m_waveformRenderer->getWidth()+2);
93 m_polygon[1].resize(2*m_waveformRenderer->getWidth()+2);
94 m_polygon[2].resize(2*m_waveformRenderer->getWidth()+2);
95}
96
97inline void setPoint(QPointF& point, qreal x, qreal y) {
98 point.setX(x);
99 point.setY(y);
100}
101
102int QtWaveformRendererFilteredSignal::buildPolygon() {
103 // We have to check the track is present because it might have been unloaded
104 // between the call to draw and the call to buildPolygon
105 TrackPointer pTrack = m_waveformRenderer->getTrackInfo();
106 if (!pTrack) {
107 return 0;
108 }
109
110 const Waveform* waveform = pTrack->getWaveform();
111 if (waveform == NULL) {
112 return 0;
113 }
114
115 const int dataSize = waveform->getDataSize();
116 if (dataSize <= 1) {
117 return 0;
118 }
119
120 const WaveformData* data = waveform->data();
121 if (data == NULL) {
122 return 0;
123 }
124
125 const double firstVisualIndex = m_waveformRenderer->getFirstDisplayedPosition() * dataSize;
126 const double lastVisualIndex = m_waveformRenderer->getLastDisplayedPosition() * dataSize;
127 int pointIndex = 0;
128 setPoint(m_polygon[0][pointIndex], 0.0, 0.0);
129 setPoint(m_polygon[1][pointIndex], 0.0, 0.0);
130 setPoint(m_polygon[2][pointIndex], 0.0, 0.0);
131 pointIndex++;
132
133 const double offset = firstVisualIndex;
134
135 // Represents the # of waveform data points per horizontal pixel.
136 const double gain = (lastVisualIndex - firstVisualIndex) /
137 (double)m_waveformRenderer->getWidth();
138
139 // Per-band gain from the EQ knobs.
140 float lowGain(1.0), midGain(1.0), highGain(1.0);
141 if (m_lowFilterControlObject &&
142 m_midFilterControlObject &&
143 m_highFilterControlObject) {
144 lowGain = m_lowFilterControlObject->get();
145 midGain = m_midFilterControlObject->get();
146 highGain = m_highFilterControlObject->get();
147 }
148
149 //apply separate visual gain
150 WaveformWidgetFactory* factory = WaveformWidgetFactory::instance();
151 lowGain *= factory->getVisualGain(WaveformWidgetFactory::Low);
152 midGain *= factory->getVisualGain(WaveformWidgetFactory::Mid);
153 highGain *= factory->getVisualGain(WaveformWidgetFactory::High);
154
155 //NOTE(vrince) Please help me find a better name for "channelSeparation"
156 //this variable stand for merged channel ... 1 = merged & 2 = separated
157 int channelSeparation = 2;
158 if (m_alignment != Qt::AlignCenter)
159 channelSeparation = 1;
160
161 for (int channel = 0; channel < channelSeparation; ++channel) {
162 int startPixel = 0;
163 int endPixel = m_waveformRenderer->getWidth() - 1;
164 int delta = 1;
165 double direction = 1.0;
166
167 //Reverse display for merged bottom channel
168 if (m_alignment == Qt::AlignBottom)
169 direction = -1.0;
170
171 if (channel == 1) {
172 startPixel = m_waveformRenderer->getWidth() - 1;
173 endPixel = 0;
174 delta = -1;
175 direction = -1.0;
176
177 // After preparing the first channel, insert the pivot point.
178 setPoint(m_polygon[0][pointIndex], m_waveformRenderer->getWidth(), 0.0);
179 setPoint(m_polygon[1][pointIndex], m_waveformRenderer->getWidth(), 0.0);
180 setPoint(m_polygon[2][pointIndex], m_waveformRenderer->getWidth(), 0.0);
181 pointIndex++;
182 }
183
184 for (int x = startPixel;
185 (startPixel < endPixel) ? (x <= endPixel) : (x >= endPixel);
186 x += delta) {
187
188 // TODO(rryan) remove before 1.11 release. I'm seeing crashes
189 // sometimes where the pointIndex is very very large. It hasn't come
190 // back since adding locking, but I'm leaving this so that we can
191 // get some info about it before crashing. (The crash usually
192 // corrupts a lot of the stack).
193 if (pointIndex > 2*m_waveformRenderer->getWidth()+2) {
194 qDebug() << "OUT OF CONTROL"
195 << 2*m_waveformRenderer->getWidth()+2
196 << dataSize
197 << channel << pointIndex << x;
198 }
199
200 // Width of the x position in visual indices.
201 const double xSampleWidth = gain * x;
202
203 // Effective visual index of x
204 const double xVisualSampleIndex = xSampleWidth + offset;
205
206 // Our current pixel (x) corresponds to a number of visual samples
207 // (visualSamplerPerPixel) in our waveform object. We take the max of
208 // all the data points on either side of xVisualSampleIndex within a
209 // window of 'maxSamplingRange' visual samples to measure the maximum
210 // data point contained by this pixel.
211 double maxSamplingRange = gain / 2.0;
212
213 // Since xVisualSampleIndex is in visual-samples (e.g. R,L,R,L) we want
214 // to check +/- maxSamplingRange frames, not samples. To do this, divide
215 // xVisualSampleIndex by 2. Since frames indices are integers, we round
216 // to the nearest integer by adding 0.5 before casting to int.
217 int visualFrameStart = int(xVisualSampleIndex / 2.0 - maxSamplingRange + 0.5);
218 int visualFrameStop = int(xVisualSampleIndex / 2.0 + maxSamplingRange + 0.5);
219
220 // If the entire sample range is off the screen then don't calculate a
221 // point for this pixel.
222 const int lastVisualFrame = dataSize / 2 - 1;
223 if (visualFrameStop < 0 || visualFrameStart > lastVisualFrame) {
224 setPoint(m_polygon[0][pointIndex], x, 0.0);
225 setPoint(m_polygon[1][pointIndex], x, 0.0);
226 setPoint(m_polygon[2][pointIndex], x, 0.0);
227 pointIndex++;
228 continue;
229 }
230
231 // We now know that some subset of [visualFrameStart,
232 // visualFrameStop] lies within the valid range of visual
233 // frames. Clamp visualFrameStart/Stop to within [0,
234 // lastVisualFrame].
235 visualFrameStart = math_max(math_min(lastVisualFrame, visualFrameStart), 0);
236 visualFrameStop = math_max(math_min(lastVisualFrame, visualFrameStop), 0);
237
238 int visualIndexStart = visualFrameStart * 2 + channel;
239 int visualIndexStop = visualFrameStop * 2 + channel;
240
241 // if (x == m_waveformRenderer->getWidth() / 2) {
242 // qDebug() << "audioVisualRatio" << waveform->getAudioVisualRatio();
243 // qDebug() << "visualSampleRate" << waveform->getVisualSampleRate();
244 // qDebug() << "audioSamplesPerVisualPixel" << waveform->getAudioSamplesPerVisualSample();
245 // qDebug() << "visualSamplePerPixel" << visualSamplePerPixel;
246 // qDebug() << "xSampleWidth" << xSampleWidth;
247 // qDebug() << "xVisualSampleIndex" << xVisualSampleIndex;
248 // qDebug() << "maxSamplingRange" << maxSamplingRange;;
249 // qDebug() << "Sampling pixel " << x << "over [" << visualIndexStart << visualIndexStop << "]";
250 // }
251
252 unsigned char maxLow = 0;
253 unsigned char maxBand = 0;
254 unsigned char maxHigh = 0;
255
256 for (int i = visualIndexStart; i >= 0 && i < dataSize && i <= visualIndexStop;
257 i += channelSeparation) {
258 const WaveformData& waveformData = *(data + i);
259 unsigned char low = waveformData.filtered.low;
260 unsigned char mid = waveformData.filtered.mid;
261 unsigned char high = waveformData.filtered.high;
262 maxLow = math_max(maxLow, low);
263 maxBand = math_max(maxBand, mid);
264 maxHigh = math_max(maxHigh, high);
265 }
266
267 setPoint(m_polygon[0][pointIndex], x, (float)maxLow*lowGain*direction);
268 setPoint(m_polygon[1][pointIndex], x, (float)maxBand*midGain*direction);
269 setPoint(m_polygon[2][pointIndex], x, (float)maxHigh*highGain*direction);
270 pointIndex++;
271 }
272 }
273
274 //If channel are not displyed separatly we nne to close the loop properly
275 if (channelSeparation == 1) {
276 setPoint(m_polygon[0][pointIndex], m_waveformRenderer->getWidth(), 0.0);
277 setPoint(m_polygon[1][pointIndex], m_waveformRenderer->getWidth(), 0.0);
278 setPoint(m_polygon[2][pointIndex], m_waveformRenderer->getWidth(), 0.0);
279 pointIndex++;
280 }
281
282 return pointIndex;
283}
284
285void QtWaveformRendererFilteredSignal::draw(QPainter* painter, QPaintEvent* /*event*/) {
286 const TrackPointer pTrack = m_waveformRenderer->getTrackInfo();
287 if (!pTrack)
288 return;
289
290 painter->save();
291
292 painter->setRenderHint(QPainter::Antialiasing);
293 painter->resetTransform();
294
295 //visual gain
296 WaveformWidgetFactory* factory = WaveformWidgetFactory::instance();
297 double visualGain = factory->getVisualGain(::WaveformWidgetFactory::All);
298
299 if (m_alignment == Qt::AlignTop) {
300 painter->translate(0.0,0.0);
301 painter->scale(1.0,2.0*visualGain*m_waveformRenderer->getGain()*(double)m_waveformRenderer->getHeight()/255.0);
302 } else if (m_alignment == Qt::AlignBottom) {
303 painter->translate(0.0,m_waveformRenderer->getHeight());
304 painter->scale(1.0,2.0*visualGain*m_waveformRenderer->getGain()*(double)m_waveformRenderer->getHeight()/255.0);
305 } else {
306 painter->translate(0.0,m_waveformRenderer->getHeight()/2.0);
307 painter->scale(1.0,1.0*visualGain*m_waveformRenderer->getGain()*(double)m_waveformRenderer->getHeight()/255.0);
308 }
309
310 //draw reference line
311 if( m_alignment == Qt::AlignCenter) {
312 painter->setPen(m_axesColor);
313 painter->drawLine(0,0,m_waveformRenderer->getWidth(),0);
314 }
315
316 int numberOfPoints = buildPolygon();
317
318 if (m_lowKillControlObject && m_lowKillControlObject->get() > 0.1) {
319 painter->setPen(QPen(m_lowKilledBrush, 0.0));
320 painter->setBrush(QColor(150,150,150,20));
321 } else {
322 painter->setPen(QPen(m_lowBrush, 0.0));
323 painter->setBrush(m_lowBrush);
324 }
325 painter->drawPolygon(&m_polygon[0][0],numberOfPoints);
326
327 if (m_midKillControlObject && m_midKillControlObject->get() > 0.1) {
328 painter->setPen(QPen(m_midKilledBrush, 0.0));
329 painter->setBrush(QColor(150,150,150,20));
330 } else {
331 painter->setPen(QPen(m_midBrush, 0.0));
332 painter->setBrush(m_midBrush);
333 }
334 painter->drawPolygon(&m_polygon[1][0],numberOfPoints);
335
336 if (m_highKillControlObject && m_highKillControlObject->get() > 0.1) {
337 painter->setPen(QPen(m_highKilledBrush, 0.0));
338 painter->setBrush(QColor(150,150,150,20));
339 } else {
340 painter->setPen(QPen(m_highBrush, 0.0));
341 painter->setBrush(m_highBrush);
342 }
343 painter->drawPolygon(&m_polygon[2][0],numberOfPoints);
344
345 painter->restore();
346}
0347
=== added file 'mixxx/src/waveform/renderers/qtwaveformrendererfilteredsignal.h'
--- mixxx/src/waveform/renderers/qtwaveformrendererfilteredsignal.h 1970-01-01 00:00:00 +0000
+++ mixxx/src/waveform/renderers/qtwaveformrendererfilteredsignal.h 2012-05-17 02:22:20 +0000
@@ -0,0 +1,36 @@
1#ifndef QTWAVEFROMRENDERERFILTEREDSIGNAL_H
2#define QTWAVEFROMRENDERERFILTEREDSIGNAL_H
3
4#include "waveformrenderersignalbase.h"
5
6#include <QBrush>
7
8#include <vector>
9
10class ControlObject;
11
12class QtWaveformRendererFilteredSignal : public WaveformRendererSignalBase {
13 public:
14 explicit QtWaveformRendererFilteredSignal( WaveformWidgetRenderer* waveformWidgetRenderer);
15 virtual ~QtWaveformRendererFilteredSignal();
16
17 virtual void onInit();
18 virtual void onSetup(const QDomNode &node);
19 virtual void draw(QPainter* painter, QPaintEvent* event);
20
21 protected:
22 virtual void onResize();
23 int buildPolygon();
24
25 protected:
26 QBrush m_lowBrush;
27 QBrush m_midBrush;
28 QBrush m_highBrush;
29 QBrush m_lowKilledBrush;
30 QBrush m_midKilledBrush;
31 QBrush m_highKilledBrush;
32
33 std::vector<QPointF> m_polygon[3];
34};
35
36#endif // QTWAVEFROMRENDERERFILTEREDSIGNAL_H
037
=== added file 'mixxx/src/waveform/renderers/qtwaveformrenderersimplesignal.cpp'
--- mixxx/src/waveform/renderers/qtwaveformrenderersimplesignal.cpp 1970-01-01 00:00:00 +0000
+++ mixxx/src/waveform/renderers/qtwaveformrenderersimplesignal.cpp 2012-05-17 02:22:20 +0000
@@ -0,0 +1,223 @@
1#include "qtwaveformrenderersimplesignal.h"
2
3#include "waveformwidgetrenderer.h"
4#include "waveform/waveform.h"
5#include "waveform/waveformwidgetfactory.h"
6
7#include "widget/wwidget.h"
8#include "trackinfoobject.h"
9
10#include <QLinearGradient>
11
12QtWaveformRendererSimpleSignal::QtWaveformRendererSimpleSignal( WaveformWidgetRenderer* waveformWidgetRenderer) :
13 WaveformRendererSignalBase( waveformWidgetRenderer) {
14
15}
16
17QtWaveformRendererSimpleSignal::~QtWaveformRendererSimpleSignal(){
18}
19
20void QtWaveformRendererSimpleSignal::onInit(){
21}
22
23void QtWaveformRendererSimpleSignal::onSetup(const QDomNode &node){
24 QColor signalColor = m_colors.getSignalColor();
25 signalColor.setAlphaF(0.8);
26
27 QColor bornderColor = m_colors.getSignalColor().lighter(125);
28 bornderColor.setAlphaF(0.5);
29 m_borderPen.setColor(bornderColor);
30 m_borderPen.setWidthF(1.25);
31
32 m_brush = QBrush(signalColor);
33}
34
35inline void setPoint(QPointF& point, qreal x, qreal y) {
36 point.setX(x);
37 point.setY(y);
38}
39
40void QtWaveformRendererSimpleSignal::draw(QPainter* painter, QPaintEvent* /*event*/){
41
42 TrackPointer pTrack = m_waveformRenderer->getTrackInfo();
43 if (!pTrack) {
44 return;
45 }
46
47 const Waveform* waveform = pTrack->getWaveform();
48 if (waveform == NULL) {
49 return;
50 }
51
52 const int dataSize = waveform->getDataSize();
53 if (dataSize <= 1) {
54 return;
55 }
56
57 const WaveformData* data = waveform->data();
58 if (data == NULL) {
59 return;
60 }
61
62 painter->save();
63
64 painter->setRenderHint(QPainter::Antialiasing);
65 painter->resetTransform();
66
67 WaveformWidgetFactory* factory = WaveformWidgetFactory::instance();
68 const double visualGain = factory->getVisualGain(WaveformWidgetFactory::All);
69
70 if (m_alignment == Qt::AlignTop) {
71 painter->translate(0.0,0.0);
72 painter->scale(1.0,2.0*visualGain*m_waveformRenderer->getGain()*(double)m_waveformRenderer->getHeight()/255.0);
73 } else if (m_alignment == Qt::AlignBottom) {
74 painter->translate(0.0,m_waveformRenderer->getHeight());
75 painter->scale(1.0,2.0*visualGain*m_waveformRenderer->getGain()*(double)m_waveformRenderer->getHeight()/255.0);
76 } else {
77 painter->translate(0.0,m_waveformRenderer->getHeight()/2.0);
78 painter->scale(1.0,1.0*visualGain*m_waveformRenderer->getGain()*(double)m_waveformRenderer->getHeight()/255.0);
79 }
80
81 //draw reference line
82 if( m_alignment == Qt::AlignCenter) {
83 painter->setPen(m_axesColor);
84 painter->drawLine(0,0,m_waveformRenderer->getWidth(),0);
85 }
86
87 const double firstVisualIndex = m_waveformRenderer->getFirstDisplayedPosition() * dataSize;
88 const double lastVisualIndex = m_waveformRenderer->getLastDisplayedPosition() * dataSize;
89 int pointIndex = 0;
90 setPoint(m_polygon[pointIndex], 0.0, 0.0);
91 pointIndex++;
92
93 const double offset = firstVisualIndex;
94
95 // Represents the # of waveform data points per horizontal pixel.
96 const double gain = (lastVisualIndex - firstVisualIndex) /
97 (double)m_waveformRenderer->getWidth();
98
99 //NOTE(vrince) Please help me find a better name for "channelSeparation"
100 //this variable stand for merged channel ... 1 = merged & 2 = separated
101 int channelSeparation = 2;
102 if (m_alignment != Qt::AlignCenter)
103 channelSeparation = 1;
104
105 for (int channel = 0; channel < channelSeparation; ++channel) {
106 int startPixel = 0;
107 int endPixel = m_waveformRenderer->getWidth() - 1;
108 int delta = 1;
109 double direction = 1.0;
110
111 //Reverse display for merged bottom channel
112 if (m_alignment == Qt::AlignBottom)
113 direction = -1.0;
114
115 if (channel == 1) {
116 startPixel = m_waveformRenderer->getWidth() - 1;
117 endPixel = 0;
118 delta = -1;
119 direction = -1.0;
120
121 // After preparing the first channel, insert the pivot point.
122 setPoint(m_polygon[pointIndex], m_waveformRenderer->getWidth(), 0.0);
123 pointIndex++;
124 }
125
126 for (int x = startPixel;
127 (startPixel < endPixel) ? (x <= endPixel) : (x >= endPixel);
128 x += delta) {
129
130 // TODO(rryan) remove before 1.11 release. I'm seeing crashes
131 // sometimes where the pointIndex is very very large. It hasn't come
132 // back since adding locking, but I'm leaving this so that we can
133 // get some info about it before crashing. (The crash usually
134 // corrupts a lot of the stack).
135 if (pointIndex > 2*m_waveformRenderer->getWidth()+2) {
136 qDebug() << "OUT OF CONTROL"
137 << 2*m_waveformRenderer->getWidth()+2
138 << dataSize
139 << channel << pointIndex << x;
140 }
141
142 // Width of the x position in visual indices.
143 const double xSampleWidth = gain * x;
144
145 // Effective visual index of x
146 const double xVisualSampleIndex = xSampleWidth + offset;
147
148 // Our current pixel (x) corresponds to a number of visual samples
149 // (visualSamplerPerPixel) in our waveform object. We take the max of
150 // all the data points on either side of xVisualSampleIndex within a
151 // window of 'maxSamplingRange' visual samples to measure the maximum
152 // data point contained by this pixel.
153 double maxSamplingRange = gain / 2.0;
154
155 // Since xVisualSampleIndex is in visual-samples (e.g. R,L,R,L) we want
156 // to check +/- maxSamplingRange frames, not samples. To do this, divide
157 // xVisualSampleIndex by 2. Since frames indices are integers, we round
158 // to the nearest integer by adding 0.5 before casting to int.
159 int visualFrameStart = int(xVisualSampleIndex / 2.0 - maxSamplingRange + 0.5);
160 int visualFrameStop = int(xVisualSampleIndex / 2.0 + maxSamplingRange + 0.5);
161
162 // If the entire sample range is off the screen then don't calculate a
163 // point for this pixel.
164 const int lastVisualFrame = dataSize / 2 - 1;
165 if (visualFrameStop < 0 || visualFrameStart > lastVisualFrame) {
166 setPoint(m_polygon[pointIndex], x, 0.0);
167 pointIndex++;
168 continue;
169 }
170
171 // We now know that some subset of [visualFrameStart,
172 // visualFrameStop] lies within the valid range of visual
173 // frames. Clamp visualFrameStart/Stop to within [0,
174 // lastVisualFrame].
175 visualFrameStart = math_max(math_min(lastVisualFrame, visualFrameStart), 0);
176 visualFrameStop = math_max(math_min(lastVisualFrame, visualFrameStop), 0);
177
178 int visualIndexStart = visualFrameStart * 2 + channel;
179 int visualIndexStop = visualFrameStop * 2 + channel;
180
181 // if (x == m_waveformRenderer->getWidth() / 2) {
182 // qDebug() << "audioVisualRatio" << waveform->getAudioVisualRatio();
183 // qDebug() << "visualSampleRate" << waveform->getVisualSampleRate();
184 // qDebug() << "audioSamplesPerVisualPixel" << waveform->getAudioSamplesPerVisualSample();
185 // qDebug() << "visualSamplePerPixel" << visualSamplePerPixel;
186 // qDebug() << "xSampleWidth" << xSampleWidth;
187 // qDebug() << "xVisualSampleIndex" << xVisualSampleIndex;
188 // qDebug() << "maxSamplingRange" << maxSamplingRange;;
189 // qDebug() << "Sampling pixel " << x << "over [" << visualIndexStart << visualIndexStop << "]";
190 // }
191
192 unsigned char maxAll = 0;
193
194 for (int i = visualIndexStart; i >= 0 && i < dataSize && i <= visualIndexStop;
195 i += channelSeparation) {
196 const WaveformData& waveformData = *(data + i);
197 unsigned char all = waveformData.filtered.all;
198 maxAll = math_max(maxAll, all);
199 }
200
201 setPoint(m_polygon[pointIndex], x, (float)maxAll*direction);
202 pointIndex++;
203 }
204 }
205
206 //If channel are not displayed separatly we nne to close the loop properly
207 if (channelSeparation == 1) {
208 setPoint(m_polygon[pointIndex], m_waveformRenderer->getWidth(), 0.0);
209 pointIndex++;
210 }
211
212 painter->setPen(m_borderPen);
213 painter->setBrush(m_brush);
214
215 painter->drawPolygon(&m_polygon[0], pointIndex);
216
217 painter->restore();
218}
219
220void QtWaveformRendererSimpleSignal::onResize() {
221 m_polygon.resize(2*m_waveformRenderer->getWidth()+2);
222}
223
0224
=== added file 'mixxx/src/waveform/renderers/qtwaveformrenderersimplesignal.h'
--- mixxx/src/waveform/renderers/qtwaveformrenderersimplesignal.h 1970-01-01 00:00:00 +0000
+++ mixxx/src/waveform/renderers/qtwaveformrenderersimplesignal.h 2012-05-17 02:22:20 +0000
@@ -0,0 +1,31 @@
1#ifndef QTWAVEFORMRENDERERSIMPLESIGNAL_H
2#define QTWAVEFORMRENDERERSIMPLESIGNAL_H
3
4#include "waveformrenderersignalbase.h"
5
6#include <QBrush>
7#include <QPen>
8
9#include <vector>
10
11class ControlObject;
12
13class QtWaveformRendererSimpleSignal : public WaveformRendererSignalBase {
14public:
15 explicit QtWaveformRendererSimpleSignal( WaveformWidgetRenderer* waveformWidgetRenderer);
16 virtual ~QtWaveformRendererSimpleSignal();
17
18 virtual void onInit();
19 virtual void onSetup(const QDomNode &node);
20 virtual void draw(QPainter* painter, QPaintEvent* event);
21
22protected:
23 virtual void onResize();
24
25private:
26 QBrush m_brush;
27 QPen m_borderPen;
28 std::vector<QPointF> m_polygon;
29};
30
31#endif // QTWAVEFORMRENDERERSIMPLESIGNAL_H
032
=== modified file 'mixxx/src/waveform/renderers/waveformmark.cpp'
--- mixxx/src/waveform/renderers/waveformmark.cpp 2012-04-10 12:49:54 +0000
+++ mixxx/src/waveform/renderers/waveformmark.cpp 2012-05-17 02:22:20 +0000
@@ -14,10 +14,6 @@
14 QString item = WWidget::selectNodeQString( node, "Control");14 QString item = WWidget::selectNodeQString( node, "Control");
15 m_pointControl = ControlObject::getControl( ConfigKey(group, item));15 m_pointControl = ControlObject::getControl( ConfigKey(group, item));
1616
17 //if there is no control the mark won't be displayed anyway ...
18 if( m_pointControl == 0)
19 return;
20
21 m_color = WWidget::selectNodeQString( node, "Color");17 m_color = WWidget::selectNodeQString( node, "Color");
22 if( m_color == "") {18 if( m_color == "") {
2319
2420
=== modified file 'mixxx/src/waveform/renderers/waveformrendererendoftrack.cpp'
--- mixxx/src/waveform/renderers/waveformrendererendoftrack.cpp 2012-04-29 18:45:39 +0000
+++ mixxx/src/waveform/renderers/waveformrendererendoftrack.cpp 2012-05-17 02:22:20 +0000
@@ -84,10 +84,14 @@
8484
85 m_endOfTrackEnabled = m_endOfTrackControl->get() > 0.5;85 m_endOfTrackEnabled = m_endOfTrackControl->get() > 0.5;
8686
87 //special case of track not long enougth
88 const double trackLength = 0.5 * trackSamples / sampleRate;
89
87 if (sampleRate < 0.1 //not ready90 if (sampleRate < 0.1 //not ready
88 || trackSamples < 0.1 //not ready91 || trackSamples < 0.1 //not ready
89 || m_playControl->get() < 0.5 //not playing92 || m_playControl->get() < 0.5 //not playing
90 || m_loopControl->get() > 0.5 //in loop93 || m_loopControl->get() > 0.5 //in loop
94 || trackLength <= m_remainingTimeTriggerSeconds //track too short
91 ) {95 ) {
92 if(m_endOfTrackEnabled && m_endOfTrackControl->getControlObject()) {96 if(m_endOfTrackEnabled && m_endOfTrackControl->getControlObject()) {
93 m_endOfTrackControl->getControlObject()->set(0.);97 m_endOfTrackControl->getControlObject()->set(0.);
9498
=== modified file 'mixxx/src/waveform/renderers/waveformrendererfilteredsignal.cpp'
--- mixxx/src/waveform/renderers/waveformrendererfilteredsignal.cpp 2012-04-05 03:21:25 +0000
+++ mixxx/src/waveform/renderers/waveformrendererfilteredsignal.cpp 2012-05-17 02:22:20 +0000
@@ -2,6 +2,7 @@
22
3#include "waveformwidgetrenderer.h"3#include "waveformwidgetrenderer.h"
4#include "waveform/waveform.h"4#include "waveform/waveform.h"
5#include "waveform/waveformwidgetfactory.h"
56
6#include "widget/wskincolor.h"7#include "widget/wskincolor.h"
7#include "trackinfoobject.h"8#include "trackinfoobject.h"
@@ -9,15 +10,17 @@
910
10#include "defs.h"11#include "defs.h"
1112
13#include "controlobjectthreadmain.h"
14
12WaveformRendererFilteredSignal::WaveformRendererFilteredSignal(15WaveformRendererFilteredSignal::WaveformRendererFilteredSignal(
13 WaveformWidgetRenderer* waveformWidgetRenderer)16 WaveformWidgetRenderer* waveformWidgetRenderer)
14 : WaveformRendererAbstract( waveformWidgetRenderer) {17 : WaveformRendererSignalBase( waveformWidgetRenderer) {
15}18}
1619
17WaveformRendererFilteredSignal::~WaveformRendererFilteredSignal() {20WaveformRendererFilteredSignal::~WaveformRendererFilteredSignal() {
18}21}
1922
20void WaveformRendererFilteredSignal::init() {23void WaveformRendererFilteredSignal::onInit() {
21}24}
2225
23void WaveformRendererFilteredSignal::onResize() {26void WaveformRendererFilteredSignal::onResize() {
@@ -26,17 +29,8 @@
26 m_highLines.resize(m_waveformRenderer->getWidth());29 m_highLines.resize(m_waveformRenderer->getWidth());
27}30}
2831
29void WaveformRendererFilteredSignal::setup(const QDomNode& node) {32void WaveformRendererFilteredSignal::onSetup(const QDomNode& node) {
30 m_signalColor.setNamedColor(
31 WWidget::selectNodeQString(node, "SignalColor"));
32 m_signalColor = WSkinColor::getCorrectColor(m_signalColor);
3333
34 // TODO(vRince): fetch color from skin
35 int h, s, l;
36 m_signalColor.getHsl(&h, &s, &l);
37 m_lowColor = QColor::fromHsl(h, s, 50, 128);
38 m_midColor = QColor::fromHsl(h-2, s, 100, 128);
39 m_highColor = QColor::fromHsl(h+2, s, 200, 128);
40}34}
4135
42void WaveformRendererFilteredSignal::draw(QPainter* painter,36void WaveformRendererFilteredSignal::draw(QPainter* painter,
@@ -51,7 +45,7 @@
51 return;45 return;
52 }46 }
5347
54 int dataSize = waveform->getDataSize();48 const int dataSize = waveform->getDataSize();
55 if (dataSize <= 1) {49 if (dataSize <= 1) {
56 return;50 return;
57 }51 }
@@ -61,8 +55,6 @@
61 return;55 return;
62 }56 }
6357
64 const double xOffset = 0.5;
65
66 int samplesPerPixel = m_waveformRenderer->getVisualSamplePerPixel();58 int samplesPerPixel = m_waveformRenderer->getVisualSamplePerPixel();
67 int numberOfSamples = m_waveformRenderer->getWidth() * samplesPerPixel;59 int numberOfSamples = m_waveformRenderer->getWidth() * samplesPerPixel;
6860
@@ -78,9 +70,40 @@
78 painter->setRenderHints(QPainter::HighQualityAntialiasing, false);70 painter->setRenderHints(QPainter::HighQualityAntialiasing, false);
79 painter->setRenderHints(QPainter::SmoothPixmapTransform, false);71 painter->setRenderHints(QPainter::SmoothPixmapTransform, false);
80 painter->setWorldMatrixEnabled(false);72 painter->setWorldMatrixEnabled(false);
8173 painter->resetTransform();
82 const float halfHeight = m_waveformRenderer->getHeight()/2.0;74
83 const float heightFactor = halfHeight/255.0;75 // Per-band gain from the EQ knobs.
76 float lowGain(1.0), midGain(1.0), highGain(1.0), allGain(1.0);
77 if (m_lowFilterControlObject &&
78 m_midFilterControlObject &&
79 m_highFilterControlObject) {
80 lowGain = m_lowFilterControlObject->get();
81 midGain = m_midFilterControlObject->get();
82 highGain = m_highFilterControlObject->get();
83 }
84 allGain = m_waveformRenderer->getGain();
85
86 WaveformWidgetFactory* factory = WaveformWidgetFactory::instance();
87 allGain *= factory->getVisualGain(::WaveformWidgetFactory::All);
88 lowGain *= factory->getVisualGain(WaveformWidgetFactory::Low);
89 midGain *= factory->getVisualGain(WaveformWidgetFactory::Mid);
90 highGain *= factory->getVisualGain(WaveformWidgetFactory::High);
91
92 const float halfHeight = (float)m_waveformRenderer->getHeight()/2.0;
93
94 const float heightFactor = m_alignment == Qt::AlignCenter
95 ? 2.0*allGain*halfHeight/255.0
96 : allGain*m_waveformRenderer->getHeight()/255.0;
97
98 //draw reference line
99 if( m_alignment == Qt::AlignCenter) {
100 painter->setPen(m_axesColor);
101 painter->drawLine(0,halfHeight,m_waveformRenderer->getWidth(),halfHeight);
102 }
103
104 int actualLowLineNumber = 0;
105 int actualMidLineNumber = 0;
106 int actualHighLineNumber = 0;
84107
85 for (int i = 0; i < numberOfSamples; i += samplesPerPixel) {108 for (int i = 0; i < numberOfSamples; i += samplesPerPixel) {
86 const int xPos = i/samplesPerPixel;109 const int xPos = i/samplesPerPixel;
@@ -104,25 +127,75 @@
104 maxHigh[1] = math_max(maxHigh[1], waveformDataNext.filtered.high);127 maxHigh[1] = math_max(maxHigh[1], waveformDataNext.filtered.high);
105 }128 }
106129
107 m_lowLines[xPos].setLine(xPos, (int)(halfHeight-heightFactor*(float)maxLow[0]),130 if( maxLow[0] && maxLow[1]) {
108 xPos, (int)(halfHeight+heightFactor*(float)maxLow[1])+1);131 switch( m_alignment) {
109 m_midLines[xPos].setLine(xPos, (int)(halfHeight-heightFactor*(float)maxMid[0]),132 case Qt::AlignBottom :
110 xPos, (int)(halfHeight+heightFactor*(float)maxMid[1]));133 m_lowLines[actualLowLineNumber].setLine(
111 m_highLines[xPos].setLine(xPos, (int)(halfHeight-heightFactor*(float)maxHigh[0]),134 xPos, m_waveformRenderer->getHeight(),
112 xPos, (int)(halfHeight+heightFactor*(float)maxHigh[1]));135 xPos, m_waveformRenderer->getHeight() - (int)(heightFactor*lowGain*(float)math_max(maxLow[0],maxLow[1])));
113 } else {136 break;
114 m_lowLines[xPos].setLine(xPos, halfHeight, xPos, halfHeight+1);137 case Qt::AlignTop :
115 m_midLines[xPos].setLine(xPos, halfHeight, xPos, halfHeight);138 m_lowLines[actualLowLineNumber].setLine(
116 m_highLines[xPos].setLine(xPos, halfHeight, xPos, halfHeight);139 xPos, 0,
140 xPos, (int)(heightFactor*lowGain*(float)math_max(maxLow[0],maxLow[1])));
141 break;
142 default :
143 m_lowLines[actualLowLineNumber].setLine(
144 xPos, (int)(halfHeight-heightFactor*(float)maxLow[0]*lowGain),
145 xPos, (int)(halfHeight+heightFactor*(float)maxLow[1]*lowGain));
146 break;
147 }
148 actualLowLineNumber++;
149 }
150 if( maxMid[0] && maxMid[1]) {
151 switch( m_alignment) {
152 case Qt::AlignBottom :
153 m_midLines[actualMidLineNumber].setLine(
154 xPos, m_waveformRenderer->getHeight(),
155 xPos, m_waveformRenderer->getHeight() - (int)(heightFactor*midGain*(float)math_max(maxMid[0],maxMid[1])));
156 break;
157 case Qt::AlignTop :
158 m_midLines[actualMidLineNumber].setLine(
159 xPos, 0,
160 xPos, (int)(heightFactor*midGain*(float)math_max(maxMid[0],maxMid[1])));
161 break;
162 default :
163 m_midLines[actualMidLineNumber].setLine(
164 xPos, (int)(halfHeight-heightFactor*(float)maxMid[0]*midGain),
165 xPos, (int)(halfHeight+heightFactor*(float)maxMid[1]*midGain));
166 break;
167 }
168 actualMidLineNumber++;
169 }
170 if( maxHigh[0] && maxHigh[1]) {
171 switch( m_alignment) {
172 case Qt::AlignBottom :
173 m_highLines[actualHighLineNumber].setLine(
174 xPos, m_waveformRenderer->getHeight(),
175 xPos, m_waveformRenderer->getHeight() - (int)(heightFactor*highGain*(float)math_max(maxHigh[0],maxHigh[1])));
176 break;
177 case Qt::AlignTop :
178 m_highLines[actualHighLineNumber].setLine(
179 xPos, 0,
180 xPos, (int)(heightFactor*highGain*(float)math_max(maxHigh[0],maxHigh[1])));
181 break;
182 default :
183 m_highLines[actualHighLineNumber].setLine(
184 xPos, (int)(halfHeight-heightFactor*(float)maxHigh[0]*highGain),
185 xPos, (int)(halfHeight+heightFactor*(float)maxHigh[1]*highGain));
186 break;
187 }
188 actualHighLineNumber++;
189 }
117 }190 }
118 }191 }
119192
120 painter->setPen(QPen(QBrush(m_lowColor), 1));193 painter->setPen(QPen(QBrush(m_colors.getLowColor()), 1));
121 painter->drawLines(&m_lowLines[0], m_lowLines.size());194 painter->drawLines(&m_lowLines[0], actualLowLineNumber);
122 painter->setPen(QPen(QBrush(m_midColor), 1));195 painter->setPen(QPen(QBrush(m_colors.getMidColor()), 1));
123 painter->drawLines(&m_midLines[0], m_midLines.size());196 painter->drawLines(&m_midLines[0], actualMidLineNumber);
124 painter->setPen(QPen(QBrush(m_highColor), 1));197 painter->setPen(QPen(QBrush(m_colors.getHighColor()), 1));
125 painter->drawLines(&m_highLines[0], m_highLines.size());198 painter->drawLines(&m_highLines[0], actualHighLineNumber);
126199
127 painter->restore();200 painter->restore();
128}201}
129202
=== modified file 'mixxx/src/waveform/renderers/waveformrendererfilteredsignal.h'
--- mixxx/src/waveform/renderers/waveformrendererfilteredsignal.h 2012-02-26 20:46:51 +0000
+++ mixxx/src/waveform/renderers/waveformrendererfilteredsignal.h 2012-05-17 02:22:20 +0000
@@ -1,32 +1,27 @@
1#ifndef WAVEFORMRENDERERFILTEREDSIGNAL_H1#ifndef WAVEFORMRENDERERFILTEREDSIGNAL_H
2#define WAVEFORMRENDERERFILTEREDSIGNAL_H2#define WAVEFORMRENDERERFILTEREDSIGNAL_H
33
4#include <QColor>4#include "waveformrenderersignalbase.h"
5
6#include <vector>
5#include <QLineF>7#include <QLineF>
68
7#include <vector>
8
9#include "util.h"9#include "util.h"
10#include "waveformrendererabstract.h"
1110
12class WaveformRendererFilteredSignal : public WaveformRendererAbstract {11class WaveformRendererFilteredSignal : public WaveformRendererSignalBase {
13 public:12 public:
14 explicit WaveformRendererFilteredSignal(13 explicit WaveformRendererFilteredSignal(
15 WaveformWidgetRenderer* waveformWidget);14 WaveformWidgetRenderer* waveformWidget);
16 virtual ~WaveformRendererFilteredSignal();15 virtual ~WaveformRendererFilteredSignal();
1716
18 virtual void init();17 virtual void onInit();
19 virtual void setup(const QDomNode& node);18 virtual void onSetup(const QDomNode& node);
19
20 virtual void draw(QPainter* painter, QPaintEvent* event);20 virtual void draw(QPainter* painter, QPaintEvent* event);
2121
22 virtual void onResize();22 virtual void onResize();
2323
24 private:24 private:
25 QColor m_signalColor;
26 QColor m_lowColor;
27 QColor m_midColor;
28 QColor m_highColor;
29
30 std::vector<QLineF> m_lowLines;25 std::vector<QLineF> m_lowLines;
31 std::vector<QLineF> m_midLines;26 std::vector<QLineF> m_midLines;
32 std::vector<QLineF> m_highLines;27 std::vector<QLineF> m_highLines;
3328
=== added file 'mixxx/src/waveform/renderers/waveformrenderersignalbase.cpp'
--- mixxx/src/waveform/renderers/waveformrenderersignalbase.cpp 1970-01-01 00:00:00 +0000
+++ mixxx/src/waveform/renderers/waveformrenderersignalbase.cpp 2012-05-17 02:22:20 +0000
@@ -0,0 +1,83 @@
1#include "waveformrenderersignalbase.h"
2#include "waveformwidgetrenderer.h"
3
4#include "controlobject.h"
5#include "controlobjectthreadmain.h"
6
7#include "widget/wskincolor.h"
8#include "widget/wwidget.h"
9
10#include <QDomNode>
11
12
13WaveformRendererSignalBase::WaveformRendererSignalBase(
14 WaveformWidgetRenderer* waveformWidgetRenderer)
15 : WaveformRendererAbstract(waveformWidgetRenderer) {
16 m_lowFilterControlObject = NULL;
17 m_midFilterControlObject = NULL;
18 m_highFilterControlObject = NULL;
19 m_lowKillControlObject = NULL;
20 m_midKillControlObject = NULL;
21 m_highKillControlObject = NULL;
22 m_alignment = Qt::AlignCenter;
23}
24
25WaveformRendererSignalBase::~WaveformRendererSignalBase() {
26 deleteControls();
27}
28
29void WaveformRendererSignalBase::deleteControls() {
30 if(m_lowFilterControlObject)
31 delete m_lowFilterControlObject;
32 if(m_midFilterControlObject)
33 delete m_midFilterControlObject;
34 if(m_highFilterControlObject)
35 delete m_highFilterControlObject;
36 if(m_lowKillControlObject)
37 delete m_lowKillControlObject;
38 if(m_midKillControlObject)
39 delete m_midKillControlObject;
40 if(m_highKillControlObject)
41 delete m_highKillControlObject;
42}
43
44void WaveformRendererSignalBase::init() {
45 deleteControls();
46
47 //create controls
48 m_lowFilterControlObject = new ControlObjectThreadMain(
49 ControlObject::getControl(ConfigKey(m_waveformRenderer->getGroup(),"filterLow")));
50 m_midFilterControlObject = new ControlObjectThreadMain(
51 ControlObject::getControl(ConfigKey(m_waveformRenderer->getGroup(),"filterMid")));
52 m_highFilterControlObject = new ControlObjectThreadMain(
53 ControlObject::getControl(ConfigKey(m_waveformRenderer->getGroup(),"filterHigh")));
54 m_lowKillControlObject = new ControlObjectThreadMain(
55 ControlObject::getControl(ConfigKey(m_waveformRenderer->getGroup(),"filterLowKill")));
56 m_midKillControlObject = new ControlObjectThreadMain(
57 ControlObject::getControl(ConfigKey(m_waveformRenderer->getGroup(),"filterMidKill")));
58 m_highKillControlObject = new ControlObjectThreadMain(
59 ControlObject::getControl(ConfigKey(m_waveformRenderer->getGroup(),"filterHighKill")));
60
61 onInit();
62}
63
64void WaveformRendererSignalBase::setup(const QDomNode &node) {
65 QString alignString = WWidget::selectNodeQString(node, "Align").toLower();
66 if (alignString == "bottom") {
67 m_alignment = Qt::AlignBottom;
68 } else if (alignString == "top") {
69 m_alignment = Qt::AlignTop;
70 } else {
71 m_alignment = Qt::AlignCenter;
72 }
73
74 m_axesColor.setNamedColor(WWidget::selectNodeQString(node, "AxesColor"));
75 m_axesColor = WSkinColor::getCorrectColor(m_axesColor);
76
77 if( !m_axesColor.isValid())
78 m_axesColor = QColor(245,245,245,128);
79
80 m_colors.setup(node);
81
82 onSetup(node);
83}
084
=== added file 'mixxx/src/waveform/renderers/waveformrenderersignalbase.h'
--- mixxx/src/waveform/renderers/waveformrenderersignalbase.h 1970-01-01 00:00:00 +0000
+++ mixxx/src/waveform/renderers/waveformrenderersignalbase.h 2012-05-17 02:22:20 +0000
@@ -0,0 +1,38 @@
1#ifndef WAVEFORMRENDERERSIGNALBASE_H
2#define WAVEFORMRENDERERSIGNALBASE_H
3
4#include "waveformrendererabstract.h"
5#include "waveformsignalcolors.h"
6
7class ControlObject;
8class ControlObjectThreadMain;
9
10class WaveformRendererSignalBase : public WaveformRendererAbstract {
11public:
12 explicit WaveformRendererSignalBase( WaveformWidgetRenderer* waveformWidgetRenderer);
13 virtual ~WaveformRendererSignalBase();
14
15 virtual void init();
16 virtual void setup(const QDomNode &node);
17
18 virtual void onInit() = 0;
19 virtual void onSetup(const QDomNode &node) = 0;
20
21protected:
22 void deleteControls();
23
24protected:
25 ControlObjectThreadMain* m_lowFilterControlObject;
26 ControlObjectThreadMain* m_midFilterControlObject;
27 ControlObjectThreadMain* m_highFilterControlObject;
28
29 ControlObjectThreadMain* m_lowKillControlObject;
30 ControlObjectThreadMain* m_midKillControlObject;
31 ControlObjectThreadMain* m_highKillControlObject;
32
33 WaveformSignalColors m_colors;
34 QColor m_axesColor;
35 Qt::Alignment m_alignment;
36};
37
38#endif // WAVEFORMRENDERERSIGNALBASE_H
039
=== modified file 'mixxx/src/waveform/renderers/waveformrendermark.cpp'
--- mixxx/src/waveform/renderers/waveformrendermark.cpp 2012-04-10 12:49:54 +0000
+++ mixxx/src/waveform/renderers/waveformrendermark.cpp 2012-05-17 02:22:20 +0000
@@ -11,6 +11,11 @@
11#include "widget/wskincolor.h"11#include "widget/wskincolor.h"
12#include "widget/wwidget.h"12#include "widget/wwidget.h"
1313
14#include "engine/cuecontrol.h"
15#include <set>
16
17#include <QTextStream>
18
14WaveformRenderMark::WaveformRenderMark( WaveformWidgetRenderer* waveformWidgetRenderer) :19WaveformRenderMark::WaveformRenderMark( WaveformWidgetRenderer* waveformWidgetRenderer) :
15 WaveformRendererAbstract(waveformWidgetRenderer) {20 WaveformRendererAbstract(waveformWidgetRenderer) {
16}21}
@@ -19,22 +24,55 @@
19}24}
2025
21void WaveformRenderMark::setup( const QDomNode& node) {26void WaveformRenderMark::setup( const QDomNode& node) {
27 m_defaultMark = WaveformMark();
22 m_marks.clear();28 m_marks.clear();
23 m_marks.reserve(37); //36 hot cues + 1 cue29 m_marks.reserve(NUM_HOT_CUES);
30
31 std::set<QString> hotCutSet;
32 bool hasDefaultMark = false;
2433
25 QDomNode child = node.firstChild();34 QDomNode child = node.firstChild();
26 while (!child.isNull()) {35 while (!child.isNull()) {
27 if (child.nodeName() == "Mark") {36 if (child.nodeName() == "DefaultMark") {
37 m_defaultMark.setup( m_waveformRenderer->getGroup(), child);
38 hasDefaultMark = true;
39 } else if (child.nodeName() == "Mark") {
28 m_marks.push_back(WaveformMark());40 m_marks.push_back(WaveformMark());
29 WaveformMark& mark = m_marks.back();41 WaveformMark& mark = m_marks.back();
30 mark.setup( m_waveformRenderer->getGroup(), child);42 mark.setup( m_waveformRenderer->getGroup(), child);
43 //garante uniqueness even if there is misdesigned skin
44 std::pair<std::set<QString>::iterator, bool> insertion;
45 insertion = hotCutSet.insert(mark.m_pointControl->getKey().item);
46 if( !insertion.second) {
47 qWarning() << "WaveformRenderMark::setup - redefinition of "
48 << mark.m_pointControl->getKey().item;
49 m_marks.resize( m_marks.size() - 1);
50 }
31 }51 }
32 child = child.nextSibling();52 child = child.nextSibling();
33 }53 }
54
55 //check if there is a default mark and compare declared
56 //and to create all missing hot_cues
57 if(hasDefaultMark) {
58 for( int i = 1; i < NUM_HOT_CUES; i++) {
59 QString hotCueControlItem = "hotcue_" + QString::number(i) + "_position";
60 std::pair<std::set<QString>::iterator, bool> insertion;
61 insertion = hotCutSet.insert(hotCueControlItem);
62 if( insertion.second) {
63 //qDebug() << "WaveformRenderMark::setup - Automatic mark" << hotCueControlItem;
64 m_marks.push_back(m_defaultMark);
65 WaveformMark& mark = m_marks.back();
66 mark.m_pointControl = ControlObject::getControl(
67 ConfigKey(m_waveformRenderer->getGroup(), hotCueControlItem));
68 mark.m_text = QString(" HOTCUE %1 ").arg(i);
69 }
70 }
71 }
34}72}
3573
3674
37void WaveformRenderMark::draw( QPainter* painter, QPaintEvent* event) {75void WaveformRenderMark::draw( QPainter* painter, QPaintEvent* /*event*/) {
38 painter->save();76 painter->save();
3977
40 /*78 /*
@@ -47,7 +85,7 @@
4785
48 painter->setWorldMatrixEnabled(false);86 painter->setWorldMatrixEnabled(false);
4987
50 for( int i = 0; i < m_marks.size(); i++) {88 for( unsigned int i = 0; i < m_marks.size(); i++) {
51 WaveformMark& mark = m_marks[i];89 WaveformMark& mark = m_marks[i];
5290
53 if( !mark.m_pointControl)91 if( !mark.m_pointControl)
@@ -139,7 +177,7 @@
139 QColor rectColor = mark.m_color;177 QColor rectColor = mark.m_color;
140 rectColor.setAlpha(50);178 rectColor.setAlpha(50);
141 rectColor.darker(140);179 rectColor.darker(140);
142 painter.setPen(rectColor);180 painter.setPen(mark.m_color);
143 painter.setBrush(QBrush(rectColor));181 painter.setBrush(QBrush(rectColor));
144 painter.drawRoundedRect(labelRect, 2.0, 2.0);182 painter.drawRoundedRect(labelRect, 2.0, 2.0);
145183
146184
=== modified file 'mixxx/src/waveform/renderers/waveformrendermark.h'
--- mixxx/src/waveform/renderers/waveformrendermark.h 2012-04-10 12:49:54 +0000
+++ mixxx/src/waveform/renderers/waveformrendermark.h 2012-05-17 02:22:20 +0000
@@ -22,6 +22,7 @@
22private:22private:
23 void generateMarkPixmap(WaveformMark& mark);23 void generateMarkPixmap(WaveformMark& mark);
2424
25 WaveformMark m_defaultMark;
25 std::vector<WaveformMark> m_marks;26 std::vector<WaveformMark> m_marks;
26 DISALLOW_COPY_AND_ASSIGN(WaveformRenderMark);27 DISALLOW_COPY_AND_ASSIGN(WaveformRenderMark);
27};28};
2829
=== modified file 'mixxx/src/waveform/renderers/waveformwidgetrenderer.cpp'
--- mixxx/src/waveform/renderers/waveformwidgetrenderer.cpp 2012-05-07 05:30:14 +0000
+++ mixxx/src/waveform/renderers/waveformwidgetrenderer.cpp 2012-05-17 02:22:20 +0000
@@ -1,6 +1,7 @@
1#include "waveformwidgetrenderer.h"1#include "waveformwidgetrenderer.h"
2#include "waveform/waveform.h"2#include "waveform/waveform.h"
33
4#include "widget/wwidget.h"
4#include "controlobjectthreadmain.h"5#include "controlobjectthreadmain.h"
5#include "controlobject.h"6#include "controlobject.h"
6#include "defs.h"7#include "defs.h"
@@ -165,12 +166,11 @@
165 m_rendererStack[0]->draw( painter, event);166 m_rendererStack[0]->draw( painter, event);
166 return;167 return;
167 } else {168 } else {
168
169 for( int i = 0; i < m_rendererStack.size(); ++i)169 for( int i = 0; i < m_rendererStack.size(); ++i)
170 m_rendererStack[i]->draw( painter, event);170 m_rendererStack[i]->draw( painter, event);
171171
172 painter->setPen(QColor(255,255,255,200));172 painter->setPen(m_axesColor);
173 painter->drawLine( m_width/2, 0, m_width/2, m_height);173 painter->drawLine(m_width/2,0,m_width/2,m_height);
174 }174 }
175175
176#ifdef WAVEFORMWIDGETRENDERER_DEBUG176#ifdef WAVEFORMWIDGETRENDERER_DEBUG
@@ -218,6 +218,12 @@
218}218}
219219
220void WaveformWidgetRenderer::setup( const QDomNode& node) {220void WaveformWidgetRenderer::setup( const QDomNode& node) {
221
222 m_axesColor.setNamedColor(WWidget::selectNodeQString(node, "AxesColor"));
223
224 if( !m_axesColor.isValid())
225 m_axesColor = QColor(245,245,245,200);
226
221 for( int i = 0; i < m_rendererStack.size(); ++i)227 for( int i = 0; i < m_rendererStack.size(); ++i)
222 m_rendererStack[i]->setup(node);228 m_rendererStack[i]->setup(node);
223}229}
224230
=== modified file 'mixxx/src/waveform/renderers/waveformwidgetrenderer.h'
--- mixxx/src/waveform/renderers/waveformwidgetrenderer.h 2012-04-19 02:27:57 +0000
+++ mixxx/src/waveform/renderers/waveformwidgetrenderer.h 2012-05-17 02:22:20 +0000
@@ -81,6 +81,7 @@
81 QVector<WaveformRendererAbstract*> m_rendererStack;81 QVector<WaveformRendererAbstract*> m_rendererStack;
82 int m_height;82 int m_height;
83 int m_width;83 int m_width;
84 QColor m_axesColor;
8485
85 double m_firstDisplayedPosition;86 double m_firstDisplayedPosition;
86 double m_lastDisplayedPosition;87 double m_lastDisplayedPosition;
@@ -107,7 +108,6 @@
107 ControlObjectThreadMain* m_trackSamplesControlObject;108 ControlObjectThreadMain* m_trackSamplesControlObject;
108 int m_trackSamples;109 int m_trackSamples;
109110
110
111#ifdef WAVEFORMWIDGETRENDERER_DEBUG111#ifdef WAVEFORMWIDGETRENDERER_DEBUG
112 QTime* m_timer;112 QTime* m_timer;
113 int m_lastFrameTime;113 int m_lastFrameTime;
114114
=== modified file 'mixxx/src/waveform/waveformwidgetfactory.cpp'
--- mixxx/src/waveform/waveformwidgetfactory.cpp 2012-04-29 18:45:39 +0000
+++ mixxx/src/waveform/waveformwidgetfactory.cpp 2012-05-17 02:22:20 +0000
@@ -11,18 +11,20 @@
11#include "controlpotmeter.h"11#include "controlpotmeter.h"
12#include "defs.h"12#include "defs.h"
13#include "waveform/widgets/emptywaveformwidget.h"13#include "waveform/widgets/emptywaveformwidget.h"
14#include "waveform/widgets/softwarewaveformwidget.h"
15#include "waveform/widgets/glwaveformwidget.h"
14#include "waveform/widgets/glsimplewaveformwidget.h"16#include "waveform/widgets/glsimplewaveformwidget.h"
17#include "waveform/widgets/qtwaveformwidget.h"
18#include "waveform/widgets/qtsimplewaveformwidget.h"
15#include "waveform/widgets/glslwaveformwidget.h"19#include "waveform/widgets/glslwaveformwidget.h"
16#include "waveform/widgets/glwaveformwidget.h"
17#include "waveform/widgets/softwarewaveformwidget.h"
18#include "waveform/widgets/waveformwidgetabstract.h"20#include "waveform/widgets/waveformwidgetabstract.h"
19#include "widget/wwaveformviewer.h"21#include "widget/wwaveformviewer.h"
2022
21///////////////////////////////////////////23///////////////////////////////////////////
2224
23WaveformWidgetAbstractHandle::WaveformWidgetAbstractHandle()25WaveformWidgetAbstractHandle::WaveformWidgetAbstractHandle()
24 : m_active(true),26 : m_active(true),
25 m_type(WaveformWidgetType::Count_WaveformwidgetType) {27 m_type(WaveformWidgetType::Count_WaveformwidgetType) {
26}28}
2729
28///////////////////////////////////////////30///////////////////////////////////////////
@@ -30,9 +32,9 @@
30WaveformWidgetHolder::WaveformWidgetHolder(WaveformWidgetAbstract* waveformWidget,32WaveformWidgetHolder::WaveformWidgetHolder(WaveformWidgetAbstract* waveformWidget,
31 WWaveformViewer* waveformViewer,33 WWaveformViewer* waveformViewer,
32 const QDomNode& visualNodeCache)34 const QDomNode& visualNodeCache)
33 : m_waveformWidget(waveformWidget),35 : m_waveformWidget(waveformWidget),
34 m_waveformViewer(waveformViewer),36 m_waveformViewer(waveformViewer),
35 m_visualNodeCache(visualNodeCache.cloneNode()) {37 m_visualNodeCache(visualNodeCache.cloneNode()) {
36}38}
3739
38///////////////////////////////////////////40///////////////////////////////////////////
@@ -42,7 +44,7 @@
42 m_config = 0;44 m_config = 0;
43 m_skipRender = false;45 m_skipRender = false;
44 setFrameRate(33);46 setFrameRate(33);
45 m_defaultZoom = 1;47 m_defaultZoom = 3;
46 m_zoomSync = false;48 m_zoomSync = false;
47 m_visualGain[All] = 1.5;49 m_visualGain[All] = 1.5;
48 m_visualGain[Low] = 1.0;50 m_visualGain[Low] = 1.0;
@@ -147,14 +149,14 @@
147 }149 }
148150
149 WaveformWidgetType::Type type = static_cast<WaveformWidgetType::Type>(151 WaveformWidgetType::Type type = static_cast<WaveformWidgetType::Type>(
150 m_config->getValueString(ConfigKey("[Waveform]","WaveformType")).toInt(&ok));152 m_config->getValueString(ConfigKey("[Waveform]","WaveformType")).toInt(&ok));
151 if (!ok || !setWidgetType(type)) {153 if (!ok || !setWidgetType(type)) {
152 setWidgetType(autoChooseWidgetType());154 setWidgetType(autoChooseWidgetType());
153 }155 }
154156
155 for (int i = 0; i < FilterCount; i++) {157 for (int i = 0; i < FilterCount; i++) {
156 double visualGain = m_config->getValueString(158 double visualGain = m_config->getValueString(
157 ConfigKey("[Waveform]","VisualGain_" + QString::number(i))).toDouble(&ok);159 ConfigKey("[Waveform]","VisualGain_" + QString::number(i))).toDouble(&ok);
158160
159 if (ok) {161 if (ok) {
160 setVisualGain(FilterIndex(i), visualGain);162 setVisualGain(FilterIndex(i), visualGain);
@@ -223,7 +225,7 @@
223225
224 viewer->setZoom(m_defaultZoom);226 viewer->setZoom(m_defaultZoom);
225227
226 qDebug() << "WaveformWidgetFactory::setWaveformWidget - waveform widget added in factory index" << index;228 qDebug() << "WaveformWidgetFactory::setWaveformWidget - waveform widget added in factory, index" << index;
227229
228 return true;230 return true;
229}231}
@@ -261,7 +263,7 @@
261}263}
262264
263bool WaveformWidgetFactory::setWidgetTypeFromHandle(int handleIndex) {265bool WaveformWidgetFactory::setWidgetTypeFromHandle(int handleIndex) {
264 if (handleIndex < 0 && handleIndex > m_waveformWidgetHandles.size()) {266 if (handleIndex < 0 && handleIndex > (int)m_waveformWidgetHandles.size()) {
265 qDebug() << "WaveformWidgetFactory::setWidgetType - invalid handle --> use of 'EmptyWaveform'";267 qDebug() << "WaveformWidgetFactory::setWidgetType - invalid handle --> use of 'EmptyWaveform'";
266 // fallback empty type268 // fallback empty type
267 setWidgetType(WaveformWidgetType::EmptyWaveform);269 setWidgetType(WaveformWidgetType::EmptyWaveform);
@@ -278,22 +280,24 @@
278 setWidgetType(handle.m_type);280 setWidgetType(handle.m_type);
279281
280 m_skipRender = true;282 m_skipRender = true;
281 qDebug() << "recreate start";283 //qDebug() << "recreate start";
282284
283 //re-create/setup all waveform widgets285 //re-create/setup all waveform widgets
284 for (unsigned int i = 0; i < m_waveformWidgetHolders.size(); i++) {286 for (unsigned int i = 0; i < m_waveformWidgetHolders.size(); i++) {
285 WaveformWidgetHolder& holder = m_waveformWidgetHolders[i];287 WaveformWidgetHolder& holder = m_waveformWidgetHolders[i];
286 WaveformWidgetAbstract* previousWidget = holder.m_waveformWidget;288 WaveformWidgetAbstract* previousWidget = holder.m_waveformWidget;
287 TrackPointer pTrack = previousWidget->getTrackInfo();289 TrackPointer pTrack = previousWidget->getTrackInfo();
288 previousWidget->hold();290 //previousWidget->hold();
291 int previousZoom = previousWidget->getZoomFactor();
289 delete previousWidget;292 delete previousWidget;
290 WWaveformViewer* viewer = holder.m_waveformViewer;293 WWaveformViewer* viewer = holder.m_waveformViewer;
291 WaveformWidgetAbstract* widget = createWaveformWidget(m_type, holder.m_waveformViewer);294 WaveformWidgetAbstract* widget = createWaveformWidget(m_type, holder.m_waveformViewer);
292 holder.m_waveformWidget = widget;295 holder.m_waveformWidget = widget;
293 widget->castToQWidget();296 widget->castToQWidget();
294 widget->hold();297 //widget->hold();
295 viewer->setWaveformWidget(widget);298 viewer->setWaveformWidget(widget);
296 viewer->setup(holder.m_visualNodeCache);299 viewer->setup(holder.m_visualNodeCache);
300 viewer->setZoom(previousZoom);
297 // resize() doesn't seem to get called on the widget. I think Qt skips301 // resize() doesn't seem to get called on the widget. I think Qt skips
298 // it since the size didn't change.302 // it since the size didn't change.
299 //viewer->resize(viewer->size());303 //viewer->resize(viewer->size());
@@ -302,7 +306,7 @@
302 }306 }
303307
304 m_skipRender = false;308 m_skipRender = false;
305 qDebug() << "recreate done";309 //qDebug() << "recreate done";
306 return true;310 return true;
307}311}
308312
@@ -348,7 +352,7 @@
348 if (isZoomSync()) {352 if (isZoomSync()) {
349 //qDebug() << "WaveformWidgetFactory::notifyZoomChange";353 //qDebug() << "WaveformWidgetFactory::notifyZoomChange";
350 int refZoom = viewer->getWaveformWidget()->getZoomFactor();354 int refZoom = viewer->getWaveformWidget()->getZoomFactor();
351 for (int i = 0; i < m_waveformWidgetHolders.size(); i++) {355 for (int i = 0; i < (int)m_waveformWidgetHolders.size(); i++) {
352 if (m_waveformWidgetHolders[i].m_waveformViewer != viewer) {356 if (m_waveformWidgetHolders[i].m_waveformViewer != viewer) {
353 m_waveformWidgetHolders[i].m_waveformViewer->setZoom(refZoom);357 m_waveformWidgetHolders[i].m_waveformViewer->setZoom(refZoom);
354 }358 }
@@ -358,7 +362,7 @@
358362
359void WaveformWidgetFactory::refresh() {363void WaveformWidgetFactory::refresh() {
360 if (m_skipRender)364 if (m_skipRender)
361 return;365 return;
362366
363 for (unsigned int i = 0; i < m_waveformWidgetHolders.size(); i++)367 for (unsigned int i = 0; i < m_waveformWidgetHolders.size(); i++)
364 m_waveformWidgetHolders[i].m_waveformWidget->preRender();368 m_waveformWidgetHolders[i].m_waveformWidget->preRender();
@@ -399,9 +403,11 @@
399 WaveformWidgetAbstract* widget = 0;403 WaveformWidgetAbstract* widget = 0;
400 switch(type) {404 switch(type) {
401 case WaveformWidgetType::EmptyWaveform : widget = new EmptyWaveformWidget(); break;405 case WaveformWidgetType::EmptyWaveform : widget = new EmptyWaveformWidget(); break;
402 case WaveformWidgetType::SimpleSoftwareWaveform : break; //TODO: (vrince)406 case WaveformWidgetType::SoftwareSimpleWaveform : break; //TODO: (vrince)
407 case WaveformWidgetType::SoftwareWaveform : widget = new SoftwareWaveformWidget(); break;
408 case WaveformWidgetType::QtSimpleWaveform : widget = new QtSimpleWaveformWidget(); break;
409 case WaveformWidgetType::QtWaveform : widget = new QtWaveformWidget(); break;
403 case WaveformWidgetType::GLSimpleWaveform : widget = new GLSimpleWaveformWidget(); break;410 case WaveformWidgetType::GLSimpleWaveform : widget = new GLSimpleWaveformWidget(); break;
404 case WaveformWidgetType::SoftwareWaveform : widget = new SoftwareWaveformWidget(); break;
405 case WaveformWidgetType::GLWaveform : widget = new GLWaveformWidget(); break;411 case WaveformWidgetType::GLWaveform : widget = new GLWaveformWidget(); break;
406 case WaveformWidgetType::GLSLWaveform : widget = new GLSLWaveformWidget(); break;412 case WaveformWidgetType::GLSLWaveform : widget = new GLSLWaveformWidget(); break;
407 }413 }
@@ -437,9 +443,11 @@
437 if (viewer) {443 if (viewer) {
438 switch(type) {444 switch(type) {
439 case WaveformWidgetType::EmptyWaveform : return new EmptyWaveformWidget(viewer->getGroup(), viewer);445 case WaveformWidgetType::EmptyWaveform : return new EmptyWaveformWidget(viewer->getGroup(), viewer);
440 case WaveformWidgetType::SimpleSoftwareWaveform : return 0; //TODO: (vrince)446 case WaveformWidgetType::SoftwareSimpleWaveform : return 0; //TODO: (vrince)
447 case WaveformWidgetType::SoftwareWaveform : return new SoftwareWaveformWidget(viewer->getGroup(), viewer);
448 case WaveformWidgetType::QtSimpleWaveform : return new QtSimpleWaveformWidget(viewer->getGroup(), viewer);
449 case WaveformWidgetType::QtWaveform : return new QtWaveformWidget(viewer->getGroup(), viewer);
441 case WaveformWidgetType::GLSimpleWaveform : return new GLSimpleWaveformWidget(viewer->getGroup(), viewer);450 case WaveformWidgetType::GLSimpleWaveform : return new GLSimpleWaveformWidget(viewer->getGroup(), viewer);
442 case WaveformWidgetType::SoftwareWaveform : return new SoftwareWaveformWidget(viewer->getGroup(), viewer);
443 case WaveformWidgetType::GLWaveform : return new GLWaveformWidget(viewer->getGroup(), viewer);451 case WaveformWidgetType::GLWaveform : return new GLWaveformWidget(viewer->getGroup(), viewer);
444 case WaveformWidgetType::GLSLWaveform : return new GLSLWaveformWidget(viewer->getGroup(), viewer);452 case WaveformWidgetType::GLSLWaveform : return new GLSLWaveformWidget(viewer->getGroup(), viewer);
445 default : return 0;453 default : return 0;
@@ -449,7 +457,7 @@
449}457}
450458
451int WaveformWidgetFactory::findIndexOf(WWaveformViewer* viewer) const {459int WaveformWidgetFactory::findIndexOf(WWaveformViewer* viewer) const {
452 for (int i = 0; i < m_waveformWidgetHolders.size(); i++)460 for (int i = 0; i < (int)m_waveformWidgetHolders.size(); i++)
453 if (m_waveformWidgetHolders[i].m_waveformViewer == viewer)461 if (m_waveformWidgetHolders[i].m_waveformViewer == viewer)
454 return i;462 return i;
455 return -1;463 return -1;
456464
=== modified file 'mixxx/src/waveform/widgets/glsimplewaveformwidget.cpp'
--- mixxx/src/waveform/widgets/glsimplewaveformwidget.cpp 2012-04-15 01:25:21 +0000
+++ mixxx/src/waveform/widgets/glsimplewaveformwidget.cpp 2012-05-17 02:22:20 +0000
@@ -8,6 +8,7 @@
8#include "waveform/renderers/waveformrendererpreroll.h"8#include "waveform/renderers/waveformrendererpreroll.h"
9#include "waveform/renderers/waveformrendermark.h"9#include "waveform/renderers/waveformrendermark.h"
10#include "waveform/renderers/waveformrendermarkrange.h"10#include "waveform/renderers/waveformrendermarkrange.h"
11#include "waveform/renderers/waveformrendererendoftrack.h"
11#include "waveform/renderers/waveformrenderbeat.h"12#include "waveform/renderers/waveformrenderbeat.h"
1213
13GLSimpleWaveformWidget::GLSimpleWaveformWidget( const char* group, QWidget* parent) :14GLSimpleWaveformWidget::GLSimpleWaveformWidget( const char* group, QWidget* parent) :
@@ -15,6 +16,7 @@
15 QGLWidget(parent) {16 QGLWidget(parent) {
1617
17 addRenderer<WaveformRenderBackground>();18 addRenderer<WaveformRenderBackground>();
19 addRenderer<WaveformRendererEndOfTrack>();
18 addRenderer<WaveformRendererPreroll>();20 addRenderer<WaveformRendererPreroll>();
19 addRenderer<WaveformRenderMarkRange>();21 addRenderer<WaveformRenderMarkRange>();
20 addRenderer<GLWaveformRendererSimpleSignal>();22 addRenderer<GLWaveformRendererSimpleSignal>();
@@ -42,12 +44,6 @@
42 m_widget = static_cast<QWidget*>(static_cast<QGLWidget*>(this));44 m_widget = static_cast<QWidget*>(static_cast<QGLWidget*>(this));
43}45}
4446
45//here rate adjust is discarded in the simple version to have an tinegral
46//number of visual sample per pixel
47void GLSimpleWaveformWidget::updateVisualSamplingPerPixel() {
48 m_visualSamplePerPixel = m_zoomFactor;
49}
50
51void GLSimpleWaveformWidget::paintEvent( QPaintEvent* event) {47void GLSimpleWaveformWidget::paintEvent( QPaintEvent* event) {
52 if (QGLContext::currentContext() != context()) {48 if (QGLContext::currentContext() != context()) {
53 makeCurrent();49 makeCurrent();
5450
=== modified file 'mixxx/src/waveform/widgets/glsimplewaveformwidget.h'
--- mixxx/src/waveform/widgets/glsimplewaveformwidget.h 2012-04-29 18:45:39 +0000
+++ mixxx/src/waveform/widgets/glsimplewaveformwidget.h 2012-05-17 02:22:20 +0000
@@ -17,9 +17,6 @@
17 virtual bool useOpenGl() const { return true;}17 virtual bool useOpenGl() const { return true;}
18 virtual bool useOpenGLShaders() const { return false;}18 virtual bool useOpenGLShaders() const { return false;}
1919
20 //reimplemet it to discard use of rate adjust
21 virtual void updateVisualSamplingPerPixel();
22
23 protected:20 protected:
24 virtual void castToQWidget();21 virtual void castToQWidget();
25 virtual void paintEvent(QPaintEvent* event);22 virtual void paintEvent(QPaintEvent* event);
2623
=== modified file 'mixxx/src/waveform/widgets/glslwaveformwidget.cpp'
--- mixxx/src/waveform/widgets/glslwaveformwidget.cpp 2012-03-27 00:54:20 +0000
+++ mixxx/src/waveform/widgets/glslwaveformwidget.cpp 2012-05-17 02:22:20 +0000
@@ -12,15 +12,15 @@
12#include "waveform/renderers/waveformrenderbeat.h"12#include "waveform/renderers/waveformrenderbeat.h"
1313
14GLSLWaveformWidget::GLSLWaveformWidget( const char* group, QWidget* parent) :14GLSLWaveformWidget::GLSLWaveformWidget( const char* group, QWidget* parent) :
15 WaveformWidgetAbstract(group),15 QGLWidget(parent),
16 QGLWidget(parent) {16 WaveformWidgetAbstract(group) {
1717
18 addRenderer<WaveformRenderBackground>();18 addRenderer<WaveformRenderBackground>();
19 addRenderer<WaveformRendererEndOfTrack>();19 addRenderer<WaveformRendererEndOfTrack>();
20 addRenderer<WaveformRendererPreroll>();
20 addRenderer<WaveformRenderMarkRange>();21 addRenderer<WaveformRenderMarkRange>();
22 signalRenderer_ = addRenderer<GLSLWaveformRendererSignal>();
21 addRenderer<WaveformRenderMark>();23 addRenderer<WaveformRenderMark>();
22 signalRenderer_ = addRenderer<GLSLWaveformRendererSignal>();
23 addRenderer<WaveformRendererPreroll>();
24 addRenderer<WaveformRenderBeat>();24 addRenderer<WaveformRenderBeat>();
2525
26 setAttribute(Qt::WA_NoSystemBackground);26 setAttribute(Qt::WA_NoSystemBackground);
2727
=== modified file 'mixxx/src/waveform/widgets/glslwaveformwidget.h'
--- mixxx/src/waveform/widgets/glslwaveformwidget.h 2012-04-29 18:45:39 +0000
+++ mixxx/src/waveform/widgets/glslwaveformwidget.h 2012-05-17 02:22:20 +0000
@@ -13,7 +13,7 @@
13 GLSLWaveformWidget(const char* group, QWidget* parent);13 GLSLWaveformWidget(const char* group, QWidget* parent);
14 virtual ~GLSLWaveformWidget();14 virtual ~GLSLWaveformWidget();
1515
16 virtual QString getWaveformWidgetName() { return tr("Filtered (experimental)");}16 virtual QString getWaveformWidgetName() { return tr("Filtered - experimental");}
17 virtual WaveformWidgetType::Type getType() const { return WaveformWidgetType::GLWaveform;}17 virtual WaveformWidgetType::Type getType() const { return WaveformWidgetType::GLWaveform;}
1818
19 virtual bool useOpenGl() const { return true;}19 virtual bool useOpenGl() const { return true;}
2020
=== modified file 'mixxx/src/waveform/widgets/glwaveformwidget.cpp'
--- mixxx/src/waveform/widgets/glwaveformwidget.cpp 2012-04-15 01:25:21 +0000
+++ mixxx/src/waveform/widgets/glwaveformwidget.cpp 2012-05-17 02:22:20 +0000
@@ -4,6 +4,7 @@
4#include "glwaveformwidget.h"4#include "glwaveformwidget.h"
5#include "waveform/renderers/waveformwidgetrenderer.h"5#include "waveform/renderers/waveformwidgetrenderer.h"
6#include "waveform/renderers/waveformrenderbackground.h"6#include "waveform/renderers/waveformrenderbackground.h"
7#include "waveform/renderers/qtwaveformrendererfilteredsignal.h"
7#include "waveform/renderers/glwaveformrendererfilteredsignal.h"8#include "waveform/renderers/glwaveformrendererfilteredsignal.h"
8#include "waveform/renderers/waveformrendererpreroll.h"9#include "waveform/renderers/waveformrendererpreroll.h"
9#include "waveform/renderers/waveformrendermark.h"10#include "waveform/renderers/waveformrendermark.h"
@@ -13,8 +14,8 @@
13#include "sharedglcontext.h"14#include "sharedglcontext.h"
1415
15GLWaveformWidget::GLWaveformWidget( const char* group, QWidget* parent) :16GLWaveformWidget::GLWaveformWidget( const char* group, QWidget* parent) :
16 WaveformWidgetAbstract(group),17 QGLWidget(SharedGLContext::getContext(), parent),
17 QGLWidget(SharedGLContext::getContext(), parent) {18 WaveformWidgetAbstract(group) {
1819
19 addRenderer<WaveformRenderBackground>();20 addRenderer<WaveformRenderBackground>();
20 addRenderer<WaveformRendererEndOfTrack>();21 addRenderer<WaveformRendererEndOfTrack>();
2122
=== added file 'mixxx/src/waveform/widgets/qtsimplewaveformwidget.cpp'
--- mixxx/src/waveform/widgets/qtsimplewaveformwidget.cpp 1970-01-01 00:00:00 +0000
+++ mixxx/src/waveform/widgets/qtsimplewaveformwidget.cpp 2012-05-17 02:22:20 +0000
@@ -0,0 +1,57 @@
1#include "qtsimplewaveformwidget.h"
2
3#include <QPainter>
4
5#include "waveform/renderers/waveformwidgetrenderer.h"
6#include "waveform/renderers/waveformrenderbackground.h"
7#include "waveform/renderers/qtwaveformrenderersimplesignal.h"
8#include "waveform/renderers/waveformrendererpreroll.h"
9#include "waveform/renderers/waveformrendermark.h"
10#include "waveform/renderers/waveformrendermarkrange.h"
11#include "waveform/renderers/waveformrendererendoftrack.h"
12#include "waveform/renderers/waveformrenderbeat.h"
13
14QtSimpleWaveformWidget::QtSimpleWaveformWidget( const char* group, QWidget* parent) :
15 WaveformWidgetAbstract(group),
16 QGLWidget(parent) {
17
18 addRenderer<WaveformRenderBackground>();
19 addRenderer<WaveformRendererEndOfTrack>();
20 addRenderer<WaveformRendererPreroll>();
21 addRenderer<WaveformRenderMarkRange>();
22 addRenderer<QtWaveformRendererSimpleSignal>();
23 addRenderer<WaveformRenderMark>();
24 addRenderer<WaveformRenderBeat>();
25
26 setAttribute(Qt::WA_NoSystemBackground);
27 setAttribute(Qt::WA_OpaquePaintEvent);
28
29 setAutoBufferSwap(false);
30
31 if (QGLContext::currentContext() != context()) {
32 makeCurrent();
33 }
34 init();
35}
36
37QtSimpleWaveformWidget::~QtSimpleWaveformWidget(){
38 if (QGLContext::currentContext() != context()) {
39 makeCurrent();
40 }
41}
42
43void QtSimpleWaveformWidget::castToQWidget() {
44 m_widget = static_cast<QWidget*>(static_cast<QGLWidget*>(this));
45}
46
47void QtSimpleWaveformWidget::paintEvent( QPaintEvent* event) {
48 if (QGLContext::currentContext() != context()) {
49 makeCurrent();
50 }
51 QPainter painter(this);
52 draw(&painter,event);
53}
54
55void QtSimpleWaveformWidget::postRender() {
56 QGLWidget::swapBuffers();
57}
058
=== added file 'mixxx/src/waveform/widgets/qtsimplewaveformwidget.h'
--- mixxx/src/waveform/widgets/qtsimplewaveformwidget.h 1970-01-01 00:00:00 +0000
+++ mixxx/src/waveform/widgets/qtsimplewaveformwidget.h 2012-05-17 02:22:20 +0000
@@ -0,0 +1,30 @@
1#ifndef QTSIMPLEWAVEFORMWIDGET_H
2#define QTSIMPLEWAVEFORMWIDGET_H
3
4#include <QGLWidget>
5
6#include "waveformwidgetabstract.h"
7
8class QtSimpleWaveformWidget : public QGLWidget, public WaveformWidgetAbstract {
9 Q_OBJECT
10 public:
11 QtSimpleWaveformWidget(const char* group, QWidget* parent);
12 virtual ~QtSimpleWaveformWidget();
13
14 virtual QString getWaveformWidgetName() { return tr("Simple - Qt");}
15 virtual WaveformWidgetType::Type getType() const { return WaveformWidgetType::GLSimpleWaveform;}
16
17 virtual bool useOpenGl() const { return true;}
18 virtual bool useOpenGLShaders() const { return false;}
19
20 protected:
21 virtual void castToQWidget();
22 virtual void paintEvent(QPaintEvent* event);
23 virtual void postRender();
24
25 private:
26 QtSimpleWaveformWidget() {}
27 friend class WaveformWidgetFactory;
28};
29
30#endif // QTSIMPLEWAVEFORMWIDGET_H
031
=== added file 'mixxx/src/waveform/widgets/qtwaveformwidget.cpp'
--- mixxx/src/waveform/widgets/qtwaveformwidget.cpp 1970-01-01 00:00:00 +0000
+++ mixxx/src/waveform/widgets/qtwaveformwidget.cpp 2012-05-17 02:22:20 +0000
@@ -0,0 +1,56 @@
1#include "qtwaveformwidget.h"
2
3#include "waveform/renderers/waveformwidgetrenderer.h"
4#include "waveform/renderers/waveformrenderbackground.h"
5#include "waveform/renderers/qtwaveformrendererfilteredsignal.h"
6#include "waveform/renderers/waveformrendererpreroll.h"
7#include "waveform/renderers/waveformrendermark.h"
8#include "waveform/renderers/waveformrendermarkrange.h"
9#include "waveform/renderers/waveformrendererendoftrack.h"
10#include "waveform/renderers/waveformrenderbeat.h"
11#include "sharedglcontext.h"
12
13#include <QPainter>
14#include <QGLContext>
15
16QtWaveformWidget::QtWaveformWidget( const char* group, QWidget* parent) :
17 QGLWidget(SharedGLContext::getContext(), parent),
18 WaveformWidgetAbstract(group) {
19
20 addRenderer<WaveformRenderBackground>();
21 addRenderer<WaveformRendererEndOfTrack>();
22 addRenderer<WaveformRendererPreroll>();
23 addRenderer<WaveformRenderMarkRange>();
24 addRenderer<QtWaveformRendererFilteredSignal>();
25 addRenderer<WaveformRenderMark>();
26 addRenderer<WaveformRenderBeat>();
27
28 setAttribute(Qt::WA_NoSystemBackground);
29 setAttribute(Qt::WA_OpaquePaintEvent);
30
31 setAutoBufferSwap(false);
32
33 if (QGLContext::currentContext() != context()) {
34 makeCurrent();
35 }
36 init();
37}
38
39QtWaveformWidget::~QtWaveformWidget() {
40}
41
42void QtWaveformWidget::castToQWidget() {
43 m_widget = static_cast<QWidget*>(static_cast<QGLWidget*>(this));
44}
45
46void QtWaveformWidget::paintEvent( QPaintEvent* event) {
47 if (QGLContext::currentContext() != context()) {
48 makeCurrent();
49 }
50 QPainter painter(this);
51 draw(&painter, event);
52}
53
54void QtWaveformWidget::postRender() {
55 QGLWidget::swapBuffers();
56}
057
=== added file 'mixxx/src/waveform/widgets/qtwaveformwidget.h'
--- mixxx/src/waveform/widgets/qtwaveformwidget.h 1970-01-01 00:00:00 +0000
+++ mixxx/src/waveform/widgets/qtwaveformwidget.h 2012-05-17 02:22:20 +0000
@@ -0,0 +1,30 @@
1#ifndef QTWAVEFORMWIDGET_H
2#define QTWAVEFORMWIDGET_H
3
4#include <QGLWidget>
5
6#include "waveformwidgetabstract.h"
7
8class QtWaveformWidget : public QGLWidget, public WaveformWidgetAbstract {
9 Q_OBJECT
10 public:
11 QtWaveformWidget(const char* group, QWidget* parent);
12 virtual ~QtWaveformWidget();
13
14 virtual QString getWaveformWidgetName() { return tr("Filtered - Qt");}
15 virtual WaveformWidgetType::Type getType() const { return WaveformWidgetType::GLSLWaveform;}
16
17 virtual bool useOpenGl() const { return true;}
18 virtual bool useOpenGLShaders() const { return false;}
19
20 protected:
21 virtual void castToQWidget();
22 virtual void paintEvent(QPaintEvent* event);
23 virtual void postRender();
24
25 private:
26 QtWaveformWidget() {}
27 friend class WaveformWidgetFactory;
28};
29
30#endif // QTWAVEFORMWIDGET_H
031
=== modified file 'mixxx/src/waveform/widgets/softwarewaveformwidget.cpp'
--- mixxx/src/waveform/widgets/softwarewaveformwidget.cpp 2012-02-26 07:48:23 +0000
+++ mixxx/src/waveform/widgets/softwarewaveformwidget.cpp 2012-05-17 02:22:20 +0000
@@ -8,6 +8,7 @@
8#include "waveform/renderers/waveformrendermarkrange.h"8#include "waveform/renderers/waveformrendermarkrange.h"
9#include "waveform/renderers/waveformrendererfilteredsignal.h"9#include "waveform/renderers/waveformrendererfilteredsignal.h"
10#include "waveform/renderers/waveformrendererpreroll.h"10#include "waveform/renderers/waveformrendererpreroll.h"
11#include "waveform/renderers/waveformrendererendoftrack.h"
11#include "waveform/renderers/waveformrenderbeat.h"12#include "waveform/renderers/waveformrenderbeat.h"
1213
13SoftwareWaveformWidget::SoftwareWaveformWidget( const char* group, QWidget* parent) :14SoftwareWaveformWidget::SoftwareWaveformWidget( const char* group, QWidget* parent) :
@@ -15,11 +16,11 @@
15 QWidget(parent) {16 QWidget(parent) {
1617
17 addRenderer<WaveformRenderBackground>();18 addRenderer<WaveformRenderBackground>();
19 addRenderer<WaveformRendererEndOfTrack>();
20 addRenderer<WaveformRendererPreroll>();
18 addRenderer<WaveformRenderMarkRange>();21 addRenderer<WaveformRenderMarkRange>();
19 addRenderer<WaveformRendererFilteredSignal>();22 addRenderer<WaveformRendererFilteredSignal>();
20 addRenderer<WaveformRendererPreroll>();
21 addRenderer<WaveformRenderMark>();23 addRenderer<WaveformRenderMark>();
22 addRenderer<WaveformRenderMarkRange>();
23 addRenderer<WaveformRenderBeat>();24 addRenderer<WaveformRenderBeat>();
2425
25 init();26 init();
2627
=== modified file 'mixxx/src/waveform/widgets/softwarewaveformwidget.h'
--- mixxx/src/waveform/widgets/softwarewaveformwidget.h 2012-04-29 18:45:39 +0000
+++ mixxx/src/waveform/widgets/softwarewaveformwidget.h 2012-05-17 02:22:20 +0000
@@ -10,7 +10,7 @@
10 public:10 public:
11 virtual ~SoftwareWaveformWidget();11 virtual ~SoftwareWaveformWidget();
1212
13 virtual QString getWaveformWidgetName() { return tr("Filtered");}13 virtual QString getWaveformWidgetName() { return tr("Filtered - Soft");}
14 virtual WaveformWidgetType::Type getType() const { return WaveformWidgetType::SoftwareWaveform;}14 virtual WaveformWidgetType::Type getType() const { return WaveformWidgetType::SoftwareWaveform;}
1515
16 virtual bool useOpenGl() const { return false;}16 virtual bool useOpenGl() const { return false;}
1717
=== modified file 'mixxx/src/waveform/widgets/waveformwidgettype.h'
--- mixxx/src/waveform/widgets/waveformwidgettype.h 2012-04-29 18:45:39 +0000
+++ mixxx/src/waveform/widgets/waveformwidgettype.h 2012-05-17 02:22:20 +0000
@@ -5,8 +5,10 @@
5 public:5 public:
6 enum Type {6 enum Type {
7 EmptyWaveform = 0,7 EmptyWaveform = 0,
8 SimpleSoftwareWaveform, //TODO8 SoftwareSimpleWaveform, //TODO
9 SoftwareWaveform, //TODO9 SoftwareWaveform, //TODO
10 QtSimpleWaveform, //TODO
11 QtWaveform,
10 GLSimpleWaveform,12 GLSimpleWaveform,
11 GLWaveform,13 GLWaveform,
12 GLSLWaveform,14 GLSLWaveform,
1315
=== modified file 'mixxx/src/widget/wwaveformviewer.cpp'
--- mixxx/src/widget/wwaveformviewer.cpp 2012-04-25 04:10:59 +0000
+++ mixxx/src/widget/wwaveformviewer.cpp 2012-05-17 02:22:20 +0000
@@ -153,7 +153,8 @@
153153
154void WWaveformViewer::wheelEvent(QWheelEvent *event) {154void WWaveformViewer::wheelEvent(QWheelEvent *event) {
155 if (m_waveformWidget) {155 if (m_waveformWidget) {
156 if (event->x() > width() - m_zoomZoneWidth) {156 //NOTE: (vrince) to limit the zoom action area uncomment the following line
157 //if (event->x() > width() - m_zoomZoneWidth) {
157 if (event->delta() > 0) {158 if (event->delta() > 0) {
158 //qDebug() << "WaveformWidgetRenderer::wheelEvent +1";159 //qDebug() << "WaveformWidgetRenderer::wheelEvent +1";
159 onZoomChange(m_waveformWidget->getZoomFactor()+1);160 onZoomChange(m_waveformWidget->getZoomFactor()+1);
@@ -162,7 +163,7 @@
162 //qDebug() << "WaveformWidgetRenderer::wheelEvent -1";163 //qDebug() << "WaveformWidgetRenderer::wheelEvent -1";
163 onZoomChange(m_waveformWidget->getZoomFactor()-1);164 onZoomChange(m_waveformWidget->getZoomFactor()-1);
164 }165 }
165 }166 //}
166 }167 }
167}168}
168169