diff --git a/ChangeLog b/ChangeLog index dd55a792e..6475b4650 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,128 @@ +2006-04-16 Danny McRae + * Makefile.am: + * src/lmms_single_source.cpp: + * include/knob.h: + * include/instrument_track.h: + * src/tracks/instrument_track.cpp: + *+src/include/volume_knob.h: + *+src/widgets/volume_knob.cpp: + * include/setup_dialog.h: + * src/core/setup_dialog.cpp: + * include/sample_track.h: + * src/tracks/sample_track.cpp: + * plugins/audio_file_processor/audio_file_processor.h: + * plugins/audio_file_processor/audio_file_processor.cpp: + * plugins/organic/organic.h: + * plugins/organic/organic.cpp: + * plugins/triple_oscillator/triple_oscillator.h: + * plugins/triple_oscillator/triple_oscillator.cpp: + * plugins/vibed/vibed.h: + * plugins/vibed/vibed.cpp: + Added a volume knob widget that will display the volume level as + either a percentage or in dbV, which can be selected from the + general settings in the setup dialog. Changed vibed to use a + volume range from 0 to 200 to bring it in line with every other + volume knob in lmms. Unfortunately, this will break any existing + presets, but better to do it now before many of them actually + exist. + + * src/core/mixer.cpp: + Changed the number of channels processed from the fixed value of + SURROUND_CHANNELS to m_audioDev->channels() so that only the + number of channels that will be output get processed instead of + the maximum number of channels that could be defined. + +2006-04-15 Danny McRae + * include/mixer.h: + * src/core/mixer.cpp: + * src/core/song_editor.cpp: + *+data/themes/default/auto_limit.png: + *+data/themes/blue_scene/auto_limit.png: + Added auto limiter option. Main window now has a button next to + the high-quality button to toggle the auto limiter on and off + The limiter scales the whole section between zero crossings where + a clip occurs. This required adding another processing buffer + in the mixer, which will double the latency when the auto limiter + is being used, but when it's not being used, there is no change + to the latency. Because it's based on detecting the zero + crossings, the lowest frequency for which it is effective is + sample_rate/(4*buffer_len). + +2006-04-14 Tobias Doerffel + + * src/lib/mmp.cpp: + clean metadata-nodes when saving projects, project-templates or presets + + * plugins/vibed/vibed.cpp: + - in vibed::loadSettings(): + - simplified loading of wave-shape + - delete base64-decoded data at the end + - commented out code in destructor as it is not neccessary - to be + removed someday + + * include/base64.h: + fixed fatal bug in Qt4-version of base64::decode(): memcpy()ed data to + _data instead of *_data + + * src/widgets/group_box.cpp: + * src/widgets/tab_widget.cpp: + some fine-tuning of Qt4-version of painting-code + + * src/widgets/lcd_spinbox.cpp: + explicitely set black background-color in Qt4-version + + * src/core/midi_tab_widget.cpp: + Qt4-version of MIDI-connection-code is now working + + * src/core/main_window.cpp: + * plugins/vibed/impulse_editor.cpp: + * plugins/vibed/nine_button_selector.cpp: + * plugins/vibed/vibed.cpp: + * plugins/plucked_string_synth/plucked_string_synth.cpp: + * plugins/triple_oscillator/triple_oscillator.cpp: + * plugins/bit_invader/bit_invader.cpp: + * plugins/organic/organic.cpp: + * src/core/song_editor.cpp: + * src/core/piano_roll.cpp: + * src/core/main_window.cpp: + * src/core/bb_editor.cpp: + * src/core/track.cpp: + * src/widgets/project_notes.cpp: + * src/widgets/group_box.cpp: + * src/widgets/tab_widget.cpp: + * src/widgets/tool_button.cpp: + added missing setAutoFillBackground( TRUE )-call for making QWidget + paint specified background-color/pixmap - makes Qt4-version of LMMS + almost usable + + * src/widgets/tab_widget.cpp: + per default hide newly added tabs + + * include/spc_bg_hndl_widget.h: + added missing code for painting pixmap-backgrounds in Qt4-version + + * plugins/vestige/lvsl_client.cpp: + use QX11EmbedContainer instead of QX11EmbedWidget in Qt4-version -> + working VST-support in Qt4-version of LMMS + + * include/sample_buffer.h: + * src/lib/sample_buffer.cpp: + - when loading sample, first look for it in user's working-directory, + then in LMMS' factory-samples-directory + - simplified making the path of a sample-file relative + + * include/config_mgr.h: + * src/core/config_mgr.cpp: + * src/core/main_window.cpp: + * src/tracks/instrument_track.cpp: + replaced methods projectsDir(), presetsDir() and samplesDir() with + userProjectsDir(), factoryProjectsDir(), userPresetsDir(), + factoryPresetsDir() etc. + + * include/file_browser.h: + * src/core/file_browser.cpp: + try to avoid duplicate "/" in paths - fixes some problems + 2006-04-10 Tobias Doerffel * most files: diff --git a/Makefile.am b/Makefile.am index b08db5076..350f21023 100644 --- a/Makefile.am +++ b/Makefile.am @@ -95,7 +95,8 @@ lmms_MOC = \ ./tool_button.moc \ ./track_container.moc \ ./track.moc \ - ./visualization_widget.moc + ./visualization_widget.moc \ + ./volume_knob.moc BUILT_SOURCES = $(lmms_MOC) @@ -193,6 +194,7 @@ lmms_SOURCES = \ $(srcdir)/src/widgets/tool_button.cpp \ $(srcdir)/src/widgets/tooltip.cpp \ $(srcdir)/src/widgets/visualization_widget.cpp \ + $(srcdir)/src/widgets/volume_knob.cpp \ $(srcdir)/src/lmms_single_source.cpp \ $(srcdir)/include/pch.h \ $(srcdir)/include/debug.h \ @@ -284,6 +286,7 @@ lmms_SOURCES = \ $(srcdir)/include/led_checkbox.h \ $(srcdir)/include/text_float.h \ $(srcdir)/include/tempo_sync_knob.h \ + $(srcdir)/include/volume_knob.h \ $(srcdir)/include/setup_dialog.h \ $(srcdir)/include/dummy_plugin.h \ $(srcdir)/include/dummy_instrument.h \ diff --git a/TODO b/TODO index 0cd9c1352..57f6bfb53 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,6 @@ - replace rest of wizard by simple directory-selection-dialog for working-dir when running the first time - do REAL release in envelopes (can't be precalculated as it depends on key-press-duration/rest of envelope) - correctly load steps/dots from FLP-files -- vibed-plugin: do not crash at destruction - convert FL-Plucked!-parameters to Vibed-parameters - in flp-import-filter: merge play-list-items if possible - integrated sample-browser in context-menu of sample-track/-tco diff --git a/data/themes/blue_scene/auto_limit.png b/data/themes/blue_scene/auto_limit.png new file mode 100644 index 000000000..bc44a0d00 Binary files /dev/null and b/data/themes/blue_scene/auto_limit.png differ diff --git a/data/themes/default/auto_limit.png b/data/themes/default/auto_limit.png new file mode 100644 index 000000000..588fbdc83 Binary files /dev/null and b/data/themes/default/auto_limit.png differ diff --git a/include/base64.h b/include/base64.h index 98813e576..6437126d3 100644 --- a/include/base64.h +++ b/include/base64.h @@ -42,7 +42,8 @@ class QVariant; namespace base64 { #ifndef QT3 - inline void encode( const char * _data, const int _size, QString & _dst ) + inline void encode( const char * _data, const int _size, + QString & _dst ) { _dst = QByteArray( _data, _size ).toBase64(); } @@ -52,7 +53,7 @@ namespace base64 QByteArray data = QByteArray::fromBase64( _b64.toAscii() ); *_size = data.size(); *_data = new char[*_size]; - memcpy( _data, data.constData(), *_size ); + memcpy( *_data, data.constData(), *_size ); } #else void encode( const char * _data, const int _size, QString & _dst ); diff --git a/include/config_mgr.h b/include/config_mgr.h index e039e76c1..d99b6a35a 100644 --- a/include/config_mgr.h +++ b/include/config_mgr.h @@ -92,19 +92,34 @@ public: return( m_workingDir ); } - QString projectsDir( void ) const + QString userProjectsDir( void ) const { - return( m_workingDir + PROJECTS_PATH ); + return( workingDir() + PROJECTS_PATH ); } - QString presetsDir( void ) const + QString userPresetsDir( void ) const { - return( m_workingDir + PRESETS_PATH ); + return( workingDir() + PRESETS_PATH ); } - QString samplesDir( void ) const + QString userSamplesDir( void ) const { - return( m_workingDir + SAMPLES_PATH ); + return( workingDir() + SAMPLES_PATH ); + } + + QString factoryProjectsDir( void ) const + { + return( dataDir() + PROJECTS_PATH ); + } + + QString factoryPresetsDir( void ) const + { + return( dataDir() + PRESETS_PATH ); + } + + QString factorySamplesDir( void ) const + { + return( dataDir() + SAMPLES_PATH ); } QString defaultArtworkDir( void ) const diff --git a/include/file_browser.h b/include/file_browser.h index a60881aea..ac12a4709 100644 --- a/include/file_browser.h +++ b/include/file_browser.h @@ -42,6 +42,8 @@ #include #include +#define cleanPath cleanDirPath + #endif @@ -145,11 +147,9 @@ public: { _path = m_directories[0]; } -#ifdef QT4 - return( QDir::cleanPath( _path + "/" + text( 0 ) + "/" ) ); -#else - return( QDir::cleanDirPath( _path + "/" + text( 0 ) + "/" ) ); -#endif + return( QDir::cleanPath( _path + QDir::separator() + + text( 0 ) ) + + QDir::separator() ); } inline const QPixmap * pixmap( int ) const @@ -194,7 +194,8 @@ public: inline QString fullName( void ) const { - return( m_path + "/" + text( 0 ) ); + return( QDir::cleanPath( m_path ) + QDir::separator() + + text( 0 ) ); } inline const QPixmap * pixmap( int ) const { @@ -230,5 +231,9 @@ private: } ; +#ifdef QT3 +#undef cleanPath +#endif + #endif diff --git a/include/instrument_track.h b/include/instrument_track.h index 315061d6b..cdac1f1a9 100755 --- a/include/instrument_track.h +++ b/include/instrument_track.h @@ -51,7 +51,7 @@ #include "gui_templates.h" #include "tab_widget.h" #include "engine.h" - +#include "volume_knob.h" class QLineEdit; class arpAndChordsTabWidget; @@ -60,7 +60,6 @@ class instrumentTrackButton; class envelopeTabWidget; class fadeButton; class instrument; -class knob; class lcdSpinBox; class midiPort; class midiTabWidget; @@ -223,7 +222,7 @@ private: // widgets on the top of a instrument-track-window tabWidget * m_generalSettingsWidget; QLineEdit * m_instrumentNameLE; - knob * m_volumeKnob; + volumeKnob * m_volumeKnob; surroundArea * m_surroundArea; lcdSpinBox * m_effectChannelNumber; QPushButton * m_saveSettingsBtn; @@ -242,7 +241,7 @@ private: // widgets in track-settings-widget - knob * m_tswVolumeKnob; + volumeKnob * m_tswVolumeKnob; fadeButton * m_tswActivityIndicator; instrumentTrackButton * m_tswInstrumentTrackButton; QMenu * m_tswMidiMenu; diff --git a/include/knob.h b/include/knob.h index 1ea96f4e9..8e7d6ff1d 100644 --- a/include/knob.h +++ b/include/knob.h @@ -90,7 +90,7 @@ public slots: void reset( void ); void copyValue( void ); void pasteValue( void ); - void enterValue( void ); + virtual void enterValue( void ); void connectToMidiDevice( void ); void displayHelp( void ); diff --git a/include/mixer.h b/include/mixer.h index 065ec97d8..551e2e440 100644 --- a/include/mixer.h +++ b/include/mixer.h @@ -198,7 +198,7 @@ public: inline const surroundSampleFrame * currentAudioBuffer( void ) const { - return( m_curBuf ); + return( m_writeBuf ); } @@ -285,7 +285,7 @@ public: public slots: void setHighQuality( bool _hq_on = FALSE ); - + void setClipScaling( bool _state ); signals: void sampleRateChanged( void ); @@ -315,15 +315,29 @@ private: void processBuffer( const surroundSampleFrame * _buf, const fx_ch_t _fx_chnl ); - + void FASTCALL scaleClip( fpab_t _frame, ch_cnt_t _chnl ); vvector m_audioPorts; fpab_t m_framesPerAudioBuffer; - surroundSampleFrame * m_curBuf; - surroundSampleFrame * m_nextBuf; - + surroundSampleFrame * m_readBuf; + surroundSampleFrame * m_writeBuf; + + vvector m_bufferPool; + Uint8 m_readBuffer; + Uint8 m_writeBuffer; + Uint8 m_analBuffer; + Uint8 m_poolDepth; + + bool m_scaleClip; + surroundSampleFrame m_maxClip; + surroundSampleFrame m_previousSample; + fpab_t m_halfStart[SURROUND_CHANNELS]; + bool m_clipped[SURROUND_CHANNELS]; + bool m_oldBuffer[SURROUND_CHANNELS]; + bool m_newBuffer[SURROUND_CHANNELS]; + Uint8 m_cpuLoad; playHandleVector m_playHandles; diff --git a/include/mmp.h b/include/mmp.h index 1feb55e17..2dd6bd9f5 100644 --- a/include/mmp.h +++ b/include/mmp.h @@ -1,7 +1,7 @@ /* * mmp.h - class for reading and writing multimedia-project-files * - * Copyright (c) 2004-2005 Tobias Doerffel + * Copyright (c) 2004-2006 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -90,6 +90,9 @@ private: static projectTypes FASTCALL type( const QString & _type_name ); static QString FASTCALL typeName( projectTypes _project_type ); + void cleanMetaNodes( QDomElement _de ); + + struct typeDescStruct { projectTypes m_type; diff --git a/include/sample_buffer.h b/include/sample_buffer.h index 912e84bae..f8f8b9eac 100644 --- a/include/sample_buffer.h +++ b/include/sample_buffer.h @@ -162,6 +162,9 @@ public slots: private: void FASTCALL update( bool _keep_settings = FALSE ); + static QString tryToMakeRelative( const QString & _file ); + + #ifdef SDL_SDL_SOUND_H f_cnt_t FASTCALL decodeSampleSDL( const char * _f, int_sample_t * & _buf, diff --git a/include/sample_track.h b/include/sample_track.h index f81cc0228..0ed885691 100644 --- a/include/sample_track.h +++ b/include/sample_track.h @@ -42,12 +42,13 @@ #include "track.h" #include "sample_buffer.h" +#include "volume_knob.h" class nameLabel; class audioPort; class QLabel; -class knob; + //class sampleTCOSettingsDialog; @@ -152,7 +153,7 @@ private: nameLabel * m_trackLabel; audioPort * m_audioPort; - knob * m_volumeKnob; + volumeKnob * m_volumeKnob; float m_volume; } ; diff --git a/include/setup_dialog.h b/include/setup_dialog.h index e999f0b5d..6c8ab907b 100644 --- a/include/setup_dialog.h +++ b/include/setup_dialog.h @@ -98,7 +98,7 @@ private slots: void toggleGIMPLikeWindows( bool _enabled ); void toggleNoWizard( bool _enabled ); void toggleNoMsgAfterSetup( bool _enabled ); - + void toggleDisplaydBV( bool _enabled ); void openWorkingDir( void ); void openVSTDir( void ); @@ -122,6 +122,7 @@ private: bool m_gimpLikeWindows; bool m_noWizard; bool m_noMsgAfterSetup; + bool m_displaydBV; QLineEdit * m_wdLineEdit; diff --git a/include/spc_bg_hndl_widget.h b/include/spc_bg_hndl_widget.h index fc7520d3d..1a1ac4180 100644 --- a/include/spc_bg_hndl_widget.h +++ b/include/spc_bg_hndl_widget.h @@ -1,7 +1,7 @@ /* * spc_bg_hndl_widget.h - class specialBgHandlingWidget * - * Copyright (c) 2005 Tobias Doerffel + * Copyright (c) 2005-2006 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -100,11 +100,18 @@ public: { #ifdef QT4 QPainter p( &pm ); - // TODO: fix that for background-pixmaps, because - // drawing is started at the top left edge even - // if this widget isn't posated there - p.fillRect( _w->rect(), pw->palette().brush( - pw->backgroundRole() ) ); + const QBrush & br = pw->palette().brush( + pw->backgroundRole() ); + if( br.style() == Qt::TexturePattern ) + { + p.drawPixmap( 0, 0, br.texture(), + _w->x(), _w->y(), + _w->width(), _w->height() ); + } + else + { + pm.fill( br.color() ); + } #else const QPixmap * pbp = pw->paletteBackgroundPixmap(); if( pbp == NULL ) diff --git a/include/volume_knob.h b/include/volume_knob.h new file mode 100644 index 000000000..62dcd35ad --- /dev/null +++ b/include/volume_knob.h @@ -0,0 +1,59 @@ +/* + * volume_knob.h - defines a knob that display it's value as either a + * percentage or in dbV. + * + * Copyright (c) 2006 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ +#ifndef _VOLUME_KNOB_H +#define _VOLUME_KNOB_H + +#ifdef QT4 + +#include + +#else + +#include + +#endif + +#include "types.h" +#include "knob.h" + + +class volumeKnob: public knob +{ + Q_OBJECT +public: + volumeKnob( int _knob_num, QWidget * _parent, const QString & _name, + engine * _engine ); + ~volumeKnob(); + +public slots: + void enterValue( void ); + +protected: + virtual void mousePressEvent( QMouseEvent * _me ); + virtual void mouseMoveEvent( QMouseEvent * _me ); + virtual void wheelEvent( QWheelEvent * _we ); +}; + +#endif diff --git a/plugins/audio_file_processor/audio_file_processor.cpp b/plugins/audio_file_processor/audio_file_processor.cpp index 8e9cf2824..63582eae8 100644 --- a/plugins/audio_file_processor/audio_file_processor.cpp +++ b/plugins/audio_file_processor/audio_file_processor.cpp @@ -60,7 +60,7 @@ #undef SINGLE_SOURCE_COMPILE #include "embed.cpp" - +#include "volume_knob.h" extern "C" @@ -169,7 +169,7 @@ audioFileProcessor::audioFileProcessor( instrumentTrack * _channel_track ) : "This is useful for things like string- and choir-" "samples." ) ); - m_ampKnob = new knob( knobDark_28, this, tr( "Amplify" ), eng() ); + m_ampKnob = new volumeKnob( knobDark_28, this, tr( "Amplify" ), eng() ); m_ampKnob->setRange( 0, 500, 1.0f ); m_ampKnob->move( 6, 114 ); m_ampKnob->setInitValue( 100.0f ); diff --git a/plugins/audio_file_processor/audio_file_processor.h b/plugins/audio_file_processor/audio_file_processor.h index 97dabd969..f6c7f4b76 100644 --- a/plugins/audio_file_processor/audio_file_processor.h +++ b/plugins/audio_file_processor/audio_file_processor.h @@ -46,6 +46,7 @@ class knob; class pixmapButton; +class volumeKnob; class audioFileProcessor : public instrument, public specialBgHandlingWidget @@ -100,7 +101,7 @@ private: sampleBuffer::drawMethods m_drawMethod; QPixmap m_graph; - knob * m_ampKnob; + volumeKnob * m_ampKnob; knob * m_startKnob; knob * m_endKnob; pixmapButton * m_openAudioFileButton; diff --git a/plugins/bit_invader/bit_invader.cpp b/plugins/bit_invader/bit_invader.cpp index e1d2a249b..8e8b6b954 100644 --- a/plugins/bit_invader/bit_invader.cpp +++ b/plugins/bit_invader/bit_invader.cpp @@ -321,6 +321,7 @@ bitInvader::bitInvader( instrumentTrack * _channel_track ) : #ifdef QT4 + setAutoFillBackground( TRUE ); QPalette pal; pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); diff --git a/plugins/organic/organic.cpp b/plugins/organic/organic.cpp index 22bfd97fb..b67fe9ab4 100644 --- a/plugins/organic/organic.cpp +++ b/plugins/organic/organic.cpp @@ -58,13 +58,11 @@ using namespace std; #include "knob.h" #include "pixmap_button.h" #include "tooltip.h" -#include "song_editor.h" #include "oscillator.h" -#include "sample_buffer.h" -#include "base64.h" #undef SINGLE_SOURCE_COMPILE #include "embed.cpp" +#include "volume_knob.h" extern "C" @@ -125,7 +123,7 @@ organicInstrument::organicInstrument( instrumentTrack * _channel_track ) : ); // setup volume-knob - m_osc[i].volKnob = new knob( knobGreen_17, this, tr( + m_osc[i].volKnob = new volumeKnob( knobGreen_17, this, tr( "Osc %1 volume" ).arg( i+1 ), eng() ); m_osc[i].volKnob->move( 25+i*20, 110 ); m_osc[i].volKnob->setRange( 0, 100, 1.0f ); @@ -208,6 +206,7 @@ organicInstrument::organicInstrument( instrumentTrack * _channel_track ) : #ifdef QT4 + setAutoFillBackground( TRUE ); QPalette pal; pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); diff --git a/plugins/organic/organic.h b/plugins/organic/organic.h index 7e494b473..e7af8d03f 100644 --- a/plugins/organic/organic.h +++ b/plugins/organic/organic.h @@ -37,6 +37,7 @@ class QPixmap; class knob; class notePlayHandle; class pixmapButton; +class volumeKnob; class organicInstrument : public instrument, public specialBgHandlingWidget @@ -83,7 +84,7 @@ private: { oscillator::waveShapes waveShape; knob * oscKnob; - knob * volKnob; + volumeKnob * volKnob; knob * panKnob; knob * detuneKnob; float harmonic; diff --git a/plugins/plucked_string_synth/plucked_string_synth.cpp b/plugins/plucked_string_synth/plucked_string_synth.cpp index 6ecceb70e..c4675469f 100644 --- a/plugins/plucked_string_synth/plucked_string_synth.cpp +++ b/plugins/plucked_string_synth/plucked_string_synth.cpp @@ -85,6 +85,7 @@ pluckedStringSynth::pluckedStringSynth( instrumentTrack * _channel_track ) : m_pickupKnob->move( 138, 134 ); m_pickupKnob->setHintText( tr( "Pickup position:" ) + " ", "" ); #ifdef QT4 + setAutoFillBackground( TRUE ); QPalette pal; pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); diff --git a/plugins/triple_oscillator/triple_oscillator.cpp b/plugins/triple_oscillator/triple_oscillator.cpp index 8736ae0d4..3580d5ad2 100644 --- a/plugins/triple_oscillator/triple_oscillator.cpp +++ b/plugins/triple_oscillator/triple_oscillator.cpp @@ -58,6 +58,7 @@ #undef SINGLE_SOURCE_COMPILE #include "embed.cpp" +#include "volume_knob.h" extern "C" @@ -90,6 +91,7 @@ tripleOscillator::tripleOscillator( instrumentTrack * _channel_track ) : } #ifdef QT4 + setAutoFillBackground( TRUE ); QPalette pal; pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); @@ -216,7 +218,7 @@ tripleOscillator::tripleOscillator( instrumentTrack * _channel_track ) : m_osc[i].waveShape = oscillator::SIN_WAVE; // setup volume-knob - m_osc[i].volKnob = new knob( knobSmall_17, this, tr( + m_osc[i].volKnob = new volumeKnob( knobSmall_17, this, tr( "Osc %1 volume" ).arg( i+1 ), eng() ); m_osc[i].volKnob->move( 6, 104+i*50 ); m_osc[i].volKnob->setRange( MIN_VOLUME, MAX_VOLUME, 1.0f ); diff --git a/plugins/triple_oscillator/triple_oscillator.h b/plugins/triple_oscillator/triple_oscillator.h index 52467fb87..b1b5a40d9 100644 --- a/plugins/triple_oscillator/triple_oscillator.h +++ b/plugins/triple_oscillator/triple_oscillator.h @@ -36,7 +36,7 @@ class knob; class notePlayHandle; class pixmapButton; class sampleBuffer; - +class volumeKnob; const int NUM_OF_OSCILLATORS = 3; @@ -80,7 +80,7 @@ private: struct oscillatorData { oscillator::waveShapes waveShape; - knob * volKnob; + volumeKnob * volKnob; knob * panKnob; knob * coarseKnob; knob * fineLKnob; diff --git a/plugins/vestige/lvsl_client.cpp b/plugins/vestige/lvsl_client.cpp index 646345214..c298d13ab 100644 --- a/plugins/vestige/lvsl_client.cpp +++ b/plugins/vestige/lvsl_client.cpp @@ -30,7 +30,7 @@ #include #include #include -#include +#include #include #else @@ -40,8 +40,8 @@ #include "qxembed.h" -#define QX11EmbedWidget QXEmbed -#define embedInto embed +#define QX11EmbedContainer QXEmbed +#define embedClient embed #endif @@ -246,10 +246,13 @@ void remoteVSTPlugin::showEditor( void ) m_pluginWidget = new QWidget( eng()->getMainWindow()->workspace() ); m_pluginWidget->setFixedSize( m_pluginGeometry ); m_pluginWidget->setWindowTitle( name() ); +#ifndef QT3 + eng()->getMainWindow()->workspace()->addWindow( m_pluginWidget ); +#endif m_pluginWidget->show(); - QX11EmbedWidget * xe = new QX11EmbedWidget( m_pluginWidget ); - xe->embedInto( m_pluginXID ); + QX11EmbedContainer * xe = new QX11EmbedContainer( m_pluginWidget ); + xe->embedClient( m_pluginXID ); xe->setFixedSize( m_pluginGeometry ); //xe->setAutoDelete( FALSE ); xe->show(); diff --git a/plugins/vestige/vestige.cpp b/plugins/vestige/vestige.cpp index b6c304233..2d3d16e5b 100644 --- a/plugins/vestige/vestige.cpp +++ b/plugins/vestige/vestige.cpp @@ -100,9 +100,9 @@ vestigeInstrument::vestigeInstrument( instrumentTrack * _channel_track ) : } #ifdef QT4 - QPalette pal; +/* QPalette pal; pal.setBrush( backgroundRole(), *s_artwork); - setPalette( pal ); + setPalette( pal );*/ #else setErasePixmap( *s_artwork ); #endif @@ -254,7 +254,7 @@ void vestigeInstrument::setParameter( const QString & _param, if( _param == "plugin" && _value != "" ) { m_pluginMutex.lock(); - bool set_ch_name = ( m_plugin != NULL && + const bool set_ch_name = ( m_plugin != NULL && getInstrumentTrack()->name() == m_plugin->name() ) || getInstrumentTrack()->name() == instrumentTrack::tr( "Default" ); @@ -267,7 +267,7 @@ void vestigeInstrument::setParameter( const QString & _param, tr( "Loading plugin" ), tr( "Please wait while loading VST-plugin..." ), PLUGIN_NAME::getIconPixmap( "logo", 24, 24 ), - 0 ); + 0 ); m_pluginMutex.lock(); m_plugin = new remoteVSTPlugin( m_pluginDLL, eng() ); if( m_plugin->failed() ) diff --git a/plugins/vibed/impulse_editor.cpp b/plugins/vibed/impulse_editor.cpp index e66f869f9..e0d4e2880 100644 --- a/plugins/vibed/impulse_editor.cpp +++ b/plugins/vibed/impulse_editor.cpp @@ -63,8 +63,9 @@ impulseEditor::impulseEditor( QWidget * _parent, int _x, int _y, setFixedSize( 153, 124 ); m_base = QPixmap::grabWidget( _parent, _x, _y ); #ifndef QT3 + setAutoFillBackground( TRUE ); QPalette pal = palette(); - pal.setBrush( backgroundRole(), QBrush( m_base ) ); + pal.setBrush( backgroundRole(), m_base ); setPalette( pal ); #else setPaletteBackgroundPixmap( m_base ); diff --git a/plugins/vibed/nine_button_selector.cpp b/plugins/vibed/nine_button_selector.cpp index 565b98026..a9468bd96 100644 --- a/plugins/vibed/nine_button_selector.cpp +++ b/plugins/vibed/nine_button_selector.cpp @@ -73,8 +73,9 @@ nineButtonSelector::nineButtonSelector( QPixmap _button0_on, m_base = QPixmap::grabWidget( _parent, _x, _y ); move( _x, _y ); #ifndef QT3 + setAutoFillBackground( TRUE ); QPalette pal = palette(); - pal.setBrush( backgroundRole(), QBrush( m_base ) ); + pal.setBrush( backgroundRole(), m_base ); setPalette( pal ); #else setPaletteBackgroundPixmap( m_base ); diff --git a/plugins/vibed/nine_button_selector.h b/plugins/vibed/nine_button_selector.h index df47763f1..0d82eb55a 100644 --- a/plugins/vibed/nine_button_selector.h +++ b/plugins/vibed/nine_button_selector.h @@ -79,7 +79,7 @@ signals: void nineButtonSelection( Uint8 ); private: - vlist m_buttons; + vlist m_buttons; pixmapButton * m_button; pixmapButton * m_lastBtn; QPixmap m_base; diff --git a/plugins/vibed/vibed.cpp b/plugins/vibed/vibed.cpp index 76bc56a92..17b77bac7 100644 --- a/plugins/vibed/vibed.cpp +++ b/plugins/vibed/vibed.cpp @@ -52,12 +52,13 @@ #include "knob.h" #include "tooltip.h" #include "oscillator.h" -#include "song_editor.h" #include "string_container.h" #include "base64.h" #undef SINGLE_SOURCE_COMPILE #include "embed.cpp" +#include "volume_knob.h" +#include "volume.h" extern "C" @@ -83,6 +84,7 @@ vibed::vibed( instrumentTrack * _channel_track ) : m_sampleLength( 128 ) { #ifdef QT4 + setAutoFillBackground( TRUE ); QPalette pal; pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); @@ -115,11 +117,11 @@ vibed::vibed( instrumentTrack * _channel_track ) : "The 'N' button will normalize the waveform.") ); - m_volumeKnob = new knob( knobBright_26, this, + m_volumeKnob = new volumeKnob( knobBright_26, this, tr( "Volume" ), eng() ); - m_volumeKnob->setRange( 0.0f, 2.0f, 0.01f ); - m_volumeKnob->setInitValue( 1.0f ); + m_volumeKnob->setRange( MIN_VOLUME, MAX_VOLUME, 1.0f ); + m_volumeKnob->setInitValue( DEFAULT_VOLUME ); m_volumeKnob->move( 103, 142 ); m_volumeKnob->setHintText( tr( "Volume:" ) + " ", "" ); m_volumeKnob->hide(); @@ -407,6 +409,7 @@ vibed::vibed( instrumentTrack * _channel_track ) : vibed::~vibed() { +/* for( Uint8 harm = 0; harm < 9; harm++ ) { delete m_pickKnobs[harm]; @@ -420,7 +423,7 @@ vibed::~vibed() delete m_editors[harm]; delete m_impulses[harm]; delete m_harmonics[harm]; - } + }*/ } @@ -546,14 +549,22 @@ void vibed::loadSettings( const QDomElement & _this ) m_impulses[i]->setChecked( _this.attribute( name ).toInt() ); - name = "graph" + QString::number( i ); - float shape[128]; int size = 0; - QString sampleString = _this.attribute( name ); - char * dst = 0; - base64::decode( sampleString, &dst, &size ); - memcpy( shape, dst, size ); - m_editors[i]->setValues( shape ); + float * shp = 0; + base64::decode( _this.attribute( "graph" + + QString::number( i ) ), + (char * *) &shp, &size ); + // TODO: check whether size == 128 * sizeof( float ), + // otherwise me might and up in a segfault + m_editors[i]->setValues( shp ); + delete[] shp; + + // TODO: do one of the following to avoid + // "uninitialized" wave-shape-buttongroup + // - activate random-wave-shape-button here + // - make wave-shape-buttons simple toggle-buttons + // instead of checkable buttons + // - save and restore selected wave-shape-button } } @@ -623,7 +634,8 @@ void vibed::playNote( notePlayHandle * _n ) { if( ps->exists( string ) ) { - vol = m_volumeKnobs[string]->value(); + vol = ( m_volumeKnobs[string]->value() ) / + 100.0f; pan = ( m_panKnobs[string]->value() + 1 ) / 2.0; sample = ps->getStringSample( s ); diff --git a/plugins/vibed/vibed.h b/plugins/vibed/vibed.h index 56ec08d9d..488fe4d4f 100644 --- a/plugins/vibed/vibed.h +++ b/plugins/vibed/vibed.h @@ -37,6 +37,7 @@ class knob; class notePlayHandle; +class volumeKnob; class vibed : public instrument @@ -66,7 +67,7 @@ private: vlist m_pickKnobs; vlist m_pickupKnobs; vlist m_stiffnessKnobs; - vlist m_volumeKnobs; + vlist m_volumeKnobs; vlist m_panKnobs; vlist m_detuneKnobs; vlist m_randomKnobs; @@ -78,7 +79,7 @@ private: knob * m_pickKnob; knob * m_pickupKnob; knob * m_stiffnessKnob; - knob * m_volumeKnob; + volumeKnob * m_volumeKnob; knob * m_panKnob; knob * m_detuneKnob; knob * m_randomKnob; diff --git a/src/core/bb_editor.cpp b/src/core/bb_editor.cpp index 21833d9c8..6606cebab 100644 --- a/src/core/bb_editor.cpp +++ b/src/core/bb_editor.cpp @@ -70,9 +70,10 @@ bbEditor::bbEditor( engine * _engine ) : m_toolBar->setFixedHeight( 32 ); m_toolBar->move( 0, 0 ); #ifdef QT4 + m_toolBar->setAutoFillBackground( TRUE ); QPalette pal; - pal.setBrush( QPalette::Background, QBrush( - embed::getIconPixmap( "toolbar_bg" ) ) ); + pal.setBrush( m_toolBar->backgroundRole(), + embed::getIconPixmap( "toolbar_bg" ) ); m_toolBar->setPalette( pal ); #else m_toolBar->setPaletteBackgroundPixmap( embed::getIconPixmap( diff --git a/src/core/config_mgr.cpp b/src/core/config_mgr.cpp index 71958ffa4..85c81ca63 100644 --- a/src/core/config_mgr.cpp +++ b/src/core/config_mgr.cpp @@ -108,7 +108,7 @@ void mkPath( const QString & _path ) - +/* void linkFile( const QString & _src, const QString & _dst ) { #ifdef QT4 @@ -149,7 +149,7 @@ void copyFile( const QString & _src, const QString & _dst ) } #endif } - +*/ @@ -596,9 +596,9 @@ void configManager::accept( void ) } } - mkPath( projectsDir() ); - mkPath( samplesDir() ); - mkPath( presetsDir() ); + mkPath( userProjectsDir() ); + mkPath( userSamplesDir() ); + mkPath( userPresetsDir() ); /* processFilesRecursively( m_dataDir + "samples/", m_workingDir + "samples/", m_samplesCopyRB->isChecked() ? diff --git a/src/core/file_browser.cpp b/src/core/file_browser.cpp index 145d7d9eb..227dbce81 100644 --- a/src/core/file_browser.cpp +++ b/src/core/file_browser.cpp @@ -170,7 +170,8 @@ void fileBrowser::addItems( const QString & _path ) { QString cur_file = files[files.size() - i - 1]; if( cur_file[0] != '.' && - !QFileInfo( _path + "/" + cur_file ).isDir() + QFileInfo( _path + QDir::separator() + + cur_file ).isDir() == FALSE #ifdef QT4 // TBD #else @@ -188,7 +189,8 @@ void fileBrowser::addItems( const QString & _path ) { QString cur_file = files[files.size() - i - 1]; if( cur_file[0] != '.' && - QFileInfo( _path + "/" + cur_file ).isDir() ) + QFileInfo( _path + QDir::separator() + + cur_file ).isDir() ) { QListViewItem * item = m_l->findItem( cur_file, 0 ); if( item == NULL ) @@ -744,13 +746,13 @@ bool directory::addItems( const QString & _path ) QString cur_file = files[files.size() - i - 1]; #ifdef QT4 if( cur_file[0] != '.' && !QFileInfo( - thisDir.absolutePath() + "/" + + thisDir.absolutePath() + QDir::separator() + cur_file ).isDir() && thisDir.match( m_filter, cur_file.toLower() ) /*QDir::match( FILE_FILTER, cur_file )*/ ) #else if( cur_file[0] != '.' && !QFileInfo( - thisDir.absPath() + "/" + + thisDir.absPath() + QDir::separator() + cur_file ).isDir() && thisDir.match( m_filter, cur_file.lower() ) /*QDir::match( FILE_FILTER, cur_file )*/ ) @@ -766,11 +768,11 @@ bool directory::addItems( const QString & _path ) QString cur_file = files[files.size() - i - 1]; #ifdef QT4 if( cur_file[0] != '.' && QFileInfo( - thisDir.absolutePath() + "/" + + thisDir.absolutePath() + QDir::separator() + cur_file ).isDir() ) #else if( cur_file[0] != '.' && QFileInfo( - thisDir.absPath() + "/" + + thisDir.absPath() + QDir::separator() + cur_file ).isDir() ) #endif { diff --git a/src/core/main_window.cpp b/src/core/main_window.cpp index fb3fb965f..14d528fb3 100644 --- a/src/core/main_window.cpp +++ b/src/core/main_window.cpp @@ -126,26 +126,26 @@ mainWindow::mainWindow( engine * _engine ) : int id = 0; QString wdir = configManager::inst()->workingDir(); side_bar->appendTab( new pluginBrowser( splitter, eng() ), ++id ); - side_bar->appendTab( new fileBrowser( configManager::inst()->dataDir()+ - PROJECTS_PATH + "*" + - wdir+PROJECTS_PATH, + side_bar->appendTab( new fileBrowser( + configManager::inst()->factoryProjectsDir() + "*" + + configManager::inst()->userProjectsDir(), "*.mmp *.xml *.mid *.flp", tr( "My projects" ), embed::getIconPixmap( "project_file" ), splitter, eng() ), ++id ); - side_bar->appendTab( new fileBrowser( configManager::inst()->dataDir()+ - SAMPLES_PATH + "*" + - wdir+SAMPLES_PATH, + side_bar->appendTab( new fileBrowser( + configManager::inst()->factorySamplesDir() + "*" + + configManager::inst()->userSamplesDir(), "*.wav *.ogg *.au" "*.voc *.aif *.aiff *.flac *.raw", tr( "My samples" ), embed::getIconPixmap( "sound_file" ), splitter, eng() ), ++id ); - side_bar->appendTab( new fileBrowser( configManager::inst()->dataDir()+ - PRESETS_PATH + "*" + - wdir+PRESETS_PATH, + side_bar->appendTab( new fileBrowser( + configManager::inst()->factoryPresetsDir() + "*" + + configManager::inst()->userPresetsDir(), "*.cs.xml", tr( "My presets" ), embed::getIconPixmap( "preset_file" ), splitter, eng() ), @@ -184,9 +184,10 @@ mainWindow::mainWindow( engine * _engine ) : m_toolBar->setFixedHeight( 64 ); m_toolBar->move( 0, 0 ); #ifdef QT4 + m_toolBar->setAutoFillBackground( TRUE ); QPalette pal; - pal.setBrush( m_toolBar->backgroundRole(), QBrush( - embed::getIconPixmap( "main_toolbar_bg" ) ) ); + pal.setBrush( m_toolBar->backgroundRole(), + embed::getIconPixmap( "main_toolbar_bg" ) ); m_toolBar->setPalette( pal ); #else m_toolBar->setPaletteBackgroundPixmap( @@ -264,7 +265,7 @@ void mainWindow::finalize( void ) this, SLOT( createNewProject() ), m_toolBar ); - QDir d( configManager::inst()->projectsDir() + "templates" ); + QDir d( configManager::inst()->factoryProjectsDir() + "templates" ); QStringList templates = d.entryList( #ifdef QT4 QStringList( "*.mpt" ), @@ -668,7 +669,8 @@ void mainWindow::createNewProjectFromTemplate( int _idx ) eng()->getSongEditor()->mayChangeProject() == TRUE ) { eng()->getSongEditor()->createNewProjectFromTemplate( - configManager::inst()->projectsDir() + "templates/" + + configManager::inst()->factoryProjectsDir() + + "templates/" + m_templatesMenu->text( _idx ) + ".mpt" ); } #endif @@ -690,7 +692,7 @@ void mainWindow::openProject( void ) this, "", TRUE ); ofd.setWindowTitle( tr( "Open project" ) ); #endif - ofd.setDirectory( configManager::inst()->projectsDir() ); + ofd.setDirectory( configManager::inst()->userProjectsDir() ); ofd.setFileMode( QFileDialog::ExistingFiles ); if( ofd.exec () == QDialog::Accepted && !ofd.selectedFiles().isEmpty() ) @@ -746,7 +748,7 @@ bool mainWindow::saveProjectAs( void ) } else { - sfd.setDirectory( configManager::inst()->projectsDir() ); + sfd.setDirectory( configManager::inst()->userProjectsDir() ); } if( sfd.exec () == QFileDialog::Accepted && diff --git a/src/core/midi_tab_widget.cpp b/src/core/midi_tab_widget.cpp index a8f0e9043..2d8d68c63 100644 --- a/src/core/midi_tab_widget.cpp +++ b/src/core/midi_tab_widget.cpp @@ -310,6 +310,7 @@ void midiTabWidget::loadSettings( const QDomElement & _this ) if( ( *it )->isChecked() != ( rp.indexOf( ( *it )->text() ) != -1 ) ) { + ( *it )->setChecked( TRUE ); activatedReadablePort( *it ); } } @@ -340,6 +341,7 @@ void midiTabWidget::loadSettings( const QDomElement & _this ) if( ( *it )->isChecked() != ( wp.indexOf( ( *it )->text() ) != -1 ) ) { + ( *it )->setChecked( TRUE ); activatedWriteablePort( *it ); } } @@ -418,6 +420,7 @@ void midiTabWidget::midiPortModeToggled( bool ) { if( ( *it )->isChecked() == TRUE ) { + ( *it )->setChecked( FALSE ); activatedReadablePort( *it ); } } @@ -441,6 +444,7 @@ void midiTabWidget::midiPortModeToggled( bool ) { if( ( *it )->isChecked() == TRUE ) { + ( *it )->setChecked( FALSE ); activatedWriteablePort( *it ); } } @@ -494,6 +498,7 @@ void midiTabWidget::readablePortsChanged( void ) { #ifdef QT4 QAction * item = m_readablePorts->addAction( *it ); + item->setCheckable( TRUE ); if( selected_ports.indexOf( *it ) != -1 ) { item->setChecked( TRUE ); @@ -545,6 +550,7 @@ void midiTabWidget::writeablePortsChanged( void ) { #ifdef QT4 QAction * item = m_writeablePorts->addAction( *it ); + item->setCheckable( TRUE ); if( selected_ports.indexOf( *it ) != -1 ) { item->setChecked( TRUE ); @@ -566,13 +572,12 @@ void midiTabWidget::writeablePortsChanged( void ) void midiTabWidget::activatedReadablePort( QAction * _item ) { // make sure, MIDI-port is configured for input - if( _item->isChecked() == FALSE && + if( _item->isChecked() == TRUE && m_midiPort->mode() != midiPort::INPUT && m_midiPort->mode() != midiPort::DUPLEX ) { m_receiveCheckBox->setChecked( TRUE ); } - _item->setChecked( !_item->isChecked() ); eng()->getMixer()->getMIDIClient()->subscribeReadablePort( m_midiPort, _item->text(), !_item->isChecked() ); } @@ -583,13 +588,12 @@ void midiTabWidget::activatedReadablePort( QAction * _item ) void midiTabWidget::activatedWriteablePort( QAction * _item ) { // make sure, MIDI-port is configured for output - if( _item->isChecked() == FALSE && + if( _item->isChecked() == TRUE && m_midiPort->mode() != midiPort::OUTPUT && m_midiPort->mode() != midiPort::DUPLEX ) { m_sendCheckBox->setChecked( TRUE ); } - _item->setChecked( !_item->isChecked() ); eng()->getMixer()->getMIDIClient()->subscribeWriteablePort( m_midiPort, _item->text(), !_item->isChecked() ); } diff --git a/src/core/mixer.cpp b/src/core/mixer.cpp index 3e7b059b5..be73ba58f 100644 --- a/src/core/mixer.cpp +++ b/src/core/mixer.cpp @@ -63,8 +63,8 @@ mixer::mixer( engine * _engine ) : QObject(), engineObject( _engine ), m_framesPerAudioBuffer( DEFAULT_BUFFER_SIZE ), - m_curBuf( NULL ), - m_nextBuf( NULL ), + m_readBuf( NULL ), + m_writeBuf( NULL ), m_cpuLoad( 0 ), m_qualityLevel( DEFAULT_QUALITY_LEVEL ), m_masterGain( 1.0f ), @@ -86,15 +86,16 @@ mixer::mixer( engine * _engine ) : QString::number( m_framesPerAudioBuffer ) ); } - m_curBuf = bufferAllocator::alloc( - m_framesPerAudioBuffer ); - m_nextBuf = bufferAllocator::alloc( - m_framesPerAudioBuffer ); - - // now clear our two output-buffers before using them... - clearAudioBuffer( m_curBuf, m_framesPerAudioBuffer ); - clearAudioBuffer( m_nextBuf, m_framesPerAudioBuffer ); - + for( Uint8 i = 0; i < 3; i++ ) + { + m_readBuf = bufferAllocator::alloc( + m_framesPerAudioBuffer ); + + clearAudioBuffer( m_readBuf, m_framesPerAudioBuffer ); + m_bufferPool.push_back( m_readBuf ); + } + + setClipScaling( FALSE ); } @@ -105,8 +106,10 @@ mixer::~mixer() delete m_audioDev; delete m_midiClient; - bufferAllocator::free( m_curBuf ); - bufferAllocator::free( m_nextBuf ); + for( Uint8 i = 0; i < 3; i++ ) + { + bufferAllocator::free( m_bufferPool[i] ); + } } @@ -146,6 +149,47 @@ bool mixer::criticalXRuns( void ) const +void mixer::setClipScaling( bool _state ) +{ + m_mixMutex.lock(); + + m_scaleClip = _state; + + if( _state ) + { + m_poolDepth = 3; + m_readBuffer = 0; + m_analBuffer = m_readBuffer + 1; + m_writeBuffer = m_poolDepth - 1; + + for( ch_cnt_t chnl=0; chnl < m_audioDev->channels(); ++chnl ) + { + m_clipped[chnl] = FALSE; + m_halfStart[chnl] = m_framesPerAudioBuffer; + m_maxClip[chnl] = 1.0f; + m_previousSample[chnl] = 0.0; + m_newBuffer[chnl] = FALSE; + } + for( Uint8 i = 0; i < 3; i++ ) + { + m_readBuf = m_bufferPool[i]; + clearAudioBuffer( m_readBuf, m_framesPerAudioBuffer ); + } + } + else + { + m_poolDepth = 2; + m_readBuffer = 0; + m_writeBuffer = 1; + m_analBuffer = 1; + } + + m_mixMutex.unlock(); +} + + + + const surroundSampleFrame * mixer::renderNextBuffer( void ) { microTimer timer; @@ -190,10 +234,21 @@ const surroundSampleFrame * mixer::renderNextBuffer( void ) // now swap the buffers... current buffer becomes next (last) // buffer and the next buffer becomes current (first) buffer - qSwap( m_curBuf, m_nextBuf ); - +// qSwap( m_curBuf, m_nextBuf ); + m_writeBuffer++; + m_writeBuffer %= m_poolDepth; + + m_readBuffer++; + m_readBuffer %= m_poolDepth; + + m_analBuffer++; + m_analBuffer %= m_poolDepth; + + m_writeBuf = m_bufferPool[m_writeBuffer]; + m_readBuf = m_bufferPool[m_readBuffer]; + // clear last audio-buffer - clearAudioBuffer( m_curBuf, m_framesPerAudioBuffer ); + clearAudioBuffer( m_writeBuf, m_framesPerAudioBuffer ); // if( criticalXRuns() == FALSE ) { @@ -223,19 +278,19 @@ const surroundSampleFrame * mixer::renderNextBuffer( void ) { if( ( *it )->m_bufferUsage != audioPort::NONE ) { - processBuffer( ( *it )->firstBuffer(), - ( *it )->nextFxChannel() ); + processBuffer( + ( *it )->firstBuffer(), + ( *it )->nextFxChannel() ); ( *it )->nextPeriod(); } } } - emit nextAudioBuffer( m_curBuf, m_framesPerAudioBuffer ); + emit nextAudioBuffer( m_readBuf, m_framesPerAudioBuffer ); m_mixMutex.unlock(); - // and trigger LFOs envelopeAndLFOWidget::triggerLFO( eng() ); @@ -244,7 +299,7 @@ const surroundSampleFrame * mixer::renderNextBuffer( void ) m_cpuLoad = tLimit( (int) ( new_cpu_load * 0.1f + m_cpuLoad * 0.9f ), 0, 100 ); - return( m_curBuf ); + return( m_readBuf ); } @@ -303,7 +358,7 @@ void FASTCALL mixer::bufferToPort( const sampleFrame * _buf, for( fpab_t frame = start_frame; frame < loop1_frame; ++frame ) { - for( ch_cnt_t chnl = 0; chnl < SURROUND_CHANNELS; ++chnl ) + for( ch_cnt_t chnl = 0; chnl < m_audioDev->channels(); ++chnl ) { _port->firstBuffer()[frame][chnl] += _buf[frame - start_frame][chnl % @@ -319,7 +374,7 @@ void FASTCALL mixer::bufferToPort( const sampleFrame * _buf, m_framesPerAudioBuffer ); for( fpab_t frame = 0; frame < end_frame; ++frame ) { - for( ch_cnt_t chnl = 0; chnl < SURROUND_CHANNELS; + for( ch_cnt_t chnl = 0; chnl < m_audioDev->channels(); ++chnl ) { _port->secondBuffer()[frame][chnl] += @@ -569,13 +624,93 @@ void mixer::processBuffer( const surroundSampleFrame * _buf, fx_ch_t/* _fx_chnl */ ) { // TODO: effect-implementation - for( fpab_t frame = 0; frame < m_framesPerAudioBuffer; ++frame ) + + if( m_scaleClip ) { - for( ch_cnt_t chnl = 0; chnl < SURROUND_CHANNELS; ++chnl ) + for( ch_cnt_t chnl=0; + chnl < m_audioDev->channels(); + ++chnl ) { - m_curBuf[frame][chnl] += _buf[frame][chnl]; + m_newBuffer[chnl] = TRUE; } } + + for( fpab_t frame = 0; frame < m_framesPerAudioBuffer; ++frame ) + { + for( ch_cnt_t chnl = 0; chnl < m_audioDev->channels(); ++chnl ) + { + m_writeBuf[frame][chnl] += _buf[frame][chnl]; + + if( m_scaleClip ) + { + scaleClip( frame, chnl ); + } + } + } +} + + + + +void FASTCALL mixer::scaleClip( fpab_t _frame, ch_cnt_t _chnl ) +{ + // Check for zero crossing + if( ( m_writeBuf[_frame][_chnl] >=0 && + m_previousSample[_chnl] < 0 ) || + ( m_writeBuf[_frame][_chnl] <=0 && + m_previousSample[_chnl] > 0 ) ) + { + // if a clip occurred between the zero + // crossings, scale the half-wave + if( m_clipped[_chnl] ) + { + if( m_newBuffer[_chnl] ) + { + for( fpab_t i = m_halfStart[_chnl]; + i < m_framesPerAudioBuffer; + i++ ) + { + m_bufferPool[m_analBuffer][i][_chnl] /= + m_maxClip[_chnl]; + } + + for( fpab_t i = 0; + i < _frame; + i++ ) + { + m_writeBuf[i][_chnl] /= + m_maxClip[_chnl]; + } + } + else + { + for( fpab_t i = m_halfStart[_chnl]; + i < _frame; + i++ ) + { + m_writeBuf[i][_chnl] /= m_maxClip[_chnl]; + } + } + } + m_halfStart[_chnl] = _frame; + m_clipped[_chnl] = FALSE; + m_newBuffer[_chnl] = FALSE; + m_maxClip[_chnl] = 1.0; + } + + // check for clip + if( fabs( m_writeBuf[_frame][_chnl] ) > 1.0f ) + { + m_clipped[_chnl] = TRUE; + if( fabs( m_writeBuf[_frame][_chnl] ) > + m_maxClip[_chnl] ) + { + m_maxClip[_chnl] = fabs( + m_writeBuf[_frame][_chnl] ); + } + } + + m_previousSample[_chnl] = m_writeBuf[_frame][_chnl]; } diff --git a/src/core/piano_roll.cpp b/src/core/piano_roll.cpp index 59ddacdce..bb6cd0f02 100644 --- a/src/core/piano_roll.cpp +++ b/src/core/piano_roll.cpp @@ -209,9 +209,10 @@ pianoRoll::pianoRoll( engine * _engine ) : m_toolBar->setFixedHeight( 32 ); m_toolBar->move( 0, 0 ); #ifdef QT4 + m_toolBar->setAutoFillBackground( TRUE ); QPalette pal; - pal.setBrush( m_toolBar->backgroundRole(), QBrush( - embed::getIconPixmap( "toolbar_bg" ) ) ); + pal.setBrush( m_toolBar->backgroundRole(), + embed::getIconPixmap( "toolbar_bg" ) ); m_toolBar->setPalette( pal ); #else m_toolBar->setPaletteBackgroundPixmap( embed::getIconPixmap( diff --git a/src/core/setup_dialog.cpp b/src/core/setup_dialog.cpp index 929291482..993ca97d1 100644 --- a/src/core/setup_dialog.cpp +++ b/src/core/setup_dialog.cpp @@ -111,6 +111,8 @@ setupDialog::setupDialog( engine * _engine, configTabs _tab_to_open ) : m_noWizard( configManager::inst()->value( "app", "nowizard" ).toInt() ), m_noMsgAfterSetup( configManager::inst()->value( "app", "nomsgaftersetup" ).toInt() ), + m_displaydBV( configManager::inst()->value( "app", + "displaydbv" ).toInt() ), m_workingDir( configManager::inst()->workingDir() ), m_vstDir( configManager::inst()->vstDir() ), m_artworkDir( configManager::inst()->artworkDir() ), @@ -187,7 +189,7 @@ setupDialog::setupDialog( engine * _engine, configTabs _tab_to_open ) : tabWidget * misc_tw = new tabWidget( tr( "MISC" ), general ); - misc_tw->setFixedHeight( 110 ); + misc_tw->setFixedHeight( 128 ); ledCheckBox * disable_tooltips = new ledCheckBox( tr( "Disable tooltips (no spurious " @@ -238,6 +240,14 @@ setupDialog::setupDialog( engine * _engine, configTabs _tab_to_open ) : this, SLOT( toggleNoMsgAfterSetup( bool ) ) ); + ledCheckBox * dbv = new ledCheckBox( + tr( "Display volume as dbV " ), + misc_tw, eng() ); + dbv->move( 10, 108 ); + dbv->setChecked( m_displaydBV ); + connect( dbv, SIGNAL( toggled( bool ) ), + this, SLOT( toggleDisplaydBV( bool ) ) ); + gen_layout->addWidget( bufsize_tw ); gen_layout->addSpacing( 10 ); gen_layout->addWidget( misc_tw ); @@ -635,6 +645,8 @@ void setupDialog::accept( void ) QString::number( m_noWizard ) ); configManager::inst()->setValue( "app", "nomsgaftersetup", QString::number( m_noMsgAfterSetup ) ); + configManager::inst()->setValue( "app", "displaydbv", + QString::number( m_displaydBV ) ); configManager::inst()->setValue( "ui", "disablechannelactivityindicators", QString::number( m_disableChActInd ) ); @@ -768,6 +780,14 @@ void setupDialog::toggleNoMsgAfterSetup( bool _enabled ) +void setupDialog::toggleDisplaydBV( bool _enabled ) +{ + m_displaydBV = _enabled; +} + + + + void setupDialog::toggleDisableChActInd( bool _disabled ) { m_disableChActInd = _disabled; diff --git a/src/core/song_editor.cpp b/src/core/song_editor.cpp index 7ee64af26..e7280b39b 100644 --- a/src/core/song_editor.cpp +++ b/src/core/song_editor.cpp @@ -190,6 +190,16 @@ songEditor::songEditor( engine * _engine ) : eng()->getMainWindow()->addWidgetToToolBar( hq_btn, 1, col ); + toolButton * cp_btn = new toolButton( embed::getIconPixmap( "auto_limit" ), + tr( "Auto limiter" ), + NULL, NULL, tb ); + cp_btn->setCheckable( TRUE ); + connect( cp_btn, SIGNAL( toggled( bool ) ), eng()->getMixer(), + SLOT( setClipScaling( bool ) ) ); + cp_btn->setFixedWidth( 30 ); + eng()->getMainWindow()->addWidgetToToolBar( cp_btn, 1, col + 1 ); + + eng()->getMainWindow()->addSpacingToToolBar( 10 ); @@ -286,9 +296,10 @@ songEditor::songEditor( engine * _engine ) : m_toolBar->setFixedHeight( 32 ); m_toolBar->move( 0, 0 ); #ifdef QT4 + m_toolBar->setAutoFillBackground( TRUE ); QPalette pal; - pal.setBrush( m_toolBar->backgroundRole(), QBrush( - embed::getIconPixmap( "toolbar_bg" ) ) ); + pal.setBrush( m_toolBar->backgroundRole(), + embed::getIconPixmap( "toolbar_bg" ) ); m_toolBar->setPalette( pal ); #else m_toolBar->setPaletteBackgroundPixmap( embed::getIconPixmap( @@ -1629,7 +1640,7 @@ void songEditor::importProject( void ) this, "", TRUE ); ofd.setWindowTitle( tr( "Import file" ) ); #endif - ofd.setDirectory( configManager::inst()->projectsDir() ); + ofd.setDirectory( configManager::inst()->userProjectsDir() ); ofd.setFileMode( QFileDialog::ExistingFiles ); if( ofd.exec () == QDialog::Accepted && !ofd.selectedFiles().isEmpty() ) { diff --git a/src/core/track.cpp b/src/core/track.cpp index 4e56ee51d..60a7bbdf5 100644 --- a/src/core/track.cpp +++ b/src/core/track.cpp @@ -576,6 +576,7 @@ trackContentWidget::trackContentWidget( trackWidget * _parent ) : m_trackWidget( _parent ) { #ifdef QT4 + setAutoFillBackground( TRUE ); QPalette pal; pal.setColor( backgroundRole(), QColor( 96, 96, 96 ) ); setPalette( pal ); @@ -1151,6 +1152,7 @@ trackWidget::trackWidget( track * _track, QWidget * _parent ) : m_action( NONE ) { #ifdef QT4 + m_trackOperationsWidget.setAutoFillBackground( TRUE ); QPalette pal; pal.setColor( m_trackOperationsWidget.backgroundRole(), QColor( 128, 128, 128 ) ); @@ -1163,6 +1165,7 @@ trackWidget::trackWidget( track * _track, QWidget * _parent ) : #ifdef QT4 + m_trackSettingsWidget.setAutoFillBackground( TRUE ); pal.setColor( m_trackSettingsWidget.backgroundRole(), QColor( 64, 64, 64 ) ); m_trackSettingsWidget.setPalette( pal ); diff --git a/src/lib/mmp.cpp b/src/lib/mmp.cpp index 1c4ba3753..1128f2068 100644 --- a/src/lib/mmp.cpp +++ b/src/lib/mmp.cpp @@ -186,11 +186,7 @@ multimediaProject::~multimediaProject() bool multimediaProject::writeFile( const QString & _fn, bool _overwrite_check ) { - QString xml = "\n" + toString( -#if QT_VERSION >= 0x030100 - 2 -#endif - ); + bool clean_meta_nodes = FALSE; QString fn = _fn; if( type() == INSTRUMENT_TRACK_SETTINGS ) { @@ -198,6 +194,7 @@ bool multimediaProject::writeFile( const QString & _fn, bool _overwrite_check ) { fn += ".cs.xml"; } + clean_meta_nodes = TRUE; } else if( type() == SONG_PROJECT ) { @@ -206,6 +203,7 @@ bool multimediaProject::writeFile( const QString & _fn, bool _overwrite_check ) { fn += ".mmp"; } + clean_meta_nodes = TRUE; } else if( type() == SONG_PROJECT_TEMPLATE ) { @@ -213,6 +211,12 @@ bool multimediaProject::writeFile( const QString & _fn, bool _overwrite_check ) { fn += ".mpt"; } + clean_meta_nodes = TRUE; + } + + if( clean_meta_nodes == TRUE ) + { + cleanMetaNodes( documentElement() ); } @@ -257,6 +261,11 @@ bool multimediaProject::writeFile( const QString & _fn, bool _overwrite_check ) ).arg( fn ) ); return( FALSE ); } + QString xml = "\n" + toString( +#if QT_VERSION >= 0x030100 + 2 +#endif + ); #ifdef QT4 outfile.write( xml.toAscii().constData(), xml.length() ); #else @@ -315,4 +324,31 @@ QString multimediaProject::typeName( projectTypes _project_type ) } + + +void multimediaProject::cleanMetaNodes( QDomElement _de ) +{ + QDomNode node = _de.firstChild(); + while( !node.isNull() ) + { + if( node.isElement() ) + { + if( node.toElement().attribute( "metadata" ).toInt() ) + { + QDomNode ns = node.nextSibling(); + _de.removeChild( node ); + node = ns; + continue; + } + if( node.hasChildNodes() ) + { + cleanMetaNodes( node.toElement() ); + } + } + node = node.nextSibling(); + } +} + + + #endif diff --git a/src/lib/sample_buffer.cpp b/src/lib/sample_buffer.cpp index 6c9082d44..c2b7f440e 100644 --- a/src/lib/sample_buffer.cpp +++ b/src/lib/sample_buffer.cpp @@ -250,7 +250,12 @@ void sampleBuffer::update( bool _keep_settings ) // name if( file[0] != '/' ) { - file = configManager::inst()->samplesDir() + file; + file = configManager::inst()->userSamplesDir() + file; + if( QFileInfo( file ).exists() == FALSE ) + { + file = + configManager::inst()->factorySamplesDir() + m_audioFile; + } } const char * f = #ifdef QT4 @@ -970,7 +975,12 @@ QString sampleBuffer::openAudioFile( void ) const QString f = m_audioFile; if( QFileInfo( f ).isRelative() ) { - f = configManager::inst()->samplesDir() + f; + f = configManager::inst()->userSamplesDir() + f; + if( QFileInfo( f ).exists() == FALSE ) + { + f = configManager::inst()->factorySamplesDir() + + m_audioFile; + } } #ifdef QT4 dir = QFileInfo( f ).absolutePath(); @@ -980,7 +990,7 @@ QString sampleBuffer::openAudioFile( void ) const } else { - dir = configManager::inst()->samplesDir(); + dir = configManager::inst()->userSamplesDir(); } // change dir to position of previously opened file ofd.setDirectory( dir ); @@ -1031,19 +1041,7 @@ QString sampleBuffer::openAudioFile( void ) const { return( "" ); } - QString sf = ofd.selectedFiles()[0]; - if( !QFileInfo( sf ).isRelative() ) - { -#if QT_VERSION >= 0x030100 - sf = sf.replace( configManager::inst()->samplesDir(), - "" ); -#else - sf = sf.replace( QRegExp( - configManager::inst()->samplesDir() ), - "" ); -#endif - } - return( sf ); + return( tryToMakeRelative( ofd.selectedFiles()[0] ) ); } return( "" ); @@ -1228,20 +1226,7 @@ sampleBuffer * sampleBuffer::resample( sampleFrame * _data, void sampleBuffer::setAudioFile( const QString & _audio_file ) { - m_audioFile = _audio_file; - // try to make path of audio-file relative if it's posated - // within LMMS-working-dir - if( !QFileInfo( m_audioFile ).isRelative() ) - { -#if QT_VERSION >= 0x030100 - m_audioFile = m_audioFile.replace( - configManager::inst()->samplesDir(), "" ); -#else - m_audioFile = m_audioFile.replace( - QRegExp( configManager::inst()->samplesDir() ), - "" ); -#endif - } + m_audioFile = tryToMakeRelative( _audio_file ); update(); } @@ -1470,6 +1455,28 @@ void sampleBuffer::deleteResamplingData( void * * _ptr ) } + + +QString sampleBuffer::tryToMakeRelative( const QString & _file ) +{ + if( QFileInfo( _file ).isRelative() == FALSE ) + { + QString fsd = configManager::inst()->factorySamplesDir(); + QString usd = configManager::inst()->userSamplesDir(); + if( _file.contains( fsd ) ) + { + return( QString( _file ).replace( fsd, "" ) ); + } + else if( _file.contains( usd ) ) + { + return( QString( _file ).replace( usd, "" ) ); + } + } + return( _file ); +} + + + #undef write #undef read #undef pos diff --git a/src/lmms_single_source.cpp b/src/lmms_single_source.cpp index d6da8a54e..20a5ddc41 100644 --- a/src/lmms_single_source.cpp +++ b/src/lmms_single_source.cpp @@ -85,4 +85,5 @@ #include "src/widgets/nstate_button.cpp" #include "src/widgets/lcd_spinbox.cpp" #include "src/widgets/automatable_button.cpp" +#include "src/widgets/volume_knob.cpp" #endif diff --git a/src/tracks/instrument_track.cpp b/src/tracks/instrument_track.cpp index 6fd3389fa..8a0fed3c5 100644 --- a/src/tracks/instrument_track.cpp +++ b/src/tracks/instrument_track.cpp @@ -73,7 +73,6 @@ #include "note_play_handle.h" #include "embed.h" #include "fade_button.h" -#include "knob.h" #include "lcd_spinbox.h" #include "led_checkbox.h" #include "piano_widget.h" @@ -85,6 +84,7 @@ #include "debug.h" #include "mmp.h" #include "string_pair_drag.h" +#include "volume_knob.h" const char * volume_help = QT_TRANSLATE_NOOP( "instrumentTrack", @@ -148,7 +148,7 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) : // creation of widgets for track-settings-widget - m_tswVolumeKnob = new knob( knobSmall_17, getTrackSettingsWidget(), + m_tswVolumeKnob = new volumeKnob( knobSmall_17, getTrackSettingsWidget(), tr( "Channel volume" ), eng() ); m_tswVolumeKnob->setRange( MIN_VOLUME, MAX_VOLUME, 1.0f ); m_tswVolumeKnob->setInitValue( DEFAULT_VOLUME ); @@ -219,7 +219,7 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) : // setup volume-knob - m_volumeKnob = new knob( knobBright_26, m_generalSettingsWidget, + m_volumeKnob = new volumeKnob( knobBright_26, m_generalSettingsWidget, tr( "Channel volume" ), eng() ); m_volumeKnob->move( 10, 44 ); m_volumeKnob->setRange( MIN_VOLUME, MAX_VOLUME, 1.0f ); @@ -235,7 +235,7 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) : tr( volume_help ) ); /* connect( m_volumeKnob, SIGNAL( valueChanged( float ) ), this, SLOT( volValueChanged( float ) ) );*/ - knob::linkObjects( m_tswVolumeKnob, m_volumeKnob ); + volumeKnob::linkObjects( m_tswVolumeKnob, m_volumeKnob ); // setup surround-area @@ -362,6 +362,10 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) : _tc->updateAfterTrackAdd(); +#ifndef QT3 + setFixedWidth( CHANNEL_WIDTH ); + resize( sizeHint() ); +#endif } @@ -393,7 +397,7 @@ void instrumentTrack::saveSettingsBtnClicked( void ) sfd.setFilter( tr( "Channel-Settings-File (*.cs.xml)" ) ); #endif - QString preset_root = configManager::inst()->presetsDir(); + QString preset_root = configManager::inst()->userPresetsDir(); if( !QDir( preset_root ).exists() ) { QDir().mkdir( preset_root ); diff --git a/src/tracks/sample_track.cpp b/src/tracks/sample_track.cpp index 35350e556..81f839a10 100644 --- a/src/tracks/sample_track.cpp +++ b/src/tracks/sample_track.cpp @@ -372,7 +372,7 @@ sampleTrack::sampleTrack( trackContainer * _tc ) : m_trackLabel->setGeometry( 26, 1, DEFAULT_SETTINGS_WIDGET_WIDTH-2, 29 ); m_trackLabel->show(); - m_volumeKnob = new knob( knobSmall_17, getTrackSettingsWidget(), + m_volumeKnob = new volumeKnob( knobSmall_17, getTrackSettingsWidget(), tr( "Channel volume" ), eng() ); m_volumeKnob->setRange( MIN_VOLUME, MAX_VOLUME, 1.0f ); m_volumeKnob->setInitValue( DEFAULT_VOLUME ); diff --git a/src/widgets/fade_button.cpp b/src/widgets/fade_button.cpp index 54b77c3b0..75fa9bb89 100644 --- a/src/widgets/fade_button.cpp +++ b/src/widgets/fade_button.cpp @@ -116,7 +116,11 @@ void fadeButton::paintEvent( QPaintEvent * _pe ) QPainter p( &draw_pm, this ); #endif p.setPen( QColor( 0, 0, 0 ) ); +#ifndef QT3 p.drawRect( 0, 0, rect().right(), rect().bottom() ); +#else + p.drawRect( rect() ); +#endif #ifndef QT4 // and blit all the drawn stuff on the screen... bitBlt( this, rect().topLeft(), &draw_pm ); diff --git a/src/widgets/group_box.cpp b/src/widgets/group_box.cpp index 0d8025ac0..7a9dcdacf 100644 --- a/src/widgets/group_box.cpp +++ b/src/widgets/group_box.cpp @@ -65,6 +65,10 @@ groupBox::groupBox( const QString & _caption, QWidget * _parent, m_origHeight( height() ), m_animating( FALSE ) { +#ifndef QT3 + setAutoFillBackground( TRUE ); +#endif + if( s_ledBg == NULL ) { s_ledBg = new QPixmap( embed::getIconPixmap( @@ -193,9 +197,11 @@ void groupBox::animate( void ) void groupBox::updatePixmap( void ) { #ifndef QT3 + const int c = 0; QColor bg_color = QApplication::palette().color( QPalette::Active, QPalette::Background ); #else + const int c = 1; QColor bg_color = QApplication::palette().active().background(); #endif QPixmap pm( size() ); @@ -205,7 +211,7 @@ void groupBox::updatePixmap( void ) // outer rect p.setPen( bg_color.dark( 200 ) ); - p.drawRect( 0, 0, width(), height() ); + p.drawRect( 0, 0, width() - 1 + c, height() - 1 + c ); // brighter line at bottom/right p.setPen( bg_color.light( 125 ) ); @@ -223,7 +229,7 @@ void groupBox::updatePixmap( void ) p.drawLine( 2 + s_ledBg->width(), 11, width() - 3, 11 ); // black inner rect - p.drawRect( 1, 1, width() - 2, height() - 2 ); + p.drawRect( 1, 1, width() - 3 + c, height() - 3 + c ); //p.setPen( QColor( 255, 255, 255 ) ); @@ -238,7 +244,6 @@ void groupBox::updatePixmap( void ) #ifdef QT4 QPalette pal = palette(); pal.setBrush( backgroundRole(), QBrush( pm ) ); -/* pal.setColor( QPalette::Background, QColor( 96, 96, 96 ) );*/ setPalette( pal ); #else setPaletteBackgroundColor( bg_color.dark( 132 ) ); diff --git a/src/widgets/lcd_spinbox.cpp b/src/widgets/lcd_spinbox.cpp index 6de1ef96a..4d94e5780 100644 --- a/src/widgets/lcd_spinbox.cpp +++ b/src/widgets/lcd_spinbox.cpp @@ -59,6 +59,15 @@ lcdSpinBox::lcdSpinBox( int _min, int _max, int _num_digits, m_number->setFrameShape( QFrame::Panel ); m_number->setFrameShadow( QFrame::Sunken ); m_number->setSegmentStyle( QLCDNumber::Flat ); +#ifndef QT3 + QPalette pal; + pal.setColor( QPalette::Light, Qt::gray ); + pal.setColor( QPalette::Mid, Qt::darkGray ); + pal.setColor( QPalette::Dark, Qt::black ); + pal.setColor( m_number->backgroundRole(), Qt::black ); + m_number->setPalette( pal ); + m_number->setAutoFillBackground( TRUE ); +#endif setEnabled( TRUE ); // value is automatically limited to given range diff --git a/src/widgets/project_notes.cpp b/src/widgets/project_notes.cpp index e2a76523d..0d09b3a71 100644 --- a/src/widgets/project_notes.cpp +++ b/src/widgets/project_notes.cpp @@ -87,6 +87,7 @@ projectNotes::projectNotes( engine * _engine) : m_edit = new QTextEdit( this ); #ifdef QT4 + m_edit->setAutoFillBackground( TRUE ); QPalette pal; pal.setColor( m_edit->backgroundRole(), QColor( 64, 64, 64 ) ); m_edit->setPalette( pal ); diff --git a/src/widgets/tab_widget.cpp b/src/widgets/tab_widget.cpp index a0decade9..19b827bbd 100644 --- a/src/widgets/tab_widget.cpp +++ b/src/widgets/tab_widget.cpp @@ -63,6 +63,7 @@ tabWidget::tabWidget( const QString & _caption, QWidget * _parent ) : setBackgroundMode( Qt::NoBackground ); #endif*/ #ifndef QT3 + setAutoFillBackground( TRUE ); QColor bg_color = QApplication::palette().color( QPalette::Active, QPalette::Background ). dark( 132 ); @@ -98,7 +99,7 @@ void tabWidget::addTab( QWidget * _w, const QString & _name, int _idx ) m_widgets[_idx] = d; _w->setFixedSize( width() - 4, height() - 14 ); _w->move( 2, 12 ); - _w->show(); + _w->hide(); if( m_widgets.contains( m_activeTab ) ) { @@ -171,24 +172,27 @@ void tabWidget::paintEvent( QPaintEvent * _pe ) { #ifdef QT4 QPainter p( this ); + p.fillRect( 0, 0, width() - 1, height() - 1, QColor( 96, 96, 96 ) ); + const int c = 0; #else QPixmap pm( size() ); pm.fill( QColor( 96, 96, 96 ) ); QPainter p( &pm ); + const int c = 1; #endif bool big_tab_captions = ( m_caption == "" ); int add = big_tab_captions ? 1 : 0; p.setPen( QColor( 64, 64, 64 ) ); - p.drawRect( 0, 0, width(), height() ); + p.drawRect( 0, 0, width() - 1 + c, height() - 1 + c ); p.setPen( QColor( 160, 160, 160 ) ); p.drawLine( width() - 1, 0, width() - 1, height() - 1 ); p.drawLine( 0, height() - 1, width() - 1, height() - 1 ); p.setPen( QColor( 0, 0, 0 ) ); - p.drawRect( 1, 1, width() - 2, height() - 2 ); + p.drawRect( 1, 1, width() - 3 + c, height() - 3 + c ); p.fillRect( 2, 2, width() - 4, 9 + add, QColor( 30, 45, 60 ) ); p.drawLine( 2, 11 + add, width() - 3, 11 + add ); diff --git a/src/widgets/text_float.cpp b/src/widgets/text_float.cpp index b944b37d2..291c7d842 100644 --- a/src/widgets/text_float.cpp +++ b/src/widgets/text_float.cpp @@ -45,6 +45,7 @@ #include "text_float.h" #include "gui_templates.h" +#include "main_window.h" @@ -153,6 +154,16 @@ textFloat * textFloat::displayMessage( const QString & _msg, int _timeout, { #ifdef QT4 QWidget * mw = QApplication::activeWindow(); + if( mw == NULL ) + { + foreach( QWidget * w, QApplication::topLevelWidgets() ) + { + if( mw == NULL || dynamic_cast( w ) ) + { + mw = w; + } + } + } #else QWidget * mw = qApp->mainWidget(); if( mw == NULL ) @@ -215,7 +226,11 @@ void textFloat::paintEvent( QPaintEvent * _pe ) p.setFont( pointSize<8>( p.font() ) ); +#ifndef QT3 + p.drawRect( 0, 0, rect().right(), rect().bottom() ); +#else p.drawRect( rect() ); +#endif // p.setPen( Qt::black ); // small message? diff --git a/src/widgets/tool_button.cpp b/src/widgets/tool_button.cpp index e3247b2f5..f138c4851 100644 --- a/src/widgets/tool_button.cpp +++ b/src/widgets/tool_button.cpp @@ -42,6 +42,9 @@ toolButton::toolButton( const QPixmap & _pixmap, const QString & _tooltip, m_colorStandard( s_stdColor ), m_colorHighlighted( s_hlColor ) { +#ifndef QT3 + setAutoFillBackground( TRUE ); +#endif if( _receiver != NULL && _slot != NULL ) { connect( this, SIGNAL( clicked() ), _receiver, _slot ); diff --git a/src/widgets/volume_knob.cpp b/src/widgets/volume_knob.cpp new file mode 100644 index 000000000..589993674 --- /dev/null +++ b/src/widgets/volume_knob.cpp @@ -0,0 +1,229 @@ +#ifndef SINGLE_SOURCE_COMPILE + +/* + * volume_knob.cpp - defines a knob that display it's value as either a + * percentage or in dbV. + * + * Copyright (c) 2006 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include + +#include "volume_knob.h" + + +volumeKnob::volumeKnob( int _knob_num, QWidget * _parent, const QString & _name, + engine * _engine ): + knob( _knob_num, _parent, _name, _engine ) +{ +} + + + + +volumeKnob::~volumeKnob() +{ +} + + + + +//! Mouse press event handler +void volumeKnob::mousePressEvent( QMouseEvent * _me ) +{ + if( _me->button() == Qt::LeftButton && + eng()->getMainWindow()->isCtrlPressed() == FALSE ) + { + setJournalling( FALSE ); + m_oldValue = value(); + + const QPoint & p = _me->pos(); + m_origMousePos = p; + + if( configManager::inst()->value( "knobs", + "classicalusability").toInt() ) + { + m_mouseOffset = getValue( p ) - value(); + } + emit sliderPressed(); + + if( !configManager::inst()->value( "knobs", "classicalusability" + ).toInt() ) + { + QApplication::setOverrideCursor( Qt::BlankCursor ); + } + s_textFloat->reparent( this ); + + QString val; + if( configManager::inst()->value( "app", "displaydbv" ).toInt() ) + { + val = QString( " %1 dBV" ).arg( + 20.0 * log10( value() / 100.0 ), + 3, 'f', 2 ); + } + else + { + val = QString( " %1%" ).arg( value(), 3, 'f', 0 ); + } + s_textFloat->setText( m_hintTextBeforeValue + val ); + + s_textFloat->move( mapTo( topLevelWidget(), QPoint( 0, 0 ) ) + + QPoint( m_knobPixmap->width() + 2, 0 ) ); + s_textFloat->show(); + m_buttonPressed = TRUE; + } + else if( _me->button() == Qt::LeftButton && + eng()->getMainWindow()->isCtrlPressed() == TRUE ) + { + new stringPairDrag( "float_value", QString::number( value() ), + QPixmap(), this, eng() ); + } + else if( _me->button() == Qt::MidButton ) + { + reset(); + } +} + + + + +//! Mouse Move Event handler +void volumeKnob::mouseMoveEvent( QMouseEvent * _me ) +{ + if( m_buttonPressed == TRUE ) + { + setPosition( _me->pos() ); + emit sliderMoved( value() ); + if( !configManager::inst()->value( "knobs", + "classicalusability").toInt() ) + { + QCursor::setPos( mapToGlobal( m_origMousePos ) ); + } + } + + QString val; + if( configManager::inst()->value( "app", "displaydbv" ).toInt() ) + { + val = QString( " %1 dBV" ).arg( + 20.0 * log10( value() / 100.0 ), + 3, 'f', 2 ); + } + else + { + val = QString( " %1%" ).arg( value(), 3, 'f', 0 ); + } + s_textFloat->setText( m_hintTextBeforeValue + val ); +} + + + + +void volumeKnob::wheelEvent( QWheelEvent * _we ) +{ + _we->accept(); + const int inc = ( _we->delta() > 0 ) ? 1 : -1; + incValue( inc ); + + + s_textFloat->reparent( this ); + + QString val; + if( configManager::inst()->value( "app", "displaydbv" ).toInt() ) + { + val = QString( " %1 dBV" ).arg( + 20.0 * log10( value() / 100.0 ), + 3, 'f', 2 ); + } + else + { + val = QString( " %1%" ).arg( value(), 3, 'f', 0 ); + } + s_textFloat->setText( m_hintTextBeforeValue + val ); + + s_textFloat->move( mapTo( topLevelWidget(), QPoint( 0, 0 ) ) + + QPoint( m_knobPixmap->width() + 2, 0 ) ); + s_textFloat->setVisibilityTimeOut( 1000 ); + + emit sliderMoved( value() ); +} + + + + +void volumeKnob::enterValue( void ) +{ + bool ok; + float new_val; + if( configManager::inst()->value( "app", "displaydbv" ).toInt() ) + { + new_val = QInputDialog::getDouble( +#ifdef QT4 + this, +#endif + accessibleName(), + tr( "Please enter a new value between " + "-96.0 dbV and 6.0 dbV:" ), + 20.0 * log10( value() / 100.0 ), + -96.0, 6.0, + 4, &ok +#ifndef QT4 + , this +#endif + ); + if( new_val <= -96.0 ) + { + new_val = 0.0f; + } + else + { + new_val = pow( 10.0, ( new_val / 20.0 ) ) * 100.0; + } + } + else + { + new_val = QInputDialog::getDouble( +#ifdef QT4 + this, +#endif + accessibleName(), + tr( "Please enter a new value between " + "%1 and %2:" ).arg( + minValue() ).arg( maxValue() ), + value(), minValue(), maxValue(), + 4, &ok +#ifndef QT4 + , this +#endif + ); + } + + if( ok ) + { + setValue( new_val ); + } +} + + + + +#include "volume_knob.moc" + +#endif