Compare commits

..

10 Commits

Author SHA1 Message Date
Michele Calgaro 38dcd28582
Use centralized cmake version
Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
(cherry picked from commit e097d43a06)
1 year ago
Michele Calgaro 81d30b1142
Replace Qt with TQt
Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
(cherry picked from commit 00a73f1dea)
1 year ago
Michele Calgaro b023e03979
Use new TQ_METHOD, TQ_SIGNAL, TQ_SLOT defines
Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
(cherry picked from commit 1ca6231ff7)
2 years ago
Slávek Banko 7c2b90bd69
Raise the minimum required version of CMake to 3.5.
Signed-off-by: Slávek Banko <slavek.banko@axis.cz>
(cherry picked from commit 6208d03e3d)
2 years ago
TDE Gitea bf236a314c Update translation template. 2 years ago
Michele Calgaro 58bbed0510
xine engine: make volume control logarithmic for versions of xine < 1.2.13. For xine versions >= 1.2.13, libxine already makes the volume logarithmic. This relates to TDE/tdemultimedia#40.
Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
(cherry picked from commit b5977d5e67)
2 years ago
TDE Gitea 79a8d17988 Update translation template. 2 years ago
Michele Calgaro d1d095a264
Fix volume slider functionality and visualization
Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
(cherry picked from commit 1884d0e5a2)
2 years ago
Michele Calgaro decb99db2f
Replace Q_OBJECT with TQ_OBJECT
Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
(cherry picked from commit ea718087e4)
2 years ago
TDE Gitea 177cdfdd58 Merge translation files from master branch. 2 years ago

@ -1,7 +1,7 @@
#define VERSION "@VERSION@" #define VERSION "@VERSION@"
// Defined if you have fvisibility and fvisibility-inlines-hidden support. // Defined if you have fvisibility and fvisibility-inlines-hidden support.
#cmakedefine __TDE_HAVE_GCC_VISIBILITY 1 #cmakedefine __KDE_HAVE_GCC_VISIBILITY 1
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
significant byte first (like Motorola and SPARC, unlike Intel). */ significant byte first (like Motorola and SPARC, unlike Intel). */

@ -348,7 +348,7 @@ distribution. -->
<title>Credits and License</title> <title>Credits and License</title>
<sect1 id="tdeApp"> <sect1 id="kapp">
<title>&codeine;</title> <title>&codeine;</title>
<para>Program copyright 2004 Max B. Howell <email>max.howell@methylblue.com</email></para> <para>Program copyright 2004 Max B. Howell <email>max.howell@methylblue.com</email></para>

@ -1,5 +1,5 @@
<!DOCTYPE kpartgui> <!DOCTYPE kpartgui>
<kpartgui name="codeine" version="5"> <kpartgui name="codeine" version="4">
<MenuBar> <MenuBar>
<Menu name="file" noMerge="1"><text>&amp;Play</text> <Menu name="file" noMerge="1"><text>&amp;Play</text>
<Action name="play_media"/> <Action name="play_media"/>
@ -10,12 +10,9 @@
<Action name="file_quit"/> <Action name="file_quit"/>
</Menu> </Menu>
<Menu name="settings" noMerge="1"><text>&amp;Settings</text> <Menu name="settings" noMerge="1"><text>&amp;Settings</text>
<Action name="aspect_ratio_select"/> <Separator/><!-- this seperator doesn't show :( -->
<Action name="audio_channels_select"/>
<Action name="subtitle_channels_select"/>
<Separator/>
<Action name="fullscreen"/> <Action name="fullscreen"/>
<Separator/> <Separator/><!-- this seperator doesn't show :( -->
<Action name="options_configure_keybinding"/> <Action name="options_configure_keybinding"/>
<Action name="options_configure_toolbars"/> <Action name="options_configure_toolbars"/>
<Separator/> <Separator/>

@ -35,7 +35,6 @@ tde_add_executable( ${PROJECT_NAME} AUTOMOC
playDialog.cpp playDialog.cpp
listView.cpp listView.cpp
adjustSizeButton.cpp adjustSizeButton.cpp
audioView.cpp
fullScreenAction.cpp fullScreenAction.cpp
insertAspectRatioMenuItems.cpp insertAspectRatioMenuItems.cpp
playlistFile.cpp playlistFile.cpp

@ -48,7 +48,7 @@ namespace Codeine
m_thingy->setPaletteForegroundColor( paletteBackgroundColor().dark() ); m_thingy->setPaletteForegroundColor( paletteBackgroundColor().dark() );
TQEvent e( TQEvent::Resize ); TQEvent e( TQEvent::Resize );
eventFilter( nullptr, &e ); eventFilter( 0, &e );
adjustSize(); adjustSize();
show(); show();

@ -4,107 +4,18 @@
#include "analyzer.h" #include "analyzer.h"
#include "../codeine.h" #include "../codeine.h"
#include "../debug.h" #include "../debug.h"
#include <cmath> //interpolate() #include <math.h> //interpolate()
#include <tdeglobalsettings.h>
#include <tqevent.h> //event() #include <tqevent.h> //event()
#include "xineEngine.h" #include "xineEngine.h"
#include "fht.cpp" #include "fht.cpp"
template<class W> template<class W>
Analyzer::Base<W>::Base( TQWidget *parent, uint timeout, uint scopeSize ) Analyzer::Base<W>::Base( TQWidget *parent, uint timeout )
: W( parent, "Analyzer" ) : W( parent, "Analyzer" )
, m_timeout( timeout ) , m_timeout( timeout )
, m_fht(new FHT(scopeSize))
{} {}
template<class W> void
Analyzer::Base<W>::transform(Scope &scope) //virtual
{
// This is a standard transformation that should give
// an FFT scope that has bands for pretty analyzers
// NOTE: resizing here is redundant as FHT routines only calculate FHT::size() values
// scope.resize( m_fht->size() );
float *front = &scope.front();
auto *f = new float[m_fht->size()];
m_fht->copy(&f[0], front);
m_fht->logSpectrum(front, &f[0]);
m_fht->scale(front, 1.0 / 20);
scope.resize(m_fht->size() / 2); //second half of values are rubbish
delete[] f;
}
template<class W>
void Analyzer::Base<W>::drawFrame()
{
switch(Codeine::engine()->state())
{
case Engine::Playing:
{
const Engine::Scope &theScope = Codeine::engine()->scope();
static Scope scope(512);
int i = 0;
// Convert to mono.
// The Analyzer requires mono, but xine reports interleaved PCM.
for (int x = 0; x < m_fht->size(); ++x)
{
// Average between the channels.
scope[x] = static_cast<double>(theScope[i] + theScope[i + 1]) / (2 * (1 << 15));
i += 2;
}
transform(scope);
analyze(scope);
scope.resize(m_fht->size());
break;
}
case Engine::Paused:
{
break;
}
default:
{
demo();
break;
}
}
}
template <class W>
void Analyzer::Base<W>::demo()
{
static int t = 201; //FIXME make static to namespace perhaps
if (t > 999)
{
// 0 = wasted calculations
t = 1;
}
if (t < 201)
{
Scope s(32);
const auto dt = static_cast<double>(t) / 200.0;
for (unsigned i = 0; i < s.size(); ++i)
{
s[i] = dt * (sin(M_PI + (i * M_PI) / s.size()) + 1.0);
}
analyze(s);
}
else
{
analyze(Scope(32, 0));
}
++t;
}
template<class W> bool template<class W> bool
Analyzer::Base<W>::event( TQEvent *e ) Analyzer::Base<W>::event( TQEvent *e )
{ {
@ -125,521 +36,98 @@ Analyzer::Base<W>::event( TQEvent *e )
} }
Analyzer::Base2D::Base2D( TQWidget *parent, uint timeout, uint scopeSize ) Analyzer::Base2D::Base2D( TQWidget *parent, uint timeout )
: Base<TQWidget>( parent, timeout, scopeSize ) : Base<TQWidget>( parent, timeout )
{ {
setWFlags( TQt::WNoAutoErase ); //no flicker setWFlags( TQt::WNoAutoErase ); //no flicker
connect( &m_timer, TQ_SIGNAL(timeout()), TQ_SLOT(draw()) ); connect( &m_timer, TQ_SIGNAL(timeout()), TQ_SLOT(draw()) );
} }
void void
Analyzer::Base2D::resizeEvent( TQResizeEvent *e) Analyzer::Base2D::draw()
{
m_background.resize(size());
m_canvas.resize(size());
m_background.fill(backgroundColor());
eraseCanvas();
TQWidget::resizeEvent(e);
}
void Analyzer::Base2D::paletteChange(const TQPalette&)
{
m_background.fill(backgroundColor());
eraseCanvas();
}
// Author: Max Howell <max.howell@methylblue.com>, (C) 2003
// Copyright: See COPYING file that comes with this distribution
#include <tqpainter.h>
Analyzer::Block::Block( TQWidget *parent )
: Analyzer::Base2D(parent, 20, 9)
, m_scope(MIN_COLUMNS)
, m_barPixmap(1, 1)
, m_topBarPixmap(WIDTH, HEIGHT)
, m_store(1 << 8, 0)
, m_fadeBars(FADE_SIZE)
, m_fadeIntensity(1 << 8, 32)
, m_fadePos(1 << 8, 50)
, m_columns(0)
, m_rows(0)
, m_y(0)
, m_step(0)
{ {
// -1 is padding, no drawing takes place there switch( Codeine::engine()->state() ) {
setMinimumSize(MIN_COLUMNS * (WIDTH + 1) - 1, MIN_ROWS * (HEIGHT + 1) - 1); case Engine::Playing:
setMaximumWidth(MAX_COLUMNS * (WIDTH + 1) - 1);
for (auto &m_fadeBar : m_fadeBars)
{ {
m_fadeBar.resize(1, 1); const Engine::Scope &thescope = Codeine::engine()->scope();
} static Analyzer::Scope scope( Analyzer::SCOPE_SIZE );
}
void
Analyzer::Block::transform( Analyzer::Scope &s ) //pure virtual
{
for( uint x = 0; x < s.size(); ++x )
s[x] *= 2;
float *front = static_cast<float*>( &s.front() );
m_fht->spectrum( front ); for( int x = 0; x < Analyzer::SCOPE_SIZE; ++x )
m_fht->scale( front, 1.0 / 20 ); scope[x] = double(thescope[x]) / (1<<15);
//the second half is pretty dull, so only show it if the user has a large analyzer transform( scope );
//by setting to m_scope.size() if large we prevent interpolation of large analyzers, this is good! analyze( scope );
s.resize( m_scope.size() <= MAX_COLUMNS/2 ? MAX_COLUMNS/2 : m_scope.size() );
}
scope.resize( Analyzer::SCOPE_SIZE );
void bitBlt( this, 0, 0, canvas() );
Analyzer::Block::analyze( const Analyzer::Scope &s ) break;
{
// y = 2 3 2 1 0 2
// . . . . # .
// . . . # # .
// # . # # # #
// # # # # # #
//
// visual aid for how this analyzer works.
// y represents the number of blanks
// y starts from the top and increases in units of blocks
// m_yscale looks similar to: { 0.7, 0.5, 0.25, 0.15, 0.1, 0 }
// if it contains 6 elements there are 5 rows in the analyzer
interpolate(s, m_scope);
// Paint the background
bitBlt(canvas(), 0, 0, background());
unsigned y;
for (unsigned x = 0; x < m_scope.size(); ++x)
{
if (m_yScale.empty())
{
return;
}
// determine y
for (y = 0; m_scope[x] < m_yScale[y]; ++y)
;
// this is opposite to what you'd think, higher than y
// means the bar is lower than y (physically)
if (static_cast<float>(y) > m_store[x])
{
y = static_cast<int>(m_store[x] += m_step);
}
else
{
m_store[x] = y;
}
// if y is lower than m_fade_pos, then the bar has exceeded the height of the fadeout
// if the fadeout is quite faded now, then display the new one
if (y <= m_fadePos[x] /*|| m_fadeIntensity[x] < FADE_SIZE / 3*/ )
{
m_fadePos[x] = y;
m_fadeIntensity[x] = FADE_SIZE;
}
if (m_fadeIntensity[x] > 0)
{
const unsigned offset = --m_fadeIntensity[x];
const unsigned y = m_y + (m_fadePos[x] * (HEIGHT + 1));
bitBlt(canvas(), x * (WIDTH + 1), y, &m_fadeBars[offset], 0, 0, WIDTH, height() - y );
}
if (m_fadeIntensity[x] == 0)
{
m_fadePos[x] = m_rows;
}
// REMEMBER: y is a number from 0 to m_rows, 0 means all blocks are glowing, m_rows means none are
bitBlt(canvas(), x * (WIDTH + 1), y * (HEIGHT + 1) + m_y, bar(), 0, y * (HEIGHT + 1));
} }
case Engine::Paused:
break;
for (unsigned x = 0; x < m_store.size(); ++x) default:
{ erase();
bitBlt(canvas(), x * (WIDTH + 1), int(m_store[x]) * (HEIGHT + 1) + m_y, &m_topBarPixmap);
} }
} }
void
static void adjustToLimits(const int &b, int &f, unsigned &amount) Analyzer::Base2D::resizeEvent( TQResizeEvent* )
{ {
// with a range of 0-255 and maximum adjustment of amount, m_canvas.resize( size() );
// maximise the difference between f and b m_canvas.fill( colorGroup().background() );
if (b < f)
{
if (b > 255 - f)
{
amount -= f;
f = 0;
}
else
{
amount -= (255 - f);
f = 255;
}
}
else
{
if (f > 255 - b)
{
amount -= f;
f = 0;
}
else
{
amount -= (255 - f);
f = 255;
}
}
} }
/**
* Clever contrast function
*
* It will try to adjust the foreground color such that it contrasts well with the background
* It won't modify the hue of fg unless absolutely necessary
* @return the adjusted form of fg
*/
TQColor ensureContrast(const TQColor &bg, const TQColor &fg, unsigned _amount = 150)
{
class OutputOnExit
{
public:
explicit OutputOnExit(const TQColor &color)
: c(color)
{
}
~OutputOnExit()
{
int h, s, v;
c.getHsv(&h, &s, &v);
}
private:
const TQColor &c;
};
// hack so I don't have to cast everywhere
#define amount static_cast<int>(_amount)
// #define STAMP debug() << (TQValueList<int>() << fh << fs << fv) << endl;
// #define STAMP1( string ) debug() << string << ": " << (TQValueList<int>() << fh << fs << fv) << endl;
// #define STAMP2( string, value ) debug() << string << "=" << value << ": " << (TQValueList<int>() << fh << fs << fv) << endl;
OutputOnExit allocateOnTheStack(fg);
int bh, bs, bv;
int fh, fs, fv;
bg.getHsv(&bh, &bs, &bv);
fg.getHsv(&fh, &fs, &fv);
int dv = abs(bv - fv);
// STAMP2( "DV", dv );
// value is the best measure of contrast
// if there is enough difference in value already, return fg unchanged
if (dv > amount)
{
return fg;
}
int ds = abs(bs - fs);
// STAMP2( "DS", ds );
// saturation is good enough too. But not as good. TODO adapt this a little
if (ds > amount)
{
return fg;
}
int dh = abs(bh - fh); // Author: Max Howell <max.howell@methylblue.com>, (C) 2003
// Copyright: See COPYING file that comes with this distribution
// STAMP2( "DH", dh );
if (dh > 120)
{
// a third of the colour wheel automatically guarantees contrast
// but only if the values are high enough and saturations significant enough
// to allow the colours to be visible and not be shades of grey or black
// check the saturation for the two colours is sufficient that hue alone can
// provide sufficient contrast
if (ds > amount / 2 && (bs > 125 && fs > 125))
{
// STAMP1( "Sufficient saturation difference, and hues are complimentary" );
return fg;
}
if (dv > amount / 2 && (bv > 125 && fv > 125))
{
// STAMP1( "Sufficient value difference, and hues are complimentary" );
return fg;
}
// STAMP1( "Hues are complimentary but we must modify the value or saturation of the contrasting colour" );
// but either the colours are two desaturated, or too dark
// so we need to adjust the system, although not as much
///_amount /= 2;
}
if (fs < 50 && ds < 40)
{
// low saturation on a low saturation is sad
const int tmp = 50 - fs;
fs = 50;
if (amount > tmp)
{
_amount -= tmp;
}
else
{
_amount = 0;
}
}
// test that there is available value to honor our contrast requirement
if (255 - dv < amount)
{
// we have to modify the value and saturation of fg
//adjustToLimits( bv, fv, amount );
// STAMP
// see if we need to adjust the saturation
if (amount > 0)
{
adjustToLimits(bs, fs, _amount);
}
// STAMP
// see if we need to adjust the hue
if (amount > 0)
{
fh += amount; // cycles around
}
// STAMP
return TQColor(fh, fs, fv, TQColor::Hsv);
}
// STAMP
if (fv > bv && bv > amount)
{
return TQColor( fh, fs, bv - amount, TQColor::Hsv);
}
// STAMP
if (fv < bv && fv > amount)
{
return TQColor(fh, fs, fv - amount, TQColor::Hsv);
}
// STAMP
if (fv > bv && (255 - fv > amount))
{
return TQColor(fh, fs, fv + amount, TQColor::Hsv);
}
// STAMP
if (fv < bv && (255 - bv > amount))
{
return TQColor(fh, fs, bv + amount, TQColor::Hsv);
}
// STAMP
// debug() << "Something went wrong!\n";
return TQt::blue;
#undef amount #include <tqpainter.h>
// #undef STAMP
}
void Analyzer::Block::paletteChange(const TQPalette&) Analyzer::Block::Block( TQWidget *parent )
: Analyzer::Base2D( parent, 20 )
{ {
const TQColor bg = palette().active().background(); setMinimumWidth( 64 ); //-1 is padding, no drawing takes place there
const TQColor fg = ensureContrast(bg, TDEGlobalSettings::activeTitleColor()); setMaximumWidth( 128 );
m_topBarPixmap.fill(fg);
const double dr = 15 * double(bg.red() - fg.red()) / (m_rows * 16);
const double dg = 15 * double(bg.green() - fg.green()) / (m_rows * 16);
const double db = 15 * double(bg.blue() - fg.blue()) / (m_rows * 16);
const int r = fg.red(), g = fg.green(), b = fg.blue();
bar()->fill(bg);
TQPainter p(bar()); //TODO yes, do height for width
for (int y = 0; (uint)y < m_rows; ++y)
{
// graduate the fg color
p.fillRect(0, y * (HEIGHT + 1), WIDTH, HEIGHT, TQColor(r + int(dr * y), g + int(dg * y), b + int(db * y)));
}
{
const TQColor bg = palette().active().background().dark(112);
// make a complimentary fadebar colour
// TODO dark is not always correct, dumbo!
int h, s, v;
palette().active().background().dark(150).getHsv(&h, &s, &v);
const TQColor fg(h + 120, s, v, TQColor::Hsv);
const double dr = fg.red() - bg.red();
const double dg = fg.green() - bg.green();
const double db = fg.blue() - bg.blue();
const int r = bg.red(), g = bg.green(), b = bg.blue();
// Precalculate all fade-bar pixmaps
for (int y = 0; y < FADE_SIZE; ++y)
{
m_fadeBars[y].fill(palette().active().background());
TQPainter f(&m_fadeBars[y]);
for (int z = 0; (uint)z < m_rows; ++z)
{
const double Y = 1.0 - (log10(static_cast<float>(FADE_SIZE) - y) / log10(static_cast<float>(FADE_SIZE)));
f.fillRect(0, z * (HEIGHT + 1), WIDTH, HEIGHT, TQColor(r + int(dr * Y), g + int(dg * Y), b + int(db * Y)));
}
}
}
drawBackground();
} }
void
void Analyzer::Block::resizeEvent(TQResizeEvent *e) Analyzer::Block::transform( Analyzer::Scope &scope ) //pure virtual
{ {
TQWidget::resizeEvent(e); static FHT fht( Analyzer::SCOPE_SIZE_EXP );
canvas()->resize(size());
background()->resize(size());
const uint oldRows = m_rows;
// all is explained in analyze().. for( uint x = 0; x < scope.size(); ++x )
// +1 to counter -1 in maxSizes, trust me we need this! scope[x] *= 2;
m_columns = kMax(uint(double(width() + 1) / (WIDTH + 1)), (uint)MAX_COLUMNS);
m_rows = uint(double(height() + 1) / (HEIGHT + 1));
// this is the y-offset for drawing from the top of the widget float *front = static_cast<float*>( &scope.front() );
m_y = (height() - (m_rows * (HEIGHT + 1)) + 2) / 2;
m_scope.resize(m_columns);
if (m_rows != oldRows)
{
m_barPixmap.resize(WIDTH, m_rows * (HEIGHT + 1));
for (uint i = 0; i < FADE_SIZE; ++i )
{
m_fadeBars[i].resize(WIDTH, m_rows * (HEIGHT + 1));
}
m_yScale.resize(m_rows + 1);
const uint PRE = 1, PRO = 1; //PRE and PRO allow us to restrict the range somewhat
for (uint z = 0; z < m_rows; ++z)
{
m_yScale[z] = 1 - (log10(PRE + z) / log10(PRE + m_rows + PRO));
}
m_yScale[m_rows] = 0;
determineStep();
paletteChange( palette() );
}
else if (width() > e->oldSize().width() || height() > e->oldSize().height())
{
drawBackground();
}
analyze(m_scope); fht.spectrum( front );
fht.scale( front, 1.0 / 40 );
} }
void Analyzer::Block::determineStep()
{
// falltime is dependent on rowcount due to our digital resolution (ie we have boxes/blocks of pixels)
// I calculated the value 30 based on some trial and error
const double fallTime = 30 * m_rows;
// The number of milliseconds between signals with audio data is about 80,
// however, basing the step off of that value causes some undersireable
// effects in the analyzer (high-end blocks constantly appearing/disappearing).
// 44 seems to be a good mid-point.
m_step = double(m_rows * 44) / fallTime;
}
void Analyzer::Block::drawBackground() void
Analyzer::Block::analyze( const Analyzer::Scope &s )
{ {
const TQColor bg = palette().active().background(); canvas()->fill( colorGroup().foreground().light() );
const TQColor bgdark = bg.dark(112);
background()->fill(bg); TQPainter p( canvas() );
p.setPen( colorGroup().background() );
TQPainter p(background()); const double F = double(height()) / (log10( 256 ) * 1.1 /*<- max. amplitude*/);
for (int x = 0; (uint)x < m_columns; ++x)
{
for (int y = 0; (uint)y < m_rows; ++y)
{
p.fillRect(x * (WIDTH + 1), y * (HEIGHT + 1) + m_y, WIDTH, HEIGHT, bgdark);
}
}
setErasePixmap(*background()); for( uint x = 0; x < s.size(); ++x )
//we draw the blank bit
p.drawLine( x, 0, x, int(height() - log10( s[x] * 256.0 ) * F) );
} }
void Analyzer::interpolate(const Scope& inVec, Scope& outVec) int
Analyzer::Block::heightForWidth( int w ) const
{ {
double pos = 0.0; return w / 2;
const double step = (double)inVec.size() / (double)outVec.size();
for (uint i = 0; i < outVec.size(); ++i, pos += step)
{
const double error = pos - std::floor(pos);
const unsigned long offset = (unsigned long)pos;
unsigned long indexLeft = offset + 0;
if (indexLeft >= inVec.size())
{
indexLeft = inVec.size() - 1;
}
unsigned long indexRight = offset + 1;
if (indexRight >= inVec.size())
{
indexRight = inVec.size() - 1;
}
outVec[i] = inVec[indexLeft ] * (1.0 - error) +
inVec[indexRight] * error;
}
} }
#include "analyzer.moc" #include "analyzer.moc"

@ -8,7 +8,6 @@
#include <sys/types.h> #include <sys/types.h>
#endif #endif
#include "fht.h"
#include <tqpixmap.h> //stack allocated and convenience #include <tqpixmap.h> //stack allocated and convenience
#include <tqtimer.h> //stack allocated #include <tqtimer.h> //stack allocated
#include <tqwidget.h> //baseclass #include <tqwidget.h> //baseclass
@ -24,13 +23,10 @@ namespace Analyzer
uint timeout() const { return m_timeout; } uint timeout() const { return m_timeout; }
protected: protected:
Base( TQWidget*, uint, uint = 7 ); Base( TQWidget*, uint );
~Base() { delete m_fht; }
void drawFrame();
virtual void transform( Scope& ) = 0; virtual void transform( Scope& ) = 0;
virtual void analyze( const Scope& ) = 0; virtual void analyze( const Scope& ) = 0;
virtual void demo();
private: private:
virtual bool event( TQEvent* ); virtual bool event( TQEvent* );
@ -38,91 +34,42 @@ namespace Analyzer
protected: protected:
TQTimer m_timer; TQTimer m_timer;
uint m_timeout; uint m_timeout;
FHT *m_fht;
}; };
class Base2D : public Base<TQWidget> class Base2D : public Base<TQWidget>
{ {
TQ_OBJECT TQ_OBJECT
public: public:
const TQPixmap *background() const { return &m_background; }
const TQPixmap *canvas() const { return &m_canvas; } const TQPixmap *canvas() const { return &m_canvas; }
private slots: private slots:
void draw() { drawFrame(); bitBlt(this, 0, 0, canvas()); } void draw();
protected: protected:
Base2D( TQWidget*, uint timeout, uint scopeSize = 7 ); Base2D( TQWidget*, uint timeout );
TQPixmap *background() { return &m_background; }
TQPixmap *canvas() { return &m_canvas; } TQPixmap *canvas() { return &m_canvas; }
void eraseCanvas() void paintEvent( TQPaintEvent* ) { if( !m_canvas.isNull() ) bitBlt( this, 0, 0, canvas() ); }
{ void resizeEvent( TQResizeEvent* );
bitBlt(canvas(), 0, 0, background());
}
void paintEvent( TQPaintEvent* ) override { if( !m_canvas.isNull() ) bitBlt( this, 0, 0, canvas() ); }
void resizeEvent( TQResizeEvent* ) override;
void paletteChange( const TQPalette& ) override;
private: private:
TQPixmap m_background;
TQPixmap m_canvas; TQPixmap m_canvas;
}; };
class Block : public Analyzer::Base2D class Block : public Analyzer::Base2D
{ {
public: public:
explicit Block( TQWidget* ); Block( TQWidget* );
static constexpr int HEIGHT = 2;
static constexpr int FADE_SIZE = 90;
static constexpr int MIN_COLUMNS = 32;
static constexpr int MAX_COLUMNS = 256;
static constexpr int MIN_ROWS = 3;
static constexpr int WIDTH = 4;
protected: protected:
virtual void transform( Analyzer::Scope& ); virtual void transform( Analyzer::Scope& );
virtual void analyze( const Analyzer::Scope& ); virtual void analyze( const Analyzer::Scope& );
void paletteChange(const TQPalette&) override;
void resizeEvent(TQResizeEvent *) override;
void determineStep();
void drawBackground();
private:
TQPixmap *bar()
{
return &m_barPixmap;
}
// So we don't create a vector each frame. virtual int heightForWidth( int ) const;
Scope m_scope;
TQPixmap m_barPixmap;
TQPixmap m_topBarPixmap;
// Current bar heights virtual void show() {} //TODO temporary as the scope plugin causes freezes
std::vector<float> m_store;
std::vector<float> m_yScale;
std::vector<TQPixmap> m_fadeBars;
std::vector<int> m_fadeIntensity;
std::vector<unsigned> m_fadePos;
// Number of rows and columns of blocks
unsigned m_columns;
unsigned m_rows;
// y-offset from top of widget
unsigned m_y;
// rows to fall per-step
float m_step;
}; };
void interpolate(const Scope&, Scope&);
} }
#endif #endif

@ -1,61 +0,0 @@
// SPDX-FileCopyrightText: 2025 mio <stigma@disroot.org>
//
// SPDX-License-Identifier: GPL-2.0-or-later.
#include "audioView.h"
#include <tqlayout.h>
#include <tdepopupmenu.h>
#include <tdelocale.h>
#include "analyzer.h"
#include "codeineConfig.h"
namespace Codeine
{
AudioView::AudioView(TQWidget *parent, const char *name)
: TQFrame(parent, name)
{
auto *layout = new TQHBoxLayout(this);
m_analyzer = new Analyzer::Block(this);
// We subtract one from the below to remove excess padding.
// 36 blocks for the max/min height is arbitrary, but looks okay.
m_analyzer->setMaximumSize((Analyzer::Block::MAX_COLUMNS / 2) * (Analyzer::Block::WIDTH + 1) - 1,
36 * (Analyzer::Block::HEIGHT + 1) - 1);
m_analyzer->setMinimumSize(Analyzer::Block::WIDTH * Analyzer::Block::MIN_COLUMNS,
36 * (Analyzer::Block::HEIGHT + 1) - 1);
layout->addWidget(m_analyzer);
m_analyzer->setShown(config("AudioView")->readBoolEntry("showAudioAnalyzer", true));
}
AudioView::~AudioView()
{
config("AudioView")->writeEntry("showAudioAnalyzer", m_analyzer->isVisible());
config("AudioView")->sync();
}
void AudioView::contextMenuEvent(TQContextMenuEvent *e)
{
TDEPopupMenu popup;
popup.setCheckable(true);
int id = popup.insertItem(i18n("Show Analyzer"), this, TQ_SLOT(slotToggleVisibility()));
popup.setItemChecked(id, m_analyzer->isVisible());
popup.exec(e->globalPos());
}
void AudioView::slotToggleVisibility()
{
m_analyzer->setShown(!m_analyzer->isVisible());
}
}
#include "audioView.moc"

@ -1,33 +0,0 @@
// SPDX-FileCopyrightText: 2025 mio <stigma@disroot.org>
//
// SPDX-License-Identifier: GPL-2.0-or-later.
#ifndef CODEINE_AUDIOVIEW_H
#define CODEINE_AUDIOVIEW_H
#include <tqframe.h>
namespace Codeine
{
class AudioView : public TQFrame
{
TQ_OBJECT
public:
AudioView(TQWidget *parent, const char *name = nullptr);
~AudioView();
protected:
void contextMenuEvent(TQContextMenuEvent *e) override;
protected slots:
void slotToggleVisibility();
private:
TQWidget *m_analyzer;
};
}
#endif /* CODEINE_AUDIOVIEW_H */

@ -6,7 +6,6 @@
#include <kpushbutton.h> #include <kpushbutton.h>
#include <kstatusbar.h> #include <kstatusbar.h>
#include <kstdguiitem.h> #include <kstdguiitem.h>
#include <tqapplication.h>
#include <tqdialog.h> #include <tqdialog.h>
#include <tqhbox.h> #include <tqhbox.h>
#include <tqlabel.h> #include <tqlabel.h>
@ -70,16 +69,7 @@ public:
, m_title( TheStream::prettyTitle() ) , m_title( TheStream::prettyTitle() )
{ {
(new TQVBoxLayout( this ))->setAutoAdd( true ); (new TQVBoxLayout( this ))->setAutoAdd( true );
(new TQLabel( this ))->setPixmap( frame );
// Scale the image to fit within the current screen's size.
TQRect screenRect = tqApp->desktop()->availableGeometry( this );
if ( screenRect.contains( frame.rect() ) ) {
(new TQLabel( this ))->setPixmap( frame );
} else {
TQSize scaledSize = screenRect.size() * 0.9;
TQImage scaledImage = frame.scale( scaledSize, TQImage::ScaleMin );
(new TQLabel( this ))->setPixmap( scaledImage );
}
TQHBox *box = new TQHBox( this ); TQHBox *box = new TQHBox( this );
KPushButton *o = new KPushButton( KStdGuiItem::save(), box ); KPushButton *o = new KPushButton( KStdGuiItem::save(), box );
@ -251,34 +241,28 @@ VideoWindow::captureFrame() const
DEBUG_BLOCK DEBUG_BLOCK
int ratio, format, w, h; int ratio, format, w, h;
if (!xine_get_current_frame_s(*engine(), &w, &h, &ratio, &format, nullptr, nullptr)) if( !xine_get_current_frame( *engine(), &w, &h, &ratio, &format, NULL ) )
return TQImage(); return TQImage();
int yuv_size = ((w + 8) * (h + 1)) * 2; uint8_t *yuv = new uint8_t[((w+8) * (h+1) * 2)];
uint8_t *yuv = new(std::nothrow) uint8_t[yuv_size]; if( yuv == 0 ) {
if (yuv == nullptr) {
Debug::error() << "Not enough memory to make screenframe!\n"; Debug::error() << "Not enough memory to make screenframe!\n";
return TQImage(); return TQImage(); }
}
xine_get_current_frame_s(*engine(), &w, &h, &ratio, &format, yuv, &yuv_size); xine_get_current_frame( *engine(), &w, &h, &ratio, &format, yuv );
// convert to yv12 if necessary // convert to yv12 if necessary
uint8_t *y = nullptr; uint8_t *y = 0, *u = 0, *v = 0;
uint8_t *u = nullptr;
uint8_t *v = nullptr;
switch( format ) switch( format )
{ {
case XINE_IMGFMT_YUY2: { case XINE_IMGFMT_YUY2: {
uint8_t *yuy2 = yuv; uint8_t *yuy2 = yuv;
yuv = new(std::nothrow) uint8_t[(w * h * 2)]; yuv = new uint8_t[(w * h * 2)];
if (yuv == nullptr) { if( yuv == 0 ) {
Debug::error() << "Not enough memory to make screenframe!\n"; Debug::error() << "Not enough memory to make screenframe!\n";
delete [] yuy2; delete [] yuy2;
return TQImage(); return TQImage(); }
}
y = yuv; y = yuv;
u = yuv + w * h; u = yuv + w * h;
@ -303,7 +287,7 @@ VideoWindow::captureFrame() const
// convert to rgb // convert to rgb
uchar *rgb = yv12ToRgb( y, u, v, w, h ); uchar *rgb = yv12ToRgb( y, u, v, w, h );
TQImage frame( rgb, w, h, 32, nullptr, 0, TQImage::IgnoreEndian ); TQImage frame( rgb, w, h, 32, 0, 0, TQImage::IgnoreEndian );
delete [] yuv; delete [] yuv;
return frame; return frame;

@ -9,7 +9,7 @@ extern "C"
typedef struct xine_s xine_t; typedef struct xine_s xine_t;
} }
class TDESelectAction; class TQPopupMenu;
class TQWidget; class TQWidget;
namespace Codeine namespace Codeine
@ -22,7 +22,7 @@ namespace Codeine
void showVideoSettingsDialog( TQWidget* ); void showVideoSettingsDialog( TQWidget* );
void showXineConfigurationDialog( TQWidget*, xine_t* ); void showXineConfigurationDialog( TQWidget*, xine_t* );
void insertAspectRatioMenuItems( TDESelectAction* ); void insertAspectRatioMenuItems( TQPopupMenu* );
} }
#endif #endif

@ -24,9 +24,9 @@
FHT::FHT(int n) : FHT::FHT(int n) :
m_buf(nullptr), m_buf(0),
m_tab(nullptr), m_tab(0),
m_log(nullptr) m_log(0)
{ {
if (n < 3) { if (n < 3) {
m_num = 0; m_num = 0;
@ -175,8 +175,8 @@ void FHT::power2(float *p)
*p = (*p * *p), *p += *p, p++; *p = (*p * *p), *p += *p, p++;
for (i = 1, q = p + m_num - 2; i < (m_num / 2); i++, --q, p++) for (i = 1, q = p + m_num - 2; i < (m_num / 2); i++, --q)
*p = (*p * *p) + (*q * *q); *p++ = (*p * *p) + (*q * *q);
} }

@ -1,8 +1,8 @@
// Copyright 2005 Max Howell (max.howell@methylblue.com) // Copyright 2005 Max Howell (max.howell@methylblue.com)
// See COPYING file for licensing information // See COPYING file for licensing information
#include <tdeactionclasses.h>
#include <tqpopupmenu.h> #include <tqpopupmenu.h>
#include <xine.h>
TQString i18n( const char *text ); TQString i18n( const char *text );
@ -11,15 +11,15 @@ TQString i18n( const char *text );
namespace Codeine namespace Codeine
{ {
void void
insertAspectRatioMenuItems(TDESelectAction *action) insertAspectRatioMenuItems( TQPopupMenu *menu )
{ {
TQStringList items(i18n("Determine &Automatically")); menu->insertItem( i18n( "Determine &Automatically" ), XINE_VO_ASPECT_AUTO );
items.append(i18n("&Square (1:1)")); menu->insertSeparator();
items.append(i18n("&4:3")); menu->insertItem( i18n( "&Square (1:1)" ), XINE_VO_ASPECT_SQUARE );
items.append(i18n("Ana&morphic (16:9)")); menu->insertItem( i18n( "&4:3" ), XINE_VO_ASPECT_4_3 );
items.append(i18n("&DVB (2.11:1)")); menu->insertItem( i18n( "Ana&morphic (16:9)" ), XINE_VO_ASPECT_ANAMORPHIC );
menu->insertItem( i18n( "&DVB (2.11:1)" ), XINE_VO_ASPECT_DVB );
action->setItems(items); menu->setItemChecked( XINE_VO_ASPECT_AUTO, true );
action->popupMenu()->insertSeparator(1);
} }
} }

@ -11,7 +11,6 @@
#include <kcursor.h> #include <kcursor.h>
#include <tdefiledialog.h> //::open() #include <tdefiledialog.h> //::open()
#include <tdeglobalsettings.h> //::timerEvent() #include <tdeglobalsettings.h> //::timerEvent()
#include <tdepopupmenu.h>
#include <tdeio/netaccess.h> #include <tdeio/netaccess.h>
#include <ksqueezedtextlabel.h> #include <ksqueezedtextlabel.h>
#include <kstatusbar.h> #include <kstatusbar.h>
@ -19,17 +18,16 @@
#include <kurldrag.h> #include <kurldrag.h>
#include <twin.h> #include <twin.h>
#include <tqcstring.h> #include <tqcstring.h>
#include <tqdesktopwidget.h>
#include <tqevent.h> //::stateChanged() #include <tqevent.h> //::stateChanged()
#include <tqlayout.h> //ctor #include <tqlayout.h> //ctor
#include <tqpopupmenu.h> //because XMLGUI is poorly designed #include <tqpopupmenu.h> //because XMLGUI is poorly designed
#include <tqobjectlist.h> #include <tqobjectlist.h>
#include <tqwidgetstack.h>
#include "../debug.h" #include "../debug.h"
#include "../mxcl.library.h" #include "../mxcl.library.h"
#include "actions.h" #include "actions.h"
#include "analyzer.h" #include "analyzer.h"
#include "audioView.h"
#include "codeineConfig.h" #include "codeineConfig.h"
#include "extern.h" //dialog creation function definitions #include "extern.h" //dialog creation function definitions
#include "fullScreenAction.h" #include "fullScreenAction.h"
@ -50,15 +48,12 @@ extern "C"
} }
#endif #endif
constexpr auto kAspectSelectActionName = "aspect_ratio_select";
constexpr auto kAudioSelectActionName = "audio_channels_select";
constexpr auto kSubtitleSelectActionName = "subtitle_channels_select";
namespace Codeine { namespace Codeine {
/// @see codeine.h /// @see codeine.h
TQWidget *mainWindow() { return tdeApp->mainWidget(); } TQWidget *mainWindow() { return kapp->mainWidget(); }
MainWindow::MainWindow() MainWindow::MainWindow()
@ -71,21 +66,10 @@ MainWindow::MainWindow()
clearWFlags( WDestructiveClose ); //we are allocated on the stack clearWFlags( WDestructiveClose ); //we are allocated on the stack
tdeApp->setMainWidget( this ); kapp->setMainWidget( this );
m_widgetStack = new TQWidgetStack(this, "m_widgetStack");
new VideoWindow( this ); new VideoWindow( this );
setCentralWidget( videoWindow() );
m_audioView = new AudioView(this, "m_audioView");
// videoWindow() will be the initial widget.
// m_audioView is raised when no video track is present.
m_widgetStack->addWidget(videoWindow());
m_widgetStack->addWidget(m_audioView);
setCentralWidget(m_widgetStack);
setFocusProxy( videoWindow() ); // essential! See VideoWindow::event(), TQEvent::FocusOut setFocusProxy( videoWindow() ); // essential! See VideoWindow::event(), TQEvent::FocusOut
// these have no affect beccause "KDE Knows Best" FFS // these have no affect beccause "KDE Knows Best" FFS
@ -109,9 +93,6 @@ MainWindow::MainWindow()
setStandardToolBarMenuEnabled( false ); //bah to setupGUI()! setStandardToolBarMenuEnabled( false ); //bah to setupGUI()!
toolBar()->show(); //it's possible it would be hidden, but we don't want that as no UI way to show it! toolBar()->show(); //it's possible it would be hidden, but we don't want that as no UI way to show it!
m_showAnalyzer = config("MainWindow")->readBoolEntry("showAnalyzer", true);
m_analyzer->setShown(m_showAnalyzer);
// only show dvd button when playing a dvd // only show dvd button when playing a dvd
{ {
struct KdeIsTehSuck : public TQObject struct KdeIsTehSuck : public TQObject
@ -135,27 +116,26 @@ MainWindow::MainWindow()
} }
{ {
/* Disable aspect/channel menus until the stream has loaded; TQPopupMenu *menu = 0, *settings = static_cast<TQPopupMenu*>(factory()->container( "settings", this ));
* Make sure they have the same default item selected. */ int id = SubtitleChannelsMenuItemId, index = 0;
TQStringList defaultItems("&Determine Automatically");
if (const auto aspectAction = dynamic_cast<TDESelectAction *>(action(kAspectSelectActionName))) #define make_menu( name, text ) \
{ menu = new TQPopupMenu( this, name ); \
aspectAction->setToolTip(i18n("Aspect Ratio")); menu->setCheckable( true ); \
insertAspectRatioMenuItems(aspectAction); connect( menu, TQ_SIGNAL(activated( int )), engine(), TQ_SLOT(setStreamParameter( int )) ); \
aspectAction->setEnabled(false); connect( menu, TQ_SIGNAL(aboutToShow()), TQ_SLOT(aboutToShowMenu()) ); \
} settings->insertItem( text, menu, id, index ); \
if (const auto audioChannelAction = dynamic_cast<TDESelectAction *>(action(kAudioSelectActionName))) settings->setItemEnabled( id, false ); \
{ id++, index++;
audioChannelAction->setToolTip(i18n("Audio Channels"));
audioChannelAction->setItems(defaultItems); make_menu( "subtitle_channels_menu", i18n( "&Subtitles" ) );
audioChannelAction->setEnabled(false); make_menu( "audio_channels_menu", i18n( "A&udio Channels" ) );
} make_menu( "aspect_ratio_menu", i18n( "Aspect &Ratio" ) );
if (const auto subChannelAction = dynamic_cast<TDESelectAction *>(action(kSubtitleSelectActionName))) #undef make_menu
{
subChannelAction->setToolTip(i18n("Subtitles")); Codeine::insertAspectRatioMenuItems( menu ); //so we don't have to include xine.h here
subChannelAction->setItems(defaultItems);
subChannelAction->setEnabled(false); settings->insertSeparator( index );
}
} }
TQObjectList *list = toolBar()->queryList( "TDEToolBarButton" ); TQObjectList *list = toolBar()->queryList( "TDEToolBarButton" );
@ -173,7 +153,7 @@ MainWindow::MainWindow()
KXMLGUIClient::stateChanged( "empty" ); KXMLGUIClient::stateChanged( "empty" );
TDECmdLineArgs *args = TDECmdLineArgs::parsedArgs(); TDECmdLineArgs *args = TDECmdLineArgs::parsedArgs();
if( args->count() || args->isSet( "play-dvd" ) || tdeApp->isRestored() ) if( args->count() || args->isSet( "play-dvd" ) || kapp->isRestored() )
//we need to resize the window, so we can't show the window yet //we need to resize the window, so we can't show the window yet
init(); init();
else { else {
@ -190,14 +170,10 @@ MainWindow::init()
connect( engine(), TQ_SIGNAL(statusMessage( const TQString& )), this, TQ_SLOT(engineMessage( const TQString& )) ); connect( engine(), TQ_SIGNAL(statusMessage( const TQString& )), this, TQ_SLOT(engineMessage( const TQString& )) );
connect( engine(), TQ_SIGNAL(stateChanged( Engine::State )), this, TQ_SLOT(engineStateChanged( Engine::State )) ); connect( engine(), TQ_SIGNAL(stateChanged( Engine::State )), this, TQ_SLOT(engineStateChanged( Engine::State )) );
connect( engine(), TQ_SIGNAL(channelsChanged( const TQStringList& )), this, TQ_SLOT(setChannels( const TQStringList& )) );
connect( engine(), TQ_SIGNAL(titleChanged( const TQString& )), m_titleLabel, TQ_SLOT(setText( const TQString& )) ); connect( engine(), TQ_SIGNAL(titleChanged( const TQString& )), m_titleLabel, TQ_SLOT(setText( const TQString& )) );
connect( m_positionSlider, TQ_SIGNAL(valueChanged( int )), this, TQ_SLOT(showTime( int )) ); connect( m_positionSlider, TQ_SIGNAL(valueChanged( int )), this, TQ_SLOT(showTime( int )) );
connect(engine(), TQ_SIGNAL(audioChannelsChanged(const TQStringList &)),
this, TQ_SLOT(setAudioChannels(const TQStringList &)));
connect(engine(), TQ_SIGNAL(subtitleChannelsChanged(const TQStringList &)),
this, TQ_SLOT(setSubtitleChannels(const TQStringList &)));
if( !engine()->init() ) { if( !engine()->init() ) {
KMessageBox::error( this, i18n( KMessageBox::error( this, i18n(
"<qt>xine could not be successfully initialised. " PRETTY_NAME " will now exit. " "<qt>xine could not be successfully initialised. " PRETTY_NAME " will now exit. "
@ -212,7 +188,7 @@ MainWindow::init()
TQApplication::restoreOverrideCursor(); TQApplication::restoreOverrideCursor();
if( !tdeApp->isRestored() ) { if( !kapp->isRestored() ) {
TDECmdLineArgs &args = *TDECmdLineArgs::parsedArgs(); TDECmdLineArgs &args = *TDECmdLineArgs::parsedArgs();
if (args.isSet( "play-dvd" )) if (args.isSet( "play-dvd" ))
open( "dvd:/" ); open( "dvd:/" );
@ -245,9 +221,6 @@ MainWindow::~MainWindow()
bool bool
MainWindow::queryExit() MainWindow::queryExit()
{ {
config("MainWindow")->writeEntry("showAnalyzer", m_showAnalyzer);
config("MainWindow")->sync();
if( toggleAction( "fullscreen" )->isChecked() ) { if( toggleAction( "fullscreen" )->isChecked() ) {
// there seems to be no other way to stop TDEMainWindow // there seems to be no other way to stop TDEMainWindow
// saving the window state without any controls // saving the window state without any controls
@ -273,7 +246,7 @@ MainWindow::setupActions()
TDEActionCollection * const ac = actionCollection(); TDEActionCollection * const ac = actionCollection();
KStdAction::quit( tdeApp, TQ_SLOT(quit()), ac ); KStdAction::quit( kapp, TQ_SLOT(quit()), ac );
KStdAction::open( this, TQ_SLOT(playMedia()), ac, "play_media" )->setText( i18n("Play &Media...") ); KStdAction::open( this, TQ_SLOT(playMedia()), ac, "play_media" )->setText( i18n("Play &Media...") );
connect( new FullScreenAction( this, ac ), TQ_SIGNAL(toggled( bool )), TQ_SLOT(fullScreenToggled( bool )) ); connect( new FullScreenAction( this, ac ), TQ_SIGNAL(toggled( bool )), TQ_SLOT(fullScreenToggled( bool )) );
@ -284,22 +257,13 @@ MainWindow::setupActions()
new TDEAction( i18n("Reset Video Scale"), "viewmag1", Key_Equal, videoWindow(), TQ_SLOT(resetZoom()), ac, "reset_zoom" ); new TDEAction( i18n("Reset Video Scale"), "viewmag1", Key_Equal, videoWindow(), TQ_SLOT(resetZoom()), ac, "reset_zoom" );
new TDEAction( i18n("Media Information"), "messagebox_info", Key_I, this, TQ_SLOT(streamInformation()), ac, "information" ); new TDEAction( i18n("Media Information"), "messagebox_info", Key_I, this, TQ_SLOT(streamInformation()), ac, "information" );
new TDEAction( i18n("Menu Toggle"), "media-optical-dvd-unmounted", Key_R, engine(), TQ_SLOT(toggleDVDMenu()), ac, "toggle_dvd_menu" ); new TDEAction( i18n("Menu Toggle"), "media-optical-dvd-unmounted", Key_R, engine(), TQ_SLOT(toggleDVDMenu()), ac, "media-optical-dvd-unmounted" );
new TDEAction( i18n("&Capture Frame"), "frame_image", Key_C, this, TQ_SLOT(captureFrame()), ac, "capture_frame" ); new TDEAction( i18n("&Capture Frame"), "frame_image", Key_C, this, TQ_SLOT(captureFrame()), ac, "capture_frame" );
new TDEAction( i18n("Video Settings..."), "configure", Key_V, this, TQ_SLOT(configure()), ac, "video_settings" ); new TDEAction( i18n("Video Settings..."), "configure", Key_V, this, TQ_SLOT(configure()), ac, "video_settings" );
new TDEAction( i18n("Configure xine..."), "configure", 0, this, TQ_SLOT(configure()), ac, "xine_settings" ); new TDEAction( i18n("Configure xine..."), "configure", 0, this, TQ_SLOT(configure()), ac, "xine_settings" );
(new KWidgetAction( m_positionSlider, i18n("Position Slider"), nullptr, nullptr, nullptr, ac, "position_slider" ))->setAutoSized( true ); (new KWidgetAction( m_positionSlider, i18n("Position Slider"), 0, 0, 0, ac, "position_slider" ))->setAutoSized( true );
const auto audioSelectAction = new TDESelectAction(i18n("A&udio Channels"), 0, ac, kAudioSelectActionName);
connect(audioSelectAction, TQ_SIGNAL(activated(int)), engine(), TQ_SLOT(setStreamParameter(int)));
const auto subSelectAction = new TDESelectAction(i18n("&Subtitles"), 0, ac, kSubtitleSelectActionName);
connect(subSelectAction, TQ_SIGNAL(activated(int)), engine(), TQ_SLOT(setStreamParameter(int)));
const auto aspectSelectAction = new TDESelectAction(i18n("Aspect &Ratio"), 0, ac, kAspectSelectActionName);
connect(aspectSelectAction, TQ_SIGNAL(activated(int)), engine(), TQ_SLOT(setStreamParameter(int)));
m_volumeAction = new VolumeAction( toolBar(), ac ); m_volumeAction = new VolumeAction( toolBar(), ac );
} }
@ -318,24 +282,6 @@ MainWindow::readProperties( TDEConfig *config )
engine()->play( config->readNumEntry( "time" ) ); engine()->play( config->readNumEntry( "time" ) );
} }
void
MainWindow::contextMenuEvent(TQContextMenuEvent *ev)
{
TQRect statusBarRect(mapTo(this, statusBar()->pos()), statusBar()->size());
if (statusBarRect.contains(ev->pos()) && TheStream::hasVideo())
{
ev->accept();
TDEPopupMenu menu;
menu.setCheckable(true);
int id = menu.insertItem(i18n("Show Analyzer"), this, TQ_SLOT(toggleAnalyzer()));
menu.setItemChecked(id, m_analyzer->isVisible());
menu.exec(ev->globalPos());
}
}
void void
MainWindow::timerEvent( TQTimerEvent* ) MainWindow::timerEvent( TQTimerEvent* )
{ {
@ -385,13 +331,6 @@ MainWindow::showTime( int pos )
m_timeLabel->setText( time ); m_timeLabel->setText( time );
} }
void
MainWindow::toggleAnalyzer()
{
m_showAnalyzer = !m_showAnalyzer;
m_analyzer->setShown(m_showAnalyzer);
}
void void
MainWindow::engineMessage( const TQString &message ) MainWindow::engineMessage( const TQString &message )
{ {
@ -442,7 +381,7 @@ MainWindow::load( const KURL &url )
if (url.protocol() == "media") { if (url.protocol() == "media") {
#define UDS_LOCAL_PATH (72 | TDEIO::UDS_STRING) #define UDS_LOCAL_PATH (72 | TDEIO::UDS_STRING)
TDEIO::UDSEntry e; TDEIO::UDSEntry e;
if (!TDEIO::NetAccess::stat( url, e, nullptr )) if (!TDEIO::NetAccess::stat( url, e, 0 ))
MessageBox::sorry( "There was an internal error with the media slave..." ); MessageBox::sorry( "There was an internal error with the media slave..." );
else { else {
TDEIO::UDSEntry::ConstIterator end = e.end(); TDEIO::UDSEntry::ConstIterator end = e.end();
@ -568,6 +507,7 @@ show_toolbar:
//we aren't managed by mainWindow when at FullScreen //we aren't managed by mainWindow when at FullScreen
videoWindow()->move( 0, 0 ); videoWindow()->move( 0, 0 );
videoWindow()->resize( ((TQWidget*)o)->size() ); videoWindow()->resize( ((TQWidget*)o)->size() );
videoWindow()->lower();
} }
if (o == m_toolbar) if (o == m_toolbar)
@ -624,12 +564,14 @@ MainWindow::fullScreenToggled( bool isFullScreen )
statusBar()->setHidden( isFullScreen ); statusBar()->setHidden( isFullScreen );
setMouseTracking( isFullScreen ); /// @see mouseMoveEvent() setMouseTracking( isFullScreen ); /// @see mouseMoveEvent()
m_widgetStack->setMouseTracking(isFullScreen);
if (isFullScreen) if (isFullScreen)
s_handler = new FullScreenToolBarHandler( this ); s_handler = new FullScreenToolBarHandler( this );
else else
delete s_handler; delete s_handler;
// prevent videoWindow() moving around when mouse moves
setCentralWidget( isFullScreen ? 0 : videoWindow() );
} }
void void
@ -651,49 +593,54 @@ MainWindow::streamInformation()
} }
void void
MainWindow::setAudioChannels(const TQStringList &channels) const MainWindow::setChannels( const TQStringList &channels )
{ {
DEBUG_FUNC_INFO DEBUG_FUNC_INFO
/* Xine uses -1 and -2 to indicate that a channel should be determined automatically or //TODO -1 = auto
* turned off. TDESelectAction inserts items starting from index 0, so we add 2 to the
* channel returned from TheStream to match. */
if (const auto audioSelection = dynamic_cast<TDESelectAction *>(action(kAudioSelectActionName))) TQStringList::ConstIterator it = channels.begin();
{
TQStringList audioChannels(channels); TQPopupMenu *menu = (TQPopupMenu*)child( (*it).latin1() );
audioChannels.prepend("&Determine Automatically"); menu->clear();
audioChannels.prepend("&Off");
audioSelection->setItems(audioChannels); menu->insertItem( i18n("&Determine Automatically"), 1 );
audioSelection->popupMenu()->insertSeparator(2); menu->insertSeparator();
audioSelection->setCurrentItem(TheStream::audioChannel() + 2);
audioSelection->setEnabled(channels.count()); //the id is crucial, since the slot this menu is connected to requires
} //that information to set the correct channel
else //NOTE we subtract 2 in xineEngine because TQMenuData doesn't allow negative id
{ int id = 2;
Debug::error() << "Failed to update the audio channels (selection menu not found)" << endl; ++it;
} for( TQStringList::ConstIterator const end = channels.end(); it != end; ++it, ++id )
menu->insertItem( *it, id );
menu->insertSeparator();
menu->insertItem( i18n("&Off"), 0 );
id = channels.first() == "subtitle_channels_menu" ? SubtitleChannelsMenuItemId : AudioChannelsMenuItemId;
MainWindow::menu( "settings" )->setItemEnabled( id, channels.count() > 1 );
} }
void void
MainWindow::setSubtitleChannels(const TQStringList &channels) const MainWindow::aboutToShowMenu()
{ {
DEBUG_FUNC_INFO TQPopupMenu *menu = (TQPopupMenu*)sender();
TQCString name( sender() ? sender()->name() : 0 );
if (const auto subSelection = dynamic_cast<TDESelectAction *>(action(kSubtitleSelectActionName)))
{ // uncheck all items first
TQStringList subChannels(channels); for( uint x = 0; x < menu->count(); ++x )
subChannels.prepend("&Determine Automatically"); menu->setItemChecked( menu->idAt( x ), false );
subChannels.prepend("&Off");
subSelection->setItems(subChannels); int id;
subSelection->popupMenu()->insertSeparator(2); if( name == "subtitle_channels_menu" )
subSelection->setCurrentItem(TheStream::subtitleChannel() + 2); id = TheStream::subtitleChannel() + 2;
subSelection->setEnabled(channels.count()); else if( name == "audio_channels_menu" )
} id = TheStream::audioChannel() + 2;
else else
{ id = TheStream::aspectRatio();
Debug::error() << "Failed to update the subtitle channels (selection menu not found)" << endl;
} menu->setItemChecked( id, true );
} }
void void
@ -734,10 +681,10 @@ MainWindow::keyPressEvent( TQKeyEvent *e )
} }
TQPopupMenu* TQPopupMenu*
MainWindow::menu( const TQString& name ) MainWindow::menu( const char *name )
{ {
// KXMLGUI is "really good". // KXMLGUI is "really good".
return dynamic_cast<TQPopupMenu*>(factory()->container( name, this )); return static_cast<TQPopupMenu*>(factory()->container( name, this ));
} }
@ -745,7 +692,7 @@ MainWindow::menu( const TQString& name )
TDEActionCollection* TDEActionCollection*
actionCollection() actionCollection()
{ {
return static_cast<MainWindow*>(tdeApp->mainWidget())->actionCollection(); return static_cast<MainWindow*>(kapp->mainWidget())->actionCollection();
} }
/// Convenience class for other classes that need access to the actions /// Convenience class for other classes that need access to the actions
@ -754,23 +701,17 @@ action( const char *name )
{ {
#define QT_FATAL_ASSERT #define QT_FATAL_ASSERT
MainWindow *mainWindow = nullptr; MainWindow *mainWindow = 0;
TDEActionCollection *actionCollection = nullptr; TDEActionCollection *actionCollection = 0;
TDEAction *action = nullptr; TDEAction *action = 0;
mainWindow = dynamic_cast<MainWindow *>(tdeApp->mainWidget()); if( mainWindow = (MainWindow*)kapp->mainWidget() )
if (mainWindow) if( actionCollection = mainWindow->actionCollection() )
{ action = actionCollection->action( name );
actionCollection = mainWindow->actionCollection();
if (actionCollection)
{
action = actionCollection->action(name);
}
}
Q_ASSERT(mainWindow); Q_ASSERT( mainWindow );
Q_ASSERT(actionCollection); Q_ASSERT( actionCollection );
Q_ASSERT(action); Q_ASSERT( action );
return action; return action;
} }

@ -11,14 +11,11 @@ class KURL;
class TQLabel; class TQLabel;
class TQPopupMenu; class TQPopupMenu;
class TQSlider; class TQSlider;
class TQWidgetStack;
class VolumeAction; class VolumeAction;
namespace Codeine namespace Codeine
{ {
class AudioView;
class MainWindow : public TDEMainWindow class MainWindow : public TDEMainWindow
{ {
TQ_OBJECT TQ_OBJECT
@ -43,10 +40,9 @@ namespace Codeine
void engineStateChanged( Engine::State ); void engineStateChanged( Engine::State );
void init(); void init();
void showTime( int = -1 ); void showTime( int = -1 );
void setChannels( const TQStringList& );
void aboutToShowMenu();
void fullScreenToggled( bool ); void fullScreenToggled( bool );
void setAudioChannels(const TQStringList&) const;
void setSubtitleChannels(const TQStringList&) const;
void toggleAnalyzer();
private: private:
void setupActions(); void setupActions();
@ -54,9 +50,8 @@ namespace Codeine
bool load( const KURL& ); bool load( const KURL& );
bool open( const KURL& ); bool open( const KURL& );
TQPopupMenu *menu(const TQString&); TQPopupMenu *menu( const char *name );
void contextMenuEvent(TQContextMenuEvent *event) override;
virtual void timerEvent( TQTimerEvent* ); virtual void timerEvent( TQTimerEvent* );
virtual void dragEnterEvent( TQDragEnterEvent* ); virtual void dragEnterEvent( TQDragEnterEvent* );
virtual void dropEvent( TQDropEvent* ); virtual void dropEvent( TQDropEvent* );
@ -71,14 +66,8 @@ namespace Codeine
TQLabel *m_timeLabel; TQLabel *m_timeLabel;
TQLabel *m_titleLabel; TQLabel *m_titleLabel;
TQWidget *m_analyzer; TQWidget *m_analyzer;
AudioView *m_audioView;
TQWidgetStack *m_widgetStack;
VolumeAction *m_volumeAction; VolumeAction *m_volumeAction;
// Keep track of Analyzer visibility separately so swapping between
// Video & Audio correctly restores the state without re-reading the config.
bool m_showAnalyzer;
//undefined //undefined
MainWindow( const MainWindow& ); MainWindow( const MainWindow& );
MainWindow &operator=( const MainWindow& ); MainWindow &operator=( const MainWindow& );

@ -25,7 +25,7 @@ namespace Codeine {
PlayDialog::PlayDialog( TQWidget *parent, bool be_welcome_dialog ) PlayDialog::PlayDialog( TQWidget *parent, bool be_welcome_dialog )
: TQDialog( parent ) : TQDialog( parent )
{ {
setCaption( tdeApp->makeStdCaption( i18n("Play Media") ) ); setCaption( kapp->makeStdCaption( i18n("Play Media") ) );
TQSignalMapper *mapper = new TQSignalMapper( this ); TQSignalMapper *mapper = new TQSignalMapper( this );
TQWidget *o, *closeButton = new KPushButton( KStdGuiItem::close(), this ); TQWidget *o, *closeButton = new KPushButton( KStdGuiItem::close(), this );
@ -59,7 +59,7 @@ PlayDialog::PlayDialog( TQWidget *parent, bool be_welcome_dialog )
if( be_welcome_dialog ) { if( be_welcome_dialog ) {
TQWidget *w = new KPushButton( KStdGuiItem::quit(), this ); TQWidget *w = new KPushButton( KStdGuiItem::quit(), this );
hbox->addWidget( w ); hbox->addWidget( w );
connect( w, TQ_SIGNAL(clicked()), tdeApp, TQ_SLOT(quit()) ); connect( w, TQ_SIGNAL(clicked()), kapp, TQ_SLOT(quit()) );
} }
hbox->addWidget( closeButton ); hbox->addWidget( closeButton );
@ -93,7 +93,7 @@ PlayDialog::createRecentFileWidget( TQBoxLayout *layout )
for( KURL::List::ConstIterator it = urls.begin(), end = urls.end(); it != end; ++it ) { for( KURL::List::ConstIterator it = urls.begin(), end = urls.end(); it != end; ++it ) {
const TQString fileName = (*it).fileName(); const TQString fileName = (*it).fileName();
new TDEListViewItem( lv, nullptr, (*it).url(), fileName.isEmpty() ? (*it).prettyURL() : fileName ); new TDEListViewItem( lv, 0, (*it).url(), fileName.isEmpty() ? (*it).prettyURL() : fileName );
} }
if( lv->childCount() ) { if( lv->childCount() ) {

@ -14,7 +14,7 @@
using Codeine::Slider; using Codeine::Slider;
Slider *Slider::s_instance = nullptr; Slider *Slider::s_instance = 0;
Slider::Slider( TQWidget *parent, uint max ) Slider::Slider( TQWidget *parent, uint max )
@ -106,8 +106,8 @@ static inline TQString timeAsString( const int s )
void void
Slider::setValue( int newValue ) Slider::setValue( int newValue )
{ {
static TQLabel *w1 = nullptr; static TQLabel *w1 = 0;
static TQLabel *w2 = nullptr; static TQLabel *w2 = 0;
if (!w1) { if (!w1) {
w1 = new TQLabel( this ); w1 = new TQLabel( this );

@ -13,8 +13,6 @@
#include <tqlabel.h> #include <tqlabel.h>
#include <tqpopupmenu.h> #include <tqpopupmenu.h>
#include <tqslider.h> #include <tqslider.h>
#include <tqwidgetstack.h>
#include "audioView.h"
#include "theStream.h" #include "theStream.h"
#include "videoSettings.h" //FIXME unfortunate #include "videoSettings.h" //FIXME unfortunate
#include "xineEngine.h" #include "xineEngine.h"
@ -65,8 +63,7 @@ MainWindow::engineStateChanged( Engine::State state )
toggleAction( "play" )->setChecked( state == Playing ); toggleAction( "play" )->setChecked( state == Playing );
//FIXME bad design to do this way //FIXME bad design to do this way
m_volumeAction->setVolume(engine()->volume()); m_volumeAction->sliderMoved( engine()->volume() );
m_volumeAction->setMuted(engine()->isMuted());
} }
@ -93,32 +90,19 @@ MainWindow::engineStateChanged( Engine::State state )
file_menu->changeItem( play_id, item.iconSet(), item.text() ); file_menu->changeItem( play_id, item.iconSet(), item.text() );
file_menu->setItemChecked( play_id, false ); file_menu->setItemChecked( play_id, false );
if (const auto aspectAction = dynamic_cast<TDESelectAction *>(action("aspect_ratio_select"))) settings_menu->setItemEnabled( AspectRatioMenuItemId, state & (Playing | Paused) && TheStream::hasVideo() );
{
aspectAction->setEnabled((state & (Playing | Paused)) && TheStream::hasVideo()); // set correct aspect ratio
if (state == Loaded) if( state == Loaded )
{ static_cast<TQPopupMenu*>(child( "aspect_ratio_menu" ))->setItemChecked( TheStream::aspectRatio(), true );
aspectAction->setCurrentItem(TheStream::aspectRatio());
}
}
} }
/// update statusBar /// update statusBar
{ {
using namespace Engine; using namespace Engine;
m_analyzer->setShown(m_showAnalyzer && (TheStream::hasVideo() && TheStream::hasAudio())); m_analyzer->setShown( state & (Playing | Paused) && TheStream::hasAudio() );
m_timeLabel->setShown(state & (Playing | Paused)); m_timeLabel->setShown( state & (Playing | Paused) );
}
// Update the current widget shown.
if (TheStream::hasVideo() || (state & (Engine::Empty)))
{
m_widgetStack->raiseWidget(videoWindow());
}
else if (TheStream::hasAudio())
{
m_widgetStack->raiseWidget(m_audioView);
} }
@ -136,8 +120,6 @@ MainWindow::engineStateChanged( Engine::State state )
case Engine::Paused: case Engine::Paused:
m_positionSlider->setEnabled( TheStream::canSeek() ); m_positionSlider->setEnabled( TheStream::canSeek() );
break; break;
default:
break;
} }
@ -178,8 +160,6 @@ MainWindow::engineStateChanged( Engine::State state )
case Engine::TrackEnded: case Engine::TrackEnded:
m_titleLabel->setText( TheStream::prettyTitle() ); m_titleLabel->setText( TheStream::prettyTitle() );
break; break;
default:
break;
} }
@ -207,8 +187,6 @@ MainWindow::engineStateChanged( Engine::State state )
case Engine::Playing: case Engine::Playing:
toolBar()->hide(); toolBar()->hide();
break; break;
default:
break;
} }
} }
} }

@ -139,12 +139,9 @@ VideoWindow::contextMenuEvent( TQContextMenuEvent *e )
popup.insertSeparator(); popup.insertSeparator();
if (TheStream::url().protocol() == "dvd") if( TheStream::url().protocol() == "dvd" )
{ action( "toggle_dvd_menu" )->plug( &popup ),
action("toggle_dvd_menu")->plug(&popup);
popup.insertSeparator(); popup.insertSeparator();
}
if( !((TDEToggleAction*)actionCollection()->action( "fullscreen" ))->isChecked() ) if( !((TDEToggleAction*)actionCollection()->action( "fullscreen" ))->isChecked() )
action( "reset_zoom" )->plug( &popup ); action( "reset_zoom" )->plug( &popup );
action( "capture_frame" )->plug( &popup ); action( "capture_frame" )->plug( &popup );
@ -226,6 +223,11 @@ VideoWindow::event( TQEvent *e )
stop(); stop();
return false; return false;
case VideoWindow::ExposeEvent:
//see VideoWindow::x11Event()
return true;
// Xlib.h sucks fucking balls!!!!11!!1! // Xlib.h sucks fucking balls!!!!11!!1!
#undef KeyPress #undef KeyPress
case TQEvent::KeyPress: { case TQEvent::KeyPress: {
@ -257,7 +259,7 @@ VideoWindow::event( TQEvent *e )
xine_event_t xineEvent; xine_event_t xineEvent;
xineEvent.type = keyCode; xineEvent.type = keyCode;
xineEvent.data = nullptr; xineEvent.data = NULL;
xineEvent.data_length = 0; xineEvent.data_length = 0;
xine_event_send( m_stream, &xineEvent ); xine_event_send( m_stream, &xineEvent );

@ -1,15 +1,12 @@
// (C) 2005 Max Howell (max.howell@methylblue.com) // (C) 2005 Max Howell (max.howell@methylblue.com)
// See COPYING file for licensing information // See COPYING file for licensing information
#include <kiconloader.h>
#include <tdelocale.h> #include <tdelocale.h>
#include <tdetoolbar.h> #include <tdetoolbar.h>
#include <tqevent.h> #include <tqevent.h>
#include <tqlabel.h> #include <tqlabel.h>
#include <tqlayout.h> #include <tqlayout.h>
#include <tqslider.h> #include <tqslider.h>
#include <tqtoolbutton.h>
#include <tqtooltip.h>
#include "../debug.h" #include "../debug.h"
#include "volumeAction.h" #include "volumeAction.h"
@ -23,45 +20,19 @@ public:
VolumeSlider( TQWidget *parent ) VolumeSlider( TQWidget *parent )
: TQFrame( parent ) : TQFrame( parent )
{ {
slider = new TQSlider(TQt::Vertical, this, "volume"); slider = new TQSlider( TQt::Vertical, this, "volume" );
label = new TQLabel(this); label = new TQLabel( this );
mute = new TQToolButton(this, "volume_slider_mute"); TQBoxLayout *lay = new TQVBoxLayout( this );
mute->setAutoRaise(true); lay->addWidget( slider, 0, TQt::AlignHCenter );
mute->setToggleButton(true); lay->addWidget( label, 0, TQt::AlignHCenter );
TQToolTip::add(mute, i18n("Toggle Mute")); lay->setMargin( 4 );
TQBoxLayout *lay = new TQVBoxLayout(this);
lay->addWidget(slider, 0, TQt::AlignHCenter);
lay->addWidget(label, 0, TQt::AlignHCenter);
lay->addWidget(mute, 0, TQt::AlignHCenter);
lay->setMargin(4);
slider->setRange( 0, 100 ); slider->setRange( 0, 100 );
setFrameStyle( TQFrame::Plain | TQFrame::Box ); setFrameStyle( TQFrame::Plain | TQFrame::Box );
setSizePolicy( TQSizePolicy::Preferred, TQSizePolicy::Preferred ); setSizePolicy( TQSizePolicy::Preferred, TQSizePolicy::Preferred );
// Test for icon support
const char* mutedIcons[] = { "audio-volume-muted", "player_mute", "mute" };
bool iconFound = false;
for (size_t i = 0; i < (sizeof(mutedIcons) / sizeof(*mutedIcons)); ++i)
{
if (!TDEGlobal::iconLoader()->iconPath(mutedIcons[i], TDEIcon::Toolbar, true).isNull())
{
mute->setIconSet(TDEGlobal::iconLoader()->loadIconSet(mutedIcons[i], TDEIcon::Toolbar));
iconFound = true;
break;
}
}
if (!iconFound)
{
mute->setAutoRaise(false);
mute->setText(i18n("Mute"));
}
// Calculate width required for max label size // Calculate width required for max label size
label->setText( "100%" ); label->setText( "100%" );
adjustSize(); adjustSize();
@ -70,30 +41,22 @@ public:
hide(); hide();
} }
TQToolButton *mute;
TQLabel *label; TQLabel *label;
TQSlider *slider; TQSlider *slider;
int requiredWidth; int requiredWidth;
void setMuted(bool muted)
{
// Behave correctly when VolumeAction's "setMuted" slot is invoked.
mute->setDown(muted);
}
}; };
VolumeAction::VolumeAction( TDEToolBar *bar, TDEActionCollection *ac ) VolumeAction::VolumeAction( TDEToolBar *bar, TDEActionCollection *ac )
: TDEToggleAction( i18n("Volume"), "volume", TQt::Key_1, nullptr, nullptr, ac, "volume" ) : TDEToggleAction( i18n("Volume"), "volume", TQt::Key_1, 0, 0, ac, "volume" )
, m_anchor( nullptr ) , m_anchor( 0 )
{ {
m_widget = new VolumeSlider( bar->topLevelWidget() ); m_widget = new VolumeSlider( bar->topLevelWidget() );
connect(this, TQ_SIGNAL(toggled(bool)), TQ_SLOT(toggled(bool))); connect( this, TQ_SIGNAL(toggled( bool )), TQ_SLOT(toggled( bool )) );
connect(m_widget->mute, TQ_SIGNAL(toggled(bool)), Codeine::engine(), TQ_SLOT(setMuted(bool))); connect( m_widget->slider, TQ_SIGNAL(sliderMoved( int )), TQ_SLOT(sliderMoved( int )) );
connect(m_widget->mute, TQ_SIGNAL(toggled(bool)), TQ_SLOT(setMuted(bool))); connect( m_widget->slider, TQ_SIGNAL(sliderMoved( int )), Codeine::engine(), TQ_SLOT(setStreamParameter( int )) );
connect(m_widget->slider, TQ_SIGNAL(valueChanged(int)), Codeine::engine(), TQ_SLOT(setStreamParameter(int))); connect( m_widget->slider, TQ_SIGNAL(sliderReleased()), TQ_SLOT(sliderReleased()) );
connect(m_widget->slider, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(sliderMoved(int)));
} }
int int
@ -112,32 +75,25 @@ VolumeAction::plug( TQWidget *bar, int index )
void void
VolumeAction::toggled( bool const b ) VolumeAction::toggled( bool const b )
{ {
DEBUG_BLOCK
TQString t = TQString::number(100 - m_widget->slider->value()) + "%";
setToolTip( i18n( "Volume: %1" ).arg( t ) );
m_widget->label->setText( t );
m_widget->raise(); m_widget->raise();
m_widget->setShown( b ); m_widget->setShown( b );
} }
void void
VolumeAction::sliderMoved(int v) VolumeAction::sliderMoved( int v )
{ {
// TQt sliders are wrong way round when vertical v = 100 - v; //TQt sliders are wrong way round when vertical
v = 100 - v;
auto vol = TQString("%1%").arg(v); TQString t = TQString::number( v ) + '%';
m_widget->label->setText(vol);
setToolTip(i18n("Volume %1").arg(vol));
}
void setToolTip( i18n( "Volume: %1" ).arg( t ) );
VolumeAction::setMuted(bool mute) m_widget->label->setText( t );
{
m_widget->setMuted(mute);
}
void
VolumeAction::setVolume(int volume)
{
// TQt sliders are the wrong way round when vertical.
m_widget->slider->setValue(100 - volume);
} }
bool bool

@ -18,13 +18,11 @@ class VolumeAction : public TDEToggleAction
virtual int plug( TQWidget*, int ); virtual int plug( TQWidget*, int );
public slots: public slots:
void setMuted(bool mute); void sliderMoved( int );
// Update Slider and Label to \a volume
void setVolume(int volume);
private slots: private slots:
void toggled( bool ); void toggled( bool );
void sliderMoved(int); void sliderReleased() { setChecked( false ); toggled( false ); }
public: public:
VolumeAction( TDEToolBar *anchor, TDEActionCollection *ac ); VolumeAction( TDEToolBar *anchor, TDEActionCollection *ac );

@ -24,7 +24,7 @@
TQString i18n(const char *text); TQString i18n(const char *text);
KDialogBase *XineConfigDialog::s_instance = nullptr; KDialogBase *XineConfigDialog::s_instance = 0;
namespace Codeine namespace Codeine
@ -38,6 +38,22 @@ namespace Codeine
} }
} }
class TabWidget : public TQTabWidget
{
public:
TabWidget( TQWidget *parent ) : TQTabWidget( parent ) {}
virtual TQSize sizeHint() const
{
// TQt gives a stupid default sizeHint for this widget
return TQSize(
reinterpret_cast<TQWidget*>(tabBar())->sizeHint().width() + 5,
TQTabWidget::sizeHint().height() );
}
};
///@class XineConfigDialog ///@class XineConfigDialog
XineConfigDialog::XineConfigDialog( xine_t *xine, TQWidget *parent ) XineConfigDialog::XineConfigDialog( xine_t *xine, TQWidget *parent )
@ -52,26 +68,32 @@ XineConfigDialog::XineConfigDialog( xine_t *xine, TQWidget *parent )
DEBUG_BLOCK DEBUG_BLOCK
s_instance = this; s_instance = this;
const int METRIC = fontMetrics().width( 'x' );
const int METRIC_3B2 = (3*METRIC)/2;
TQWidget *page = new TQWidget(this); TQVBox *box = new TQVBox( this );
setMainWidget(page); box->setSpacing( METRIC );
TQVBoxLayout *topLayout = new TQVBoxLayout(page, 0, spacingHint()); setMainWidget( box );
{ {
TQHBoxLayout *infoLayout = new TQHBoxLayout(topLayout, spacingHint()); TQHBox *hbox = new TQHBox( box );
TQPixmap info = tdeApp->iconLoader()->loadIcon("messagebox_info", TDEIcon::NoGroup, TDEIcon::SizeMedium, TDEIcon::DefaultState, nullptr, true); hbox->setSpacing( METRIC_3B2 );
TQLabel *label = new TQLabel(page); hbox->setMargin( METRIC_3B2 );
label->setPixmap(info); TQPixmap info = kapp->iconLoader()->loadIcon( "messagebox_info", TDEIcon::NoGroup, TDEIcon::SizeMedium, TDEIcon::DefaultState, 0, true );
label->setSizePolicy(TQSizePolicy::Maximum, TQSizePolicy::Maximum); TQLabel *label = new TQLabel( hbox );
infoLayout->addWidget(label); label->setPixmap( info );
label = new TQLabel(i18n( label->setSizePolicy( TQSizePolicy::Maximum, TQSizePolicy::Maximum );
"Xine's defaults are usually sensible and should not require modification. " label = new TQLabel( i18n(
"However, full configurability is provided for your pleasure ;-)"), page); "xine's defaults are usually sensible and should not require modification. "
label->setAlignment(TQLabel::WordBreak | TQLabel::AlignVCenter); "However, full configurability is provided for your pleasure ;-)." ), hbox );
infoLayout->addWidget(label); label->setAlignment( TQLabel::WordBreak | TQLabel::AlignVCenter );
} }
TQTabWidget *tabs = new TQTabWidget(page); //FIXME after many hours I have discovered that this
// widget somehow sets the minSize of this widget to 0,0
// whenever you resize the widget. WTF?
TabWidget *tabs = new TabWidget( box );
class XineConfigEntryIterator { class XineConfigEntryIterator {
xine_t *m_xine; xine_t *m_xine;
@ -80,54 +102,56 @@ XineConfigDialog::XineConfigDialog( xine_t *xine, TQWidget *parent )
public: public:
XineConfigEntryIterator( xine_t *xine ) : m_xine( xine ) { m_valid = xine_config_get_first_entry( m_xine, &m_entry ); } XineConfigEntryIterator( xine_t *xine ) : m_xine( xine ) { m_valid = xine_config_get_first_entry( m_xine, &m_entry ); }
inline XineConfigEntryIterator &operator++() { m_valid = xine_config_get_next_entry( m_xine, &m_entry ); return *this; } inline XineConfigEntryIterator &operator++() { m_valid = xine_config_get_next_entry( m_xine, &m_entry ); return *this; }
inline xine_cfg_entry_t *operator*() { return m_valid ? &m_entry : nullptr; } inline xine_cfg_entry_t *operator*() { return m_valid ? &m_entry : 0; }
}; };
TQGridLayout *grid = nullptr;
TQString currentPageName;
TQScrollView *view = nullptr;
TQWidget *scrollWidget = nullptr;
for (XineConfigEntryIterator it(m_xine); *it; ++it) TQGridLayout *grid = 0;
TQString currentPage;
TQScrollView *view = 0;
parent = 0;
for( XineConfigEntryIterator it( m_xine ); *it; ++it )
{ {
const TQString pageName = TQString::fromUtf8((*it)->key).section('.', 0, 0); const TQString pageName = TQString::fromUtf8( (*it)->key ).section( '.', 0, 0 );
if ((TQStringList() << "ui" << "effects" << "subtitles").contains(pageName)) { if( (TQStringList() << "ui" << "effects" << "subtitles").contains( pageName ) )
continue; continue;
}
if (pageName != currentPageName) { if( pageName != currentPage ) {
currentPageName = pageName; if( view )
//NOTE won't be executed for last tab
TQString tabTitle = pageName; view->viewport()->setMinimumWidth( grid->sizeHint().width() ); // seems necessary
tabTitle[0] = tabTitle[0].upper();
TQString pageTitle = pageName;
view = new TQScrollView(page); pageTitle[0] = pageTitle[0].upper();
view->setHScrollBarMode(TQScrollView::ScrollBarMode::AlwaysOff);
// TODO: It would be nice to leave VScrollBarMode on Auto, but tabs->addTab( view = new TQScrollView, pageTitle );
// there seems to be an issue when calculating the layout size. view->setResizePolicy( TQScrollView::AutoOneFit );
// https://mirror.git.trinitydesktop.org/gitea/TDE/codeine/pulls/18 view->setHScrollBarMode( TQScrollView::AlwaysOff );
view->setVScrollBarMode(TQScrollView::ScrollBarMode::AlwaysOn); view->setFrameShape( TQFrame::NoFrame );
view->setResizePolicy(TQScrollView::AutoOneFit); view->addChild( parent = new TQWidget( view->viewport() ) );
view->setFrameShape(TQFrame::NoFrame);
tabs->addTab(view, tabTitle); TQBoxLayout *layout = new TQVBoxLayout( parent, /*margin*/METRIC_3B2, /*spacing*/0 );
scrollWidget = new TQWidget(view->viewport()); parent = new TQFrame( parent );
view->addChild(scrollWidget); static_cast<TQFrame*>(parent)->setFrameStyle( TQFrame::Panel | TQFrame::Raised );
static_cast<TQFrame*>(parent)->setLineWidth( 2 );
grid = new TQGridLayout(scrollWidget, 0, 2, marginHint(), spacingHint()); grid = new TQGridLayout( parent, /*rows*/0, /*cols*/2, /*margin*/20, /*spacing*/int(METRIC*2.5) );
grid->setColStretch(0, 3); grid->setColStretch( 0, 3 );
grid->setColStretch(1, 2); grid->setColStretch( 1, 2 );
grid->setAlignment(TQt::AlignTop | TQt::AlignAuto);
layout->addWidget( parent, 0 );
layout->addStretch( 1 );
currentPage = pageName;
} }
m_entrys.append(new XineConfigEntry(scrollWidget, grid, *it)); m_entrys.append( new XineConfigEntry( parent, grid, *it ) );
} }
// finishing touches //finishing touches
m_entrys.setAutoDelete(true); m_entrys.setAutoDelete( true );
topLayout->addWidget(tabs, 1);
enableButton( Ok, false ); enableButton( Ok, false );
enableButton( User1, false ); enableButton( User1, false );
@ -147,7 +171,7 @@ XineConfigDialog::slotHelp()
void void
XineConfigDialog::slotUser1() XineConfigDialog::slotUser1()
{ {
for (TQPtrListIterator<XineConfigEntry> it(m_entrys); *it != nullptr; ++it) for( TQPtrListIterator<XineConfigEntry> it( m_entrys ); *it != 0; ++it )
(*it)->reset(); (*it)->reset();
slotHelp(); slotHelp();
@ -156,8 +180,8 @@ XineConfigDialog::slotUser1()
bool bool
XineConfigDialog::isUnsavedSettings() const XineConfigDialog::isUnsavedSettings() const
{ {
for (TQPtrListIterator<XineConfigEntry> it(m_entrys); *it != nullptr; ++it) for( TQPtrListIterator<XineConfigEntry> it( m_entrys ); *it != 0; ++it )
if ((*it)->isChanged()) if( (*it)->isChanged() )
return true; return true;
return false; return false;
@ -178,13 +202,13 @@ XineConfigDialog::saveSettings()
///@class XineConfigEntry ///@class XineConfigEntry
XineConfigEntry::XineConfigEntry( TQWidget *parent, TQGridLayout *grid, xine_cfg_entry_t *entry ) XineConfigEntry::XineConfigEntry( TQWidget *parent, TQGridLayout *grid, xine_cfg_entry_t *entry )
: m_widget( nullptr ) : m_widget( 0 )
, m_key( entry->key ) , m_key( entry->key )
, m_string( entry->str_value ) , m_string( entry->str_value )
, m_number( entry->num_value ) , m_number( entry->num_value )
{ {
TQWidget *&w = m_widget; TQWidget *&w = m_widget;
const char *signal = nullptr; const char *signal = 0;
const int row = grid->numRows(); const int row = grid->numRows();
TQString description_text = TQString::fromUtf8( entry->description ); TQString description_text = TQString::fromUtf8( entry->description );
@ -237,7 +261,7 @@ XineConfigEntry::XineConfigEntry( TQWidget *parent, TQGridLayout *grid, xine_cfg
TQToolTip::add( w, tip ); TQToolTip::add( w, tip );
TQToolTip::add( description, tip ); TQToolTip::add( description, tip );
grid->addWidget( description, row, 0, TQt::AlignVCenter ); // grid->addWidget( description, row, 0, TQt::AlignVCenter );
grid->addWidget( w, row, 1, TQt::AlignTop ); grid->addWidget( w, row, 1, TQt::AlignTop );
} }

@ -25,20 +25,19 @@
namespace Codeine { namespace Codeine {
VideoWindow *VideoWindow::s_instance = nullptr; VideoWindow *VideoWindow::s_instance = 0;
bool VideoWindow::s_logarithmicVolume = false; bool VideoWindow::s_logarithmicVolume = false;
VideoWindow::VideoWindow( TQWidget *parent ) VideoWindow::VideoWindow( TQWidget *parent )
: TQWidget( parent, "VideoWindow" ) : TQWidget( parent, "VideoWindow" )
, m_osd( nullptr ) , m_osd( 0 )
, m_stream( nullptr ) , m_stream( 0 )
, m_eventQueue( nullptr ) , m_eventQueue( 0 )
, m_videoPort( nullptr ) , m_videoPort( 0 )
, m_audioPort( nullptr ) , m_audioPort( 0 )
, m_post( nullptr ) , m_scope( 0 )
, m_xine( nullptr ) , m_xine( 0 )
, m_scope( Analyzer::SCOPE_SIZE * 2 ) // Multiply by two to account for interleaved PCM.
, m_current_vpts( 0 ) , m_current_vpts( 0 )
{ {
DEBUG_BLOCK DEBUG_BLOCK
@ -52,6 +51,10 @@ VideoWindow::VideoWindow( TQWidget *parent )
setPaletteBackgroundColor( TQt::black ); setPaletteBackgroundColor( TQt::black );
setFocusPolicy( ClickFocus ); setFocusPolicy( ClickFocus );
//TODO sucks
//TODO namespace this?
myList->next = myList; //init the buffer list
// Detect xine version, this is used for volume adjustment. // Detect xine version, this is used for volume adjustment.
// Xine versions prior to 1.2.13 use linear volume, so the engine uses logarithmic volume. // Xine versions prior to 1.2.13 use linear volume, so the engine uses logarithmic volume.
// Xine versions starting from 1.2.13 use logarithmic volume, so the engine uses linear volume. // Xine versions starting from 1.2.13 use logarithmic volume, so the engine uses linear volume.
@ -98,7 +101,7 @@ VideoWindow::~VideoWindow()
if( m_stream ) xine_dispose( m_stream ); if( m_stream ) xine_dispose( m_stream );
if( m_audioPort ) xine_close_audio_driver( m_xine, m_audioPort ); if( m_audioPort ) xine_close_audio_driver( m_xine, m_audioPort );
if( m_videoPort ) xine_close_video_driver( m_xine, m_videoPort ); if( m_videoPort ) xine_close_video_driver( m_xine, m_videoPort );
if( m_post ) xine_post_dispose( m_xine, m_post ); if( m_scope ) xine_post_dispose( m_xine, m_scope );
if( m_xine ) xine_exit( m_xine ); if( m_xine ) xine_exit( m_xine );
cleanUpVideo(); cleanUpVideo();
@ -116,7 +119,7 @@ VideoWindow::init()
if( !m_xine ) if( !m_xine )
return false; return false;
xine_engine_set_param(m_xine, XINE_ENGINE_PARAM_VERBOSITY, XINE_VERBOSITY_DEBUG); xine_engine_set_param( m_xine, XINE_ENGINE_PARAM_VERBOSITY, 99 );
debug() << "xine_config_load()\n"; debug() << "xine_config_load()\n";
xine_config_load( m_xine, TQFile::encodeName( TQDir::homeDirPath() + "/.xine/config" ) ); xine_config_load( m_xine, TQFile::encodeName( TQDir::homeDirPath() + "/.xine/config" ) );
@ -133,7 +136,7 @@ VideoWindow::init()
m_videoPort = xine_open_video_driver( m_xine, "auto", XINE_VISUAL_TYPE_X11, videoWindow()->x11Visual() ); m_videoPort = xine_open_video_driver( m_xine, "auto", XINE_VISUAL_TYPE_X11, videoWindow()->x11Visual() );
debug() << "xine_open_audio_driver()\n"; debug() << "xine_open_audio_driver()\n";
m_audioPort = xine_open_audio_driver( m_xine, "auto", nullptr ); m_audioPort = xine_open_audio_driver( m_xine, "auto", NULL );
debug() << "xine_stream_new()\n"; debug() << "xine_stream_new()\n";
m_stream = xine_stream_new( m_xine, m_audioPort, m_videoPort ); m_stream = xine_stream_new( m_xine, m_audioPort, m_videoPort );
@ -158,9 +161,9 @@ VideoWindow::init()
debug() << "scope_plugin_new()\n"; debug() << "scope_plugin_new()\n";
#if XINE_MAJOR_VERSION > 1 || (XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION > 2) || \ #if XINE_MAJOR_VERSION > 1 || (XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION > 2) || \
(XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION == 2 && XINE_SUB_VERSION >= 10) (XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION == 2 && XINE_SUB_VERSION >= 10)
m_post = xine_post_init( m_xine, "codeine-scope", 1, &m_audioPort, nullptr ); m_scope = xine_post_init( m_xine, "codeine-scope", 1, &m_audioPort, NULL );
#else #else
m_post = scope_plugin_new( m_xine, m_audioPort ); m_scope = scope_plugin_new( m_xine, m_audioPort );
//FIXME this one seems to make seeking unstable for Codeine, perhaps //FIXME this one seems to make seeking unstable for Codeine, perhaps
xine_set_param( m_stream, XINE_PARAM_METRONOM_PREBUFFER, 6000 ); //less buffering, faster seeking.. xine_set_param( m_stream, XINE_PARAM_METRONOM_PREBUFFER, 6000 ); //less buffering, faster seeking..
@ -276,11 +279,11 @@ VideoWindow::load( const KURL &url )
// ensure old buffers are deleted // ensure old buffers are deleted
// FIXME leaves one erroneous buffer // FIXME leaves one erroneous buffer
timerEvent( nullptr ); timerEvent( 0 );
if( m_post ) { if( m_scope ) {
xine_post_out_t *source = xine_get_audio_source( m_stream ); xine_post_out_t *source = xine_get_audio_source( m_stream );
xine_post_in_t *target = (xine_post_in_t*)xine_post_input( m_post, const_cast<char*>("audio in") ); xine_post_in_t *target = (xine_post_in_t*)xine_post_input( m_scope, const_cast<char*>("audio in") );
xine_post_wire( source, target ); xine_post_wire( source, target );
} }
@ -370,8 +373,6 @@ VideoWindow::stop()
{ {
xine_stop( m_stream ); xine_stop( m_stream );
std::fill(m_scope.begin(), m_scope.end(), 0);
announceStateChange(); announceStateChange();
} }
@ -455,12 +456,6 @@ VideoWindow::posTimeLength( PosTimeLength type ) const
return 0; //--warning return 0; //--warning
} }
bool
VideoWindow::isMuted() const
{
return xine_get_param(m_stream, XINE_PARAM_AUDIO_AMP_MUTE);
}
uint uint
VideoWindow::volume() const VideoWindow::volume() const
{ {
@ -523,6 +518,12 @@ VideoWindow::seek( uint pos )
return; return;
} }
//TODO depend on a version that CAN seek in flacs!
if( m_url.path().endsWith( ".flac", false ) ) {
emit statusMessage( i18n("xine cannot currently seek in flac media") );
return;
}
//better feedback //better feedback
//NOTE doesn't work! I can't tell why.. //NOTE doesn't work! I can't tell why..
Slider::instance()->TQSlider::setValue( pos ); Slider::instance()->TQSlider::setValue( pos );
@ -578,18 +579,18 @@ VideoWindow::setStreamParameter( int value )
parameter = XINE_PARAM_VO_CONTRAST; parameter = XINE_PARAM_VO_CONTRAST;
else if( sender == "brightness" ) else if( sender == "brightness" )
parameter = XINE_PARAM_VO_BRIGHTNESS; parameter = XINE_PARAM_VO_BRIGHTNESS;
else if( sender == "subtitle_channels_select" ) else if( sender == "subtitle_channels_menu" )
parameter = XINE_PARAM_SPU_CHANNEL, parameter = XINE_PARAM_SPU_CHANNEL,
value -= 2; value -= 2;
else if( sender == "audio_channels_select" ) else if( sender == "audio_channels_menu" )
parameter = XINE_PARAM_AUDIO_CHANNEL_LOGICAL, parameter = XINE_PARAM_AUDIO_CHANNEL_LOGICAL,
value -= 2; value -= 2;
else if( sender == "aspect_ratio_select" ) else if( sender == "aspect_ratio_menu" )
parameter = XINE_PARAM_VO_ASPECT_RATIO; parameter = XINE_PARAM_VO_ASPECT_RATIO;
else if( sender == "volume" ) else if( sender == "volume" )
{ {
parameter = XINE_PARAM_AUDIO_AMP_LEVEL; parameter = XINE_PARAM_AUDIO_AMP_LEVEL;
value = 100 - value; // TQt sliders are the wrong way round when vertical value = 100 - value; // TQt sliders are wrong way round when vertical
if (s_logarithmicVolume) if (s_logarithmicVolume)
{ {
value = makeVolumeLogarithmic(value); value = makeVolumeLogarithmic(value);
@ -601,38 +602,23 @@ VideoWindow::setStreamParameter( int value )
xine_set_param( m_stream, parameter, value ); xine_set_param( m_stream, parameter, value );
} }
void
VideoWindow::setMuted(bool mute)
{
xine_set_param(m_stream, XINE_PARAM_AUDIO_AMP_MUTE, mute);
}
const Engine::Scope& const Engine::Scope&
VideoWindow::scope() VideoWindow::scope()
{ {
using Analyzer::SCOPE_SIZE; using Analyzer::SCOPE_SIZE;
if (!m_post || !m_stream || xine_get_status(m_stream) != XINE_STATUS_PLAY) static Engine::Scope scope( SCOPE_SIZE );
{
return m_scope;
}
MyNode *const myList = scope_plugin_list(m_post); if( xine_get_status( m_stream ) != XINE_STATUS_PLAY )
const int64_t pts_per_smpls = scope_plugin_pts_per_smpls(m_post); return scope;
const int channels = scope_plugin_channels(m_post);
int scopeIdx = 0;
if (channels > 2)
{
return m_scope;
}
//prune the buffer list and update the m_current_vpts timestamp //prune the buffer list and update the m_current_vpts timestamp
timerEvent( nullptr ); timerEvent( 0 );
for (int n, frame = 0; frame < SCOPE_SIZE; /* no-op */) const int64_t pts_per_smpls = 0; //scope_plugin_pts_per_smpls( m_scope );
for( int channels = xine_get_stream_info( m_stream, XINE_STREAM_INFO_AUDIO_CHANNELS ), frame = 0; frame < SCOPE_SIZE; )
{ {
MyNode *best_node = nullptr; MyNode *best_node = 0;
for( MyNode *node = myList->next; node != myList; node = node->next ) for( MyNode *node = myList->next; node != myList; node = node->next )
if( node->vpts <= m_current_vpts && (!best_node || node->vpts > best_node->vpts) ) if( node->vpts <= m_current_vpts && (!best_node || node->vpts > best_node->vpts) )
@ -651,10 +637,10 @@ VideoWindow::scope()
data16 = best_node->mem; data16 = best_node->mem;
data16 += diff; data16 += diff;
diff += diff % channels; // important correction to ensure we don't overflow the buffer. diff += diff % channels; //important correction to ensure we don't overflow the buffer
diff /= channels; // use units of frames, not samples. diff /= channels;
// calculate the number of available samples in this buffer. int
n = best_node->num_frames; n = best_node->num_frames;
n -= diff; n -= diff;
n += frame; //clipping for # of frames we need n += frame; //clipping for # of frames we need
@ -664,52 +650,33 @@ VideoWindow::scope()
for( int a, c; frame < n; ++frame, data16 += channels ) { for( int a, c; frame < n; ++frame, data16 += channels ) {
for( a = c = 0; c < channels; ++c ) for( a = c = 0; c < channels; ++c )
{ a += data16[c];
// now we give interleaved PCM to the scope.
m_scope[scopeIdx++] = data16[c]; a /= channels;
if (channels == 1) scope[frame] = a;
{
// Duplicate mono samples.
m_scope[scopeIdx++] = data16[c];
}
}
} }
m_current_vpts = best_node->vpts_end; m_current_vpts = best_node->vpts_end;
m_current_vpts++; //FIXME needs to be done for some reason, or you get situations where it uses same buffer again and again m_current_vpts++; //FIXME needs to be done for some reason, or you get situations where it uses same buffer again and again
} }
return m_scope; return scope;
} }
void void
VideoWindow::timerEvent( TQTimerEvent* ) VideoWindow::timerEvent( TQTimerEvent* )
{ {
if (!m_stream)
{
return;
}
/// here we prune the buffer list regularly /// here we prune the buffer list regularly
MyNode *myList = scope_plugin_list(m_post); MyNode * const first_node = myList->next;
MyNode const * const list_end = myList;
if (!myList)
{
return;
}
// We operate on a subset of the list for thread-safety.
MyNode *const firstNode = myList->next;
const MyNode *const listEnd = myList;
// If we're not playing or paused, empty the list.
m_current_vpts = (xine_get_status( m_stream ) == XINE_STATUS_PLAY) m_current_vpts = (xine_get_status( m_stream ) == XINE_STATUS_PLAY)
? xine_get_current_vpts( m_stream ) ? xine_get_current_vpts( m_stream )
: std::numeric_limits<int64_t>::max(); : std::numeric_limits<int64_t>::max();
for( MyNode *prev = firstNode, *node = firstNode->next; node != listEnd; node = node->next ) for( MyNode *prev = first_node, *node = first_node->next; node != list_end; node = node->next )
{ {
// we never delete firstNode // we never delete first_node
// this maintains thread-safety // this maintains thread-safety
if( node->vpts_end < m_current_vpts ) { if( node->vpts_end < m_current_vpts ) {
prev->next = node->next; prev->next = node->next;
@ -742,19 +709,19 @@ VideoWindow::customEvent( TQCustomEvent *e )
char s[128]; //apparently sufficient char s[128]; //apparently sufficient
{ {
TQStringList languages; TQStringList languages( "subtitle_channels_menu" );
int channels = xine_get_stream_info( m_stream, XINE_STREAM_INFO_MAX_SPU_CHANNEL ); int channels = xine_get_stream_info( m_stream, XINE_STREAM_INFO_MAX_SPU_CHANNEL );
for( int j = 0; j < channels; j++ ) for( int j = 0; j < channels; j++ )
languages += xine_get_spu_lang( m_stream, j, s ) ? s : i18n("Channel %1").arg( j+1 ); languages += xine_get_spu_lang( m_stream, j, s ) ? s : i18n("Channel %1").arg( j+1 );
emit subtitleChannelsChanged(languages); emit channelsChanged( languages );
} }
{ {
TQStringList languages; TQStringList languages( "audio_channels_menu" );
int channels = xine_get_stream_info( m_stream, XINE_STREAM_INFO_MAX_AUDIO_CHANNEL ); int channels = xine_get_stream_info( m_stream, XINE_STREAM_INFO_MAX_AUDIO_CHANNEL );
for( int j = 0; j < channels; j++ ) for( int j = 0; j < channels; j++ )
languages += xine_get_audio_lang( m_stream, j, s ) ? s : i18n("Channel %1").arg( j+1 ); languages += xine_get_audio_lang( m_stream, j, s ) ? s : i18n("Channel %1").arg( j+1 );
emit audioChannelsChanged(languages); emit channelsChanged( languages );
} }
break; break;
} }
@ -913,7 +880,7 @@ VideoWindow::toggleDVDMenu()
{ {
xine_event_t e; xine_event_t e;
e.type = XINE_EVENT_INPUT_MENU1; e.type = XINE_EVENT_INPUT_MENU1;
e.data = nullptr; e.data = NULL;
e.data_length = 0; e.data_length = 0;
xine_event_send( m_stream, &e ); xine_event_send( m_stream, &e );
@ -935,37 +902,13 @@ VideoWindow::fileFilter() const
{ {
char *supportedExtensions = xine_get_file_extensions( m_xine ); char *supportedExtensions = xine_get_file_extensions( m_xine );
TQString filter("*."); TQString filter( "*." );
filter.append(supportedExtensions); filter.append( supportedExtensions );
filter.remove( "txt" );
// Remove protocols filter.remove( "png" );
filter.remove(" dvb://"); filter.replace( ' ', " *." );
filter.remove(" dvbc://");
filter.remove(" dvbs://"); std::free( supportedExtensions );
filter.remove(" dvbt://");
filter.remove(" vcd:/");
filter.remove(" vdr:/");
filter.remove(" netvdr:/");
filter.remove(" dvd:/");
filter.remove(" pvr:/");
filter.remove(" slave://");
filter.remove(" cdda:/");
// Remove image files
filter.remove(" bmp");
filter.remove(" gif");
filter.remove(" jpg");
filter.remove(" jpeg");
filter.remove(" png");
// Remove misc. files
filter.remove(" txt");
// Remove spaces (prevent multiple *.)
filter.replace(" ", " ");
filter.replace(' ', " *.");
std::free(supportedExtensions);
return filter; return filter;
} }

@ -62,7 +62,6 @@ namespace Codeine
uint time() const { return posTimeLength( Time ); } uint time() const { return posTimeLength( Time ); }
uint length() const { return posTimeLength( Length ); } uint length() const { return posTimeLength( Length ); }
bool isMuted() const;
uint volume() const; uint volume() const;
const Engine::Scope &scope(); const Engine::Scope &scope();
@ -79,14 +78,12 @@ namespace Codeine
///special slot, see implementation to facilitate understanding ///special slot, see implementation to facilitate understanding
void setStreamParameter( int ); void setStreamParameter( int );
void setMuted(bool);
signals: signals:
void stateChanged( Engine::State ); void stateChanged( Engine::State );
void statusMessage( const TQString& ); void statusMessage( const TQString& );
void titleChanged( const TQString& ); void titleChanged( const TQString& );
void audioChannelsChanged( const TQStringList &); void channelsChanged( const TQStringList& );
void subtitleChannelsChanged( const TQStringList &);
private: private:
static void xineEventListener( void*, const xine_event_t* ); static void xineEventListener( void*, const xine_event_t* );
@ -106,10 +103,9 @@ namespace Codeine
xine_event_queue_t *m_eventQueue; xine_event_queue_t *m_eventQueue;
xine_video_port_t *m_videoPort; xine_video_port_t *m_videoPort;
xine_audio_port_t *m_audioPort; xine_audio_port_t *m_audioPort;
xine_post_t *m_post; xine_post_t *m_scope;
xine_t *m_xine; xine_t *m_xine;
Engine::Scope m_scope;
int64_t m_current_vpts; int64_t m_current_vpts;
KURL m_url; KURL m_url;
@ -140,6 +136,8 @@ namespace Codeine
void becomePreferredSize(); void becomePreferredSize();
TQImage captureFrame() const; TQImage captureFrame() const;
enum { ExposeEvent = 3000 };
public slots: public slots:
void resetZoom(); void resetZoom();

@ -4,38 +4,16 @@
/* need access to port_ticket */ /* need access to port_ticket */
#define XINE_ENGINE_INTERNAL #define XINE_ENGINE_INTERNAL
#define LOG_MODULE "codine-scope"
#define LOG_LEVEL LOG_LEVEL_DEBUG
// #define LOG
#include "xineScope.h" #include "xineScope.h"
#include <xine/post.h> #include <xine/post.h>
#include <xine/xine_internal.h> #include <xine/xine_internal.h>
typedef struct scope_plugin_s {
post_plugin_t super;
int channels;
int64_t pts_per_smpls;
MyNode *list;
} scope_plugin_t;
int scope_plugin_channels(void *post) static MyNode theList;
{ static int myChannels = 0;
scope_plugin_t *self = post; static int64_t pts_per_smpls;
return self->channels;
}
MyNode *scope_plugin_list(void *post) MyNode* const myList = &theList;
{
scope_plugin_t *self = post;
return self->list;
}
int64_t scope_plugin_pts_per_smpls(void *post)
{
scope_plugin_t *self = post;
return self->pts_per_smpls;
}
/************************* /*************************
* post plugin functions * * post plugin functions *
@ -44,10 +22,7 @@ int64_t scope_plugin_pts_per_smpls(void *post)
static int static int
scope_port_open( xine_audio_port_t *port_gen, xine_stream_t *stream, uint32_t bits, uint32_t rate, int mode ) scope_port_open( xine_audio_port_t *port_gen, xine_stream_t *stream, uint32_t bits, uint32_t rate, int mode )
{ {
lprintf("scope_port_open()\n");
post_audio_port_t *port = (post_audio_port_t *)port_gen; post_audio_port_t *port = (post_audio_port_t *)port_gen;
scope_plugin_t *self = (scope_plugin_t *)port->post;
_x_post_rewire( (post_plugin_t*)port->post ); _x_post_rewire( (post_plugin_t*)port->post );
_x_post_inc_usage( port ); _x_post_inc_usage( port );
@ -57,14 +32,14 @@ scope_port_open( xine_audio_port_t *port_gen, xine_stream_t *stream, uint32_t bi
port->rate = rate; port->rate = rate;
port->mode = mode; port->mode = mode;
self->channels = _x_ao_mode2channels(mode); myChannels = _x_ao_mode2channels( mode );
int ret = port->original_port->open( port->original_port, stream, bits, rate, mode ); int ret = port->original_port->open( port->original_port, stream, bits, rate, mode );
#if XINE_MAJOR_VERSION > 1 || (XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION > 2) || \ #if XINE_MAJOR_VERSION > 1 || (XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION > 2) || \
(XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION == 2 && XINE_SUB_VERSION >= 10) (XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION == 2 && XINE_SUB_VERSION >= 10)
self->pts_per_smpls = ((uint32_t)90000 * (uint32_t)32768) / rate; pts_per_smpls = ((uint32_t)90000 * (uint32_t)32768) / rate;
#else #else
self->pts_per_smpls = stream->metronom->pts_per_smpls; pts_per_smpls = stream->metronom->pts_per_smpls;
#endif #endif
return ret; return ret;
} }
@ -72,17 +47,7 @@ scope_port_open( xine_audio_port_t *port_gen, xine_stream_t *stream, uint32_t bi
static void static void
scope_port_close( xine_audio_port_t *port_gen, xine_stream_t *stream ) scope_port_close( xine_audio_port_t *port_gen, xine_stream_t *stream )
{ {
lprintf("scope_port_close()\n");
post_audio_port_t *port = (post_audio_port_t *)port_gen; post_audio_port_t *port = (post_audio_port_t *)port_gen;
scope_plugin_t *self = (scope_plugin_t *)port->post;
/* ensure the buffers are deleted during the next VideoWindow::timerEvent */
MyNode *node;
for (node = self->list->next; node != self->list; node = node->next)
{
node->vpts = node->vpts_end - 1;
}
port->stream = NULL; port->stream = NULL;
port->original_port->close( port->original_port, stream ); port->original_port->close( port->original_port, stream );
@ -94,7 +59,6 @@ static void
scope_port_put_buffer( xine_audio_port_t *port_gen, audio_buffer_t *buf, xine_stream_t *stream ) scope_port_put_buffer( xine_audio_port_t *port_gen, audio_buffer_t *buf, xine_stream_t *stream )
{ {
post_audio_port_t *port = (post_audio_port_t *)port_gen; post_audio_port_t *port = (post_audio_port_t *)port_gen;
scope_plugin_t *self = (scope_plugin_t *)port->post;
/* we are too simple to handle 8bit */ /* we are too simple to handle 8bit */
/* what does it mean when stream == NULL? */ /* what does it mean when stream == NULL? */
@ -102,7 +66,7 @@ scope_port_put_buffer( xine_audio_port_t *port_gen, audio_buffer_t *buf, xine_st
port->original_port->put_buffer( port->original_port, buf, stream ); return; } port->original_port->put_buffer( port->original_port, buf, stream ); return; }
MyNode *new_node; MyNode *new_node;
const int num_samples = buf->num_frames * self->channels; const int num_samples = buf->num_frames * myChannels;
new_node = malloc( sizeof(MyNode) ); new_node = malloc( sizeof(MyNode) );
#ifdef METRONOM_VPTS #ifdef METRONOM_VPTS
@ -116,7 +80,7 @@ scope_port_put_buffer( xine_audio_port_t *port_gen, audio_buffer_t *buf, xine_st
{ {
int64_t int64_t
K = self->pts_per_smpls; /*smpls = 1<<16 samples*/ K = pts_per_smpls; /*smpls = 1<<16 samples*/
K *= num_samples; K *= num_samples;
K /= (1<<16); K /= (1<<16);
K += new_node->vpts; K += new_node->vpts;
@ -129,29 +93,14 @@ scope_port_put_buffer( xine_audio_port_t *port_gen, audio_buffer_t *buf, xine_st
/* finally we should append the current buffer to the list /* finally we should append the current buffer to the list
* NOTE this is thread-safe due to the way we handle the list in the GUI thread */ * NOTE this is thread-safe due to the way we handle the list in the GUI thread */
new_node->next = self->list->next; new_node->next = myList->next;
self->list->next = new_node; myList->next = new_node;
} }
static void static void
scope_dispose( post_plugin_t *this ) scope_dispose( post_plugin_t *this )
{ {
MyNode *list = ((scope_plugin_t *)this)->list; free( this );
MyNode *prev;
MyNode *node = list;
/* Free all elements of the list (a ring buffer) */
do
{
prev = node->next;
free(node->mem);
free(node);
node = prev;
} while(node != list);
free(this);
} }
@ -169,15 +118,15 @@ xine_post_t* scope_plugin_new( xine_t *xine, xine_audio_port_t *audio_target )
if( audio_target == NULL ) if( audio_target == NULL )
return NULL; return NULL;
scope_plugin_t *scope_plugin = calloc(1, sizeof(scope_plugin_t)); post_plugin_t *post_plugin = calloc( 1, sizeof(post_plugin_t) );
post_plugin_t *post_plugin = (post_plugin_t *)scope_plugin;
{ {
post_plugin_t *this = post_plugin;
post_in_t *input; post_in_t *input;
post_out_t *output; post_out_t *output;
post_audio_port_t *port; post_audio_port_t *port;
_x_post_init(post_plugin, 1, 0); _x_post_init( this, 1, 0 );
#if XINE_MAJOR_VERSION > 1 || (XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION > 2) || \ #if XINE_MAJOR_VERSION > 1 || (XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION > 2) || \
(XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION == 2 && XINE_SUB_VERSION >= 10) (XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION == 2 && XINE_SUB_VERSION >= 10)
@ -189,10 +138,10 @@ xine_post_t* scope_plugin_new( xine_t *xine, xine_audio_port_t *audio_target )
port->new_port.close = scope_port_close; port->new_port.close = scope_port_close;
port->new_port.put_buffer = scope_port_put_buffer; port->new_port.put_buffer = scope_port_put_buffer;
post_plugin->xine_post.audio_input[0] = &port->new_port; this->xine_post.audio_input[0] = &port->new_port;
post_plugin->xine_post.type = PLUGIN_POST; this->xine_post.type = PLUGIN_POST;
post_plugin->dispose = scope_dispose; this->dispose = scope_dispose;
} }
#if XINE_MAJOR_VERSION < 1 || (XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION < 2) || \ #if XINE_MAJOR_VERSION < 1 || (XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION < 2) || \
@ -204,12 +153,6 @@ xine_post_t* scope_plugin_new( xine_t *xine, xine_audio_port_t *audio_target )
post_plugin->xine = xine; post_plugin->xine = xine;
#endif #endif
/* scope_plugin_t init */
scope_plugin->channels = 0;
scope_plugin->pts_per_smpls = 0;
scope_plugin->list = calloc(1, sizeof(MyNode));
scope_plugin->list->next = scope_plugin->list;
#if XINE_MAJOR_VERSION > 1 || (XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION > 2) || \ #if XINE_MAJOR_VERSION > 1 || (XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION > 2) || \
(XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION == 2 && XINE_SUB_VERSION >= 10) (XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION == 2 && XINE_SUB_VERSION >= 10)
return post_plugin; return post_plugin;
@ -218,6 +161,11 @@ xine_post_t* scope_plugin_new( xine_t *xine, xine_audio_port_t *audio_target )
#endif #endif
} }
int64_t scope_plugin_pts_per_smpls( void *post )
{
return pts_per_smpls;
}
#if XINE_MAJOR_VERSION > 1 || (XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION > 2) || \ #if XINE_MAJOR_VERSION > 1 || (XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION > 2) || \
(XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION == 2 && XINE_SUB_VERSION >= 10) (XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION == 2 && XINE_SUB_VERSION >= 10)
static void *scope_init_plugin(xine_t *xine, const void *data) static void *scope_init_plugin(xine_t *xine, const void *data)

@ -33,23 +33,18 @@ struct my_node_s
int64_t vpts_end; int64_t vpts_end;
}; };
extern MyNode* const myList;
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
{ {
#endif
#if XINE_MAJOR_VERSION > 1 || (XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION > 2) || \ #if XINE_MAJOR_VERSION > 1 || (XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION > 2) || \
(XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION == 2 && XINE_SUB_VERSION >= 10) (XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION == 2 && XINE_SUB_VERSION >= 10)
extern const plugin_info_t scope_plugin_info[]; extern const plugin_info_t scope_plugin_info[];
#else #else
xine_post_t* scope_plugin_new( xine_t*, xine_audio_port_t* ); xine_post_t* scope_plugin_new( xine_t*, xine_audio_port_t* );
#endif #endif
int64_t scope_plugin_pts_per_smpls( void* );
int scope_plugin_channels(void *);
MyNode *scope_plugin_list(void *);
int64_t scope_plugin_pts_per_smpls(void *);
#ifdef __cplusplus
} }
#endif #endif

@ -164,7 +164,7 @@ namespace Debug
Block( const char *label ) Block( const char *label )
: m_label( label ) : m_label( label )
{ {
gettimeofday( &m_start, nullptr ); gettimeofday( &m_start, 0 );
kdDebug() << indent() << "BEGIN: " << label << "\n"; kdDebug() << indent() << "BEGIN: " << label << "\n";
DEBUG_INDENT DEBUG_INDENT
@ -173,7 +173,7 @@ namespace Debug
~Block() ~Block()
{ {
timeval end; timeval end;
gettimeofday( &end, nullptr ); gettimeofday( &end, 0 );
end.tv_sec -= m_start.tv_sec; end.tv_sec -= m_start.tv_sec;
if( end.tv_usec < m_start.tv_usec) { if( end.tv_usec < m_start.tv_usec) {

@ -18,7 +18,7 @@
namespace Codeine { namespace Codeine {
VideoWindow *VideoWindow::s_instance = nullptr; VideoWindow *VideoWindow::s_instance = 0;
namespace X namespace X
@ -30,12 +30,12 @@ namespace X
VideoWindow::VideoWindow( TQWidget *parent, const char *name ) VideoWindow::VideoWindow( TQWidget *parent, const char *name )
: TQWidget( parent, name ) : TQWidget( parent, name )
, m_osd( nullptr ) , m_osd( 0 )
, m_stream( nullptr ) , m_stream( 0 )
, m_eventQueue( nullptr ) , m_eventQueue( 0 )
, m_videoPort( nullptr ) , m_videoPort( 0 )
, m_audioPort( nullptr ) , m_audioPort( 0 )
, m_xine( nullptr ) , m_xine( 0 )
, m_displayRatio( 1 ) , m_displayRatio( 1 )
{ {
s_instance = this; s_instance = this;

@ -37,7 +37,7 @@ VideoWindow::init()
m_videoPort = xine_open_video_driver( m_xine, "auto", XINE_VISUAL_TYPE_X11, x11Visual() ); m_videoPort = xine_open_video_driver( m_xine, "auto", XINE_VISUAL_TYPE_X11, x11Visual() );
debug() << "xine_open_audio_driver()\n"; debug() << "xine_open_audio_driver()\n";
m_audioPort = xine_open_audio_driver( m_xine, "auto", nullptr ); m_audioPort = xine_open_audio_driver( m_xine, "auto", NULL );
debug() << "xine_stream_new()\n"; debug() << "xine_stream_new()\n";
m_stream = xine_stream_new( m_xine, m_audioPort, m_videoPort ); m_stream = xine_stream_new( m_xine, m_audioPort, m_videoPort );

@ -1,14 +1,13 @@
# SOME DESCRIPTIVE TITLE. # SOME DESCRIPTIVE TITLE.
# This file is put in the public domain. # This file is put in the public domain.
# Eduardo Herrera <edhu21@gmail.com>, 2023. # Eduardo Herrera <edhu21@gmail.com>, 2023.
# Juan M Ayala <linux.zero@yahoo.com>, 2025.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-06-28 16:45+0200\n" "POT-Creation-Date: 2020-06-28 16:45+0200\n"
"PO-Revision-Date: 2025-01-20 18:16+0000\n" "PO-Revision-Date: 2023-03-21 23:14+0000\n"
"Last-Translator: Juan M Ayala <linux.zero@yahoo.com>\n" "Last-Translator: Eduardo Herrera <edhu21@gmail.com>\n"
"Language-Team: Spanish <https://mirror.git.trinitydesktop.org/weblate/" "Language-Team: Spanish <https://mirror.git.trinitydesktop.org/weblate/"
"projects/applications/codeine-desktop-files/es/>\n" "projects/applications/codeine-desktop-files/es/>\n"
"Language: es\n" "Language: es\n"
@ -16,12 +15,12 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.17\n" "X-Generator: Weblate 4.16.1\n"
#. Name #. Name
#: codeine.desktop:3 codeine_part.desktop:3 #: codeine.desktop:3 codeine_part.desktop:3
msgid "Codeine" msgid "Codeine"
msgstr "Codeine" msgstr ""
#. GenericName #. GenericName
#: codeine.desktop:5 #: codeine.desktop:5
@ -37,7 +36,7 @@ msgstr ""
#. Comment #. Comment
#: codeine_part.desktop:5 #: codeine_part.desktop:5
msgid "Embeddable Video Player" msgid "Embeddable Video Player"
msgstr "Reproductor de Vídeo Integrable" msgstr ""
#. Name #. Name
#: codeine_play_dvd.desktop:8 #: codeine_play_dvd.desktop:8

@ -1,45 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# This file is put in the public domain.
# Temuri Doghonadze <rkavt@smartprojects.ge>, 2024.
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-06-28 16:45+0200\n"
"PO-Revision-Date: 2024-11-06 18:11+0000\n"
"Last-Translator: Temuri Doghonadze <rkavt@smartprojects.ge>\n"
"Language-Team: Georgian <https://mirror.git.trinitydesktop.org/weblate/"
"projects/applications/codeine-desktop-files/ka/>\n"
"Language: ka\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.17\n"
#. Name
#: codeine.desktop:3 codeine_part.desktop:3
msgid "Codeine"
msgstr "Codeine"
#. GenericName
#: codeine.desktop:5
msgid "Media Player"
msgstr "მედიადამკვრელი"
#. Comment
#: codeine.desktop:7
msgid "Video player for TDE designed to be as simple as possible"
msgstr ""
"ვიდეოდამკვრელი TDE-სთვის, რომელიც შეიქმნა, რომ ისეთი მარტივი ყოფილიყო, "
"როგორც ეს შესაძლებელია"
#. Comment
#: codeine_part.desktop:5
msgid "Embeddable Video Player"
msgstr "ჩაშენებადი ვიდეოდამკვრელი"
#. Name
#: codeine_play_dvd.desktop:8
msgid "Play DVD with Codeine"
msgstr "DVD-ის დაკვრა Codenie-ით"

@ -1,26 +1,25 @@
# SOME DESCRIPTIVE TITLE. # SOME DESCRIPTIVE TITLE.
# This file is put in the public domain. # This file is put in the public domain.
# Toad114514 <xiaolan2332021@163.com>, 2025. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-06-28 16:45+0200\n" "POT-Creation-Date: 2020-06-28 16:45+0200\n"
"PO-Revision-Date: 2025-01-28 07:12+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Toad114514 <xiaolan2332021@163.com>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Chinese (Simplified) <https://mirror.git.trinitydesktop.org/" "Language-Team: LANGUAGE <LL@li.org>\n"
"weblate/projects/applications/codeine-desktop-files/zh_Hans/>\n"
"Language: zh_CN\n" "Language: zh_CN\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.17\n"
#. Name #. Name
#: codeine.desktop:3 codeine_part.desktop:3 #: codeine.desktop:3 codeine_part.desktop:3
msgid "Codeine" msgid "Codeine"
msgstr "Codeine" msgstr ""
#. GenericName #. GenericName
#: codeine.desktop:5 #: codeine.desktop:5
@ -30,12 +29,12 @@ msgstr "媒体播放器"
#. Comment #. Comment
#: codeine.desktop:7 #: codeine.desktop:7
msgid "Video player for TDE designed to be as simple as possible" msgid "Video player for TDE designed to be as simple as possible"
msgstr "尽可能设计得简单的 TDE 视频播放器" msgstr ""
#. Comment #. Comment
#: codeine_part.desktop:5 #: codeine_part.desktop:5
msgid "Embeddable Video Player" msgid "Embeddable Video Player"
msgstr "内嵌视频播放器" msgstr ""
#. Name #. Name
#: codeine_play_dvd.desktop:8 #: codeine_play_dvd.desktop:8

@ -5,7 +5,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2025-05-11 18:19+0000\n" "POT-Creation-Date: 2023-10-09 20:16+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -44,30 +44,26 @@ msgstr ""
msgid "<b>Adjust video scale?" msgid "<b>Adjust video scale?"
msgstr "" msgstr ""
#: app/audioView.cpp:48 app/mainWindow.cpp:332 #: app/captureFrame.cpp:82
msgid "Show Analyzer"
msgstr ""
#: app/captureFrame.cpp:92
#, c-format #, c-format
msgid "Capture - %1" msgid "Capture - %1"
msgstr "" msgstr ""
#: app/captureFrame.cpp:108 #: app/captureFrame.cpp:98
msgid "" msgid ""
"*.png|PNG Format\n" "*.png|PNG Format\n"
"*.jpeg|JPEG Format" "*.jpeg|JPEG Format"
msgstr "" msgstr ""
#: app/captureFrame.cpp:110 #: app/captureFrame.cpp:100
msgid "Save Frame" msgid "Save Frame"
msgstr "" msgstr ""
#: app/captureFrame.cpp:121 #: app/captureFrame.cpp:111
msgid "%1 saved successfully" msgid "%1 saved successfully"
msgstr "" msgstr ""
#: app/captureFrame.cpp:123 #: app/captureFrame.cpp:113
#, c-format #, c-format
msgid "Sorry, could not save %1" msgid "Sorry, could not save %1"
msgstr "" msgstr ""
@ -84,19 +80,19 @@ msgstr ""
msgid "Determine &Automatically" msgid "Determine &Automatically"
msgstr "" msgstr ""
#: app/insertAspectRatioMenuItems.cpp:17 #: app/insertAspectRatioMenuItems.cpp:18
msgid "&Square (1:1)" msgid "&Square (1:1)"
msgstr "" msgstr ""
#: app/insertAspectRatioMenuItems.cpp:18 #: app/insertAspectRatioMenuItems.cpp:19
msgid "&4:3" msgid "&4:3"
msgstr "" msgstr ""
#: app/insertAspectRatioMenuItems.cpp:19 #: app/insertAspectRatioMenuItems.cpp:20
msgid "Ana&morphic (16:9)" msgid "Ana&morphic (16:9)"
msgstr "" msgstr ""
#: app/insertAspectRatioMenuItems.cpp:20 #: app/insertAspectRatioMenuItems.cpp:21
msgid "&DVB (2.11:1)" msgid "&DVB (2.11:1)"
msgstr "" msgstr ""
@ -136,83 +132,79 @@ msgstr ""
msgid "Patches, advice and moral support" msgid "Patches, advice and moral support"
msgstr "" msgstr ""
#: app/mainWindow.cpp:143 #: app/mainWindow.cpp:131
msgid "Aspect Ratio" msgid "&Subtitles"
msgstr "" msgstr ""
#: app/mainWindow.cpp:149 #: app/mainWindow.cpp:132
msgid "Audio Channels" msgid "A&udio Channels"
msgstr "" msgstr ""
#: app/mainWindow.cpp:155 #: app/mainWindow.cpp:133
msgid "Subtitles" msgid "Aspect &Ratio"
msgstr "" msgstr ""
#: app/mainWindow.cpp:277 #: app/mainWindow.cpp:250
msgid "Play &Media..." msgid "Play &Media..."
msgstr "" msgstr ""
#: app/mainWindow.cpp:283 #: app/mainWindow.cpp:256
msgid "Record" msgid "Record"
msgstr "" msgstr ""
#: app/mainWindow.cpp:285 #: app/mainWindow.cpp:258
msgid "Reset Video Scale" msgid "Reset Video Scale"
msgstr "" msgstr ""
#: app/mainWindow.cpp:286 app/mainWindow.cpp:650 #: app/mainWindow.cpp:259 app/mainWindow.cpp:592
msgid "Media Information" msgid "Media Information"
msgstr "" msgstr ""
#: app/mainWindow.cpp:287 #: app/mainWindow.cpp:260
msgid "Menu Toggle" msgid "Menu Toggle"
msgstr "" msgstr ""
#: app/mainWindow.cpp:288 #: app/mainWindow.cpp:261
msgid "&Capture Frame" msgid "&Capture Frame"
msgstr "" msgstr ""
#: app/mainWindow.cpp:290 #: app/mainWindow.cpp:263
msgid "Video Settings..." msgid "Video Settings..."
msgstr "" msgstr ""
#: app/mainWindow.cpp:291 #: app/mainWindow.cpp:264
msgid "Configure xine..." msgid "Configure xine..."
msgstr "" msgstr ""
#: app/mainWindow.cpp:293 #: app/mainWindow.cpp:266
msgid "Position Slider" msgid "Position Slider"
msgstr "" msgstr ""
#: app/mainWindow.cpp:295 #: app/mainWindow.cpp:364
msgid "A&udio Channels"
msgstr ""
#: app/mainWindow.cpp:298
msgid "&Subtitles"
msgstr ""
#: app/mainWindow.cpp:301
msgid "Aspect &Ratio"
msgstr ""
#: app/mainWindow.cpp:425
msgid "Codeine was asked to open an empty URL; it cannot." msgid "Codeine was asked to open an empty URL; it cannot."
msgstr "" msgstr ""
#: app/mainWindow.cpp:487 #: app/mainWindow.cpp:426
msgid "Supported Media Formats" msgid "Supported Media Formats"
msgstr "" msgstr ""
#: app/mainWindow.cpp:487 #: app/mainWindow.cpp:426
msgid "All Files" msgid "All Files"
msgstr "" msgstr ""
#: app/mainWindow.cpp:488 #: app/mainWindow.cpp:427
msgid "Select A File To Play" msgid "Select A File To Play"
msgstr "" msgstr ""
#: app/mainWindow.cpp:714 #: app/mainWindow.cpp:607
msgid "&Determine Automatically"
msgstr ""
#: app/mainWindow.cpp:619
msgid "&Off"
msgstr ""
#: app/mainWindow.cpp:661
msgid "Sorry, no media was found in the drop" msgid "Sorry, no media was found in the drop"
msgstr "" msgstr ""
@ -259,19 +251,19 @@ msgstr ""
msgid "Codeine could not open the file: %1" msgid "Codeine could not open the file: %1"
msgstr "" msgstr ""
#: app/stateChange.cpp:92 #: app/stateChange.cpp:89
msgid "&Pause" msgid "&Pause"
msgstr "" msgstr ""
#: app/stateChange.cpp:92 #: app/stateChange.cpp:89
msgid "&Play" msgid "&Play"
msgstr "" msgstr ""
#: app/stateChange.cpp:171 #: app/stateChange.cpp:153
msgid "No media loaded" msgid "No media loaded"
msgstr "" msgstr ""
#: app/stateChange.cpp:174 #: app/stateChange.cpp:156
msgid "Paused" msgid "Paused"
msgstr "" msgstr ""
@ -355,128 +347,128 @@ msgstr ""
msgid "Pause" msgid "Pause"
msgstr "" msgstr ""
#: app/volumeAction.cpp:32 #: app/volumeAction.cpp:51
msgid "Toggle Mute"
msgstr ""
#: app/volumeAction.cpp:62 part/part.cpp:39
msgid "Mute"
msgstr ""
#: app/volumeAction.cpp:87
msgid "Volume" msgid "Volume"
msgstr "" msgstr ""
#: app/volumeAction.cpp:127 #: app/volumeAction.cpp:81 app/volumeAction.cpp:95
#, c-format #, c-format
msgid "Volume %1" msgid "Volume: %1"
msgstr "" msgstr ""
#: app/xineConfig.cpp:46 #: app/xineConfig.cpp:62
msgid "Configure xine" msgid "Configure xine"
msgstr "" msgstr ""
#: app/xineConfig.cpp:68 #: app/xineConfig.cpp:87
msgid "" msgid ""
"Xine's defaults are usually sensible and should not require modification. " "xine's defaults are usually sensible and should not require modification. "
"However, full configurability is provided for your pleasure ;-)" "However, full configurability is provided for your pleasure ;-)."
msgstr "" msgstr ""
#: app/xineEngine.cpp:147 part/xineEngine.cpp:50 #: app/xineEngine.cpp:150 part/xineEngine.cpp:50
msgid "xine was unable to initialize any video-drivers." msgid "xine was unable to initialize any video-drivers."
msgstr "" msgstr ""
#: app/xineEngine.cpp:149 part/xineEngine.cpp:48 #: app/xineEngine.cpp:152 part/xineEngine.cpp:48
msgid "xine was unable to initialize any audio-drivers." msgid "xine was unable to initialize any audio-drivers."
msgstr "" msgstr ""
#: app/xineEngine.cpp:254 #: app/xineEngine.cpp:257
#, c-format #, c-format
msgid "Loading media: %1" msgid "Loading media: %1"
msgstr "" msgstr ""
#: app/xineEngine.cpp:360 #: app/xineEngine.cpp:363
#, c-format #, c-format
msgid "Recording to: %1" msgid "Recording to: %1"
msgstr "" msgstr ""
#: app/xineEngine.cpp:393 #: app/xineEngine.cpp:394
msgid "Playback paused" msgid "Playback paused"
msgstr "" msgstr ""
#: app/xineEngine.cpp:398 #: app/xineEngine.cpp:399
msgid "Playback resumed" msgid "Playback resumed"
msgstr "" msgstr ""
#: app/xineEngine.cpp:411 #: app/xineEngine.cpp:412
#, c-format #, c-format
msgid "There is no input plugin that can read: %1." msgid "There is no input plugin that can read: %1."
msgstr "" msgstr ""
#: app/xineEngine.cpp:414 #: app/xineEngine.cpp:415
#, c-format #, c-format
msgid "There is no demux plugin available for %1." msgid "There is no demux plugin available for %1."
msgstr "" msgstr ""
#: app/xineEngine.cpp:417 #: app/xineEngine.cpp:418
#, c-format #, c-format
msgid "Demuxing failed for %1." msgid "Demuxing failed for %1."
msgstr "" msgstr ""
#: app/xineEngine.cpp:422 #: app/xineEngine.cpp:423
#, c-format #, c-format
msgid "Internal error while attempting to play %1." msgid "Internal error while attempting to play %1."
msgstr "" msgstr ""
#: app/xineEngine.cpp:748 app/xineEngine.cpp:756 #: app/xineEngine.cpp:523
msgid "xine cannot currently seek in flac media"
msgstr ""
#: app/xineEngine.cpp:715 app/xineEngine.cpp:723
#, c-format #, c-format
msgid "Channel %1" msgid "Channel %1"
msgstr "" msgstr ""
#: app/xineEngine.cpp:855 part/xineEngine.cpp:289 #: app/xineEngine.cpp:822 part/xineEngine.cpp:289
msgid "The source is encrypted and can not be decrypted." msgid "The source is encrypted and can not be decrypted."
msgstr "" msgstr ""
#: app/xineEngine.cpp:857 part/xineEngine.cpp:291 #: app/xineEngine.cpp:824 part/xineEngine.cpp:291
msgid "The host is unknown for the URL: <i>%1</i>" msgid "The host is unknown for the URL: <i>%1</i>"
msgstr "" msgstr ""
#: app/xineEngine.cpp:859 part/xineEngine.cpp:293 #: app/xineEngine.cpp:826 part/xineEngine.cpp:293
msgid "The device name you specified seems invalid." msgid "The device name you specified seems invalid."
msgstr "" msgstr ""
#: app/xineEngine.cpp:861 part/xineEngine.cpp:295 #: app/xineEngine.cpp:828 part/xineEngine.cpp:295
msgid "The network appears unreachable." msgid "The network appears unreachable."
msgstr "" msgstr ""
#: app/xineEngine.cpp:863 part/xineEngine.cpp:297 #: app/xineEngine.cpp:830 part/xineEngine.cpp:297
msgid "Audio output unavailable; the device is busy." msgid "Audio output unavailable; the device is busy."
msgstr "" msgstr ""
#: app/xineEngine.cpp:865 part/xineEngine.cpp:299 #: app/xineEngine.cpp:832 part/xineEngine.cpp:299
msgid "The connection was refused for the URL: <i>%1</i>" msgid "The connection was refused for the URL: <i>%1</i>"
msgstr "" msgstr ""
#: app/xineEngine.cpp:867 part/xineEngine.cpp:301 #: app/xineEngine.cpp:834 part/xineEngine.cpp:301
msgid "xine could not find the URL: <i>%1</i>" msgid "xine could not find the URL: <i>%1</i>"
msgstr "" msgstr ""
#: app/xineEngine.cpp:869 part/xineEngine.cpp:303 #: app/xineEngine.cpp:836 part/xineEngine.cpp:303
msgid "Access was denied for the URL: <i>%1</i>" msgid "Access was denied for the URL: <i>%1</i>"
msgstr "" msgstr ""
#: app/xineEngine.cpp:871 part/xineEngine.cpp:305 #: app/xineEngine.cpp:838 part/xineEngine.cpp:305
msgid "The source cannot be read for the URL: <i>%1</i>" msgid "The source cannot be read for the URL: <i>%1</i>"
msgstr "" msgstr ""
#: app/xineEngine.cpp:873 part/xineEngine.cpp:307 #: app/xineEngine.cpp:840 part/xineEngine.cpp:307
msgid "A problem occurred while loading a library or decoder." msgid "A problem occurred while loading a library or decoder."
msgstr "" msgstr ""
#: app/xineEngine.cpp:900 part/xineEngine.cpp:334 #: app/xineEngine.cpp:867 part/xineEngine.cpp:334
msgid "Sorry, no additional information is available." msgid "Sorry, no additional information is available."
msgstr "" msgstr ""
#: part/part.cpp:39
msgid "Mute"
msgstr ""
#: part/xineEngine.cpp:166 #: part/xineEngine.cpp:166
msgid "The Codeine video player could not find an input plugin for '%1'." msgid "The Codeine video player could not find an input plugin for '%1'."
msgstr "" msgstr ""

@ -1,506 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Temuri Doghonadze <rkavt@smartprojects.ge>, 2024, 2025.
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2025-05-11 18:19+0000\n"
"PO-Revision-Date: 2025-03-26 06:44+0000\n"
"Last-Translator: Temuri Doghonadze <rkavt@smartprojects.ge>\n"
"Language-Team: Georgian <https://mirror.git.trinitydesktop.org/weblate/"
"projects/applications/codeine/ka/>\n"
"Language: ka\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.17\n"
#. Instead of a literal translation, add your name to the end of the list (separated by a comma).
msgid ""
"_: NAME OF TRANSLATORS\n"
"Your names"
msgstr "თემური დოღონაძე"
#. Instead of a literal translation, add your email to the end of the list (separated by a comma).
msgid ""
"_: EMAIL OF TRANSLATORS\n"
"Your emails"
msgstr "temuri.doghonadze@gmail.com"
#: app/actions.cpp:15 part/part.cpp:38
msgid "Play"
msgstr "დაკვრა"
#: app/adjustSizeButton.cpp:31
msgid "Preferred Scale"
msgstr "რჩეულ მასშტაბი"
#: app/adjustSizeButton.cpp:35
#, c-format
msgid "Scale 100%"
msgstr "100%-მდე გადიდება"
#: app/adjustSizeButton.cpp:41
msgid "<b>Adjust video scale?"
msgstr "<b>გავასწორო ვიდეოს მასშტაბი?"
#: app/audioView.cpp:48 app/mainWindow.cpp:332
msgid "Show Analyzer"
msgstr "ანალიზატორის ჩვენება"
#: app/captureFrame.cpp:92
#, c-format
msgid "Capture - %1"
msgstr "ჩაწერა - %1"
#: app/captureFrame.cpp:108
msgid ""
"*.png|PNG Format\n"
"*.jpeg|JPEG Format"
msgstr ""
"*.png|PNG ფორმატი\n"
"*.jpeg|JPEG ფორმატი"
#: app/captureFrame.cpp:110
msgid "Save Frame"
msgstr "კადრის შენახვა"
#: app/captureFrame.cpp:121
msgid "%1 saved successfully"
msgstr "%1-ის შენახვა წარმატებულია"
#: app/captureFrame.cpp:123
#, c-format
msgid "Sorry, could not save %1"
msgstr "უკაცრავად, შენახვის შეცდომა %1-სთვის"
#: app/fullScreenAction.cpp:31
msgid "Exit F&ull Screen Mode"
msgstr "სრული &ეკრანის რეჟიმიდან გასვლა"
#: app/fullScreenAction.cpp:37
msgid "F&ull Screen Mode"
msgstr "&სრულ-ეკრანზე"
#: app/insertAspectRatioMenuItems.cpp:16
msgid "Determine &Automatically"
msgstr "ავტომატურად &განსაზღვრა"
#: app/insertAspectRatioMenuItems.cpp:17
msgid "&Square (1:1)"
msgstr "&კვადრატი (1:1)"
#: app/insertAspectRatioMenuItems.cpp:18
msgid "&4:3"
msgstr "&4:3"
#: app/insertAspectRatioMenuItems.cpp:19
msgid "Ana&morphic (16:9)"
msgstr "&ანამორფული (16:9)"
#: app/insertAspectRatioMenuItems.cpp:20
msgid "&DVB (2.11:1)"
msgstr "&DVB (2.11:1)"
#: app/main.cpp:14
msgid "A video player that has a usability focus"
msgstr "ვიდეო დამკვრელი ფოკუსით გამოყენებადობაზე"
#: app/main.cpp:15
msgid "Copyright 2006, Max Howell"
msgstr "ყველა უფლება დაცულია, 2006, Max Howell"
#: app/main.cpp:20
msgid "Play 'URL'"
msgstr "URL-ის დაკვრა"
#: app/main.cpp:21
msgid "Play DVD Video"
msgstr "DVD ვიდეოს დაკვრა"
#: app/main.cpp:31
msgid "Handbook"
msgstr "სახელმძღვანელო"
#: app/main.cpp:32
msgid "Great reference code"
msgstr "დიდი მიმართვის კოდი"
#: app/main.cpp:33
msgid "The video for \"Call on Me\" encouraged plenty of debugging! ;)"
msgstr "ვიდეომ \"დამირეკე\" ბევრი შეცდომის გასწორება გვაიძულა! ;)"
#: app/main.cpp:34
msgid "The current Codeine icon"
msgstr "Codeine-ის მიმდინარე ხატულა"
#: app/main.cpp:35
msgid "Patches, advice and moral support"
msgstr "პაჩები, რჩევები და მორალური მხარდაჭერა"
#: app/mainWindow.cpp:143
msgid "Aspect Ratio"
msgstr "თანაფარდობა"
#: app/mainWindow.cpp:149
msgid "Audio Channels"
msgstr "აუდიო არხები"
#: app/mainWindow.cpp:155
msgid "Subtitles"
msgstr "სუბტიტრები"
#: app/mainWindow.cpp:277
msgid "Play &Media..."
msgstr "მედიის &დაკვრა..."
#: app/mainWindow.cpp:283
msgid "Record"
msgstr "ჩაწერა"
#: app/mainWindow.cpp:285
msgid "Reset Video Scale"
msgstr "ვიდეოს მასშტაბის ჩამოყრა"
#: app/mainWindow.cpp:286 app/mainWindow.cpp:650
msgid "Media Information"
msgstr "მედიის ინფორმაცია"
#: app/mainWindow.cpp:287
msgid "Menu Toggle"
msgstr "მენიუს გადართვა"
#: app/mainWindow.cpp:288
msgid "&Capture Frame"
msgstr "&კადრის ჩაწერა"
#: app/mainWindow.cpp:290
msgid "Video Settings..."
msgstr "ვიდეოს მორგება..."
#: app/mainWindow.cpp:291
msgid "Configure xine..."
msgstr "Xine-ის მორგება..."
#: app/mainWindow.cpp:293
msgid "Position Slider"
msgstr "მდებარეობის ცოცია"
#: app/mainWindow.cpp:295
msgid "A&udio Channels"
msgstr "ა&უდიო არხები"
#: app/mainWindow.cpp:298
msgid "&Subtitles"
msgstr "&სუბტიტრები"
#: app/mainWindow.cpp:301
msgid "Aspect &Ratio"
msgstr "ასპექტის &ფარდობა"
#: app/mainWindow.cpp:425
msgid "Codeine was asked to open an empty URL; it cannot."
msgstr "Codeine-ს სთხოვეს, ცარიელი URL გაეხსნა. მას ეს არ შეუძლია."
#: app/mainWindow.cpp:487
msgid "Supported Media Formats"
msgstr "მხარდაჭერილი მედია ფორმატები"
#: app/mainWindow.cpp:487
msgid "All Files"
msgstr "ყველა ფაილი"
#: app/mainWindow.cpp:488
msgid "Select A File To Play"
msgstr "აირჩიეთ დასაკრავი ფაილი"
#: app/mainWindow.cpp:714
msgid "Sorry, no media was found in the drop"
msgstr "რაც დააგდეთ, მასში მედიაფაილი ვერ ვიპოვე"
#: app/playDialog.cpp:28
msgid "Play Media"
msgstr "მედიის დაკვრა"
#: app/playDialog.cpp:34
msgid "What media would you like to play?"
msgstr "რისი დაკვრა გსურთ?"
#: app/playDialog.cpp:39
msgid "Play File..."
msgstr "ფაილის დაკვრა..."
#: app/playDialog.cpp:43
msgid "Play VCD"
msgstr "VCD-ს დაკვრა"
#: app/playDialog.cpp:47
msgid "Play DVD"
msgstr "DVD-ის დაკვრა"
#: app/playDialog.cpp:75
msgid "Recently Played Media"
msgstr "ახლახან დაკრული მედია"
#: app/playlistFile.cpp:32
msgid "The file is not a playlist"
msgstr "ეს ფაილი დასაკრავ სიაში არაა"
#: app/playlistFile.cpp:39
#, c-format
msgid "Codeine could not download the remote playlist: %1"
msgstr "Codeine-მა ვერ გადმოწერა დასაკრავი სია ინტერნეტიდან: %1"
#: app/playlistFile.cpp:54
msgid ""
"<qt>The playlist, <i>'%1'</i>, could not be interpreted. Perhaps it is empty?"
msgstr ""
"<qt>დასაკრავი სიის, <i>'%1'</i>, ინტერპრეტაცია შეუძლებელია. ცარიელი ხომ არაა?"
#: app/playlistFile.cpp:58
#, c-format
msgid "Codeine could not open the file: %1"
msgstr "Codeine-მა ვერ გახსნა ფაილი: %1"
#: app/stateChange.cpp:92
msgid "&Pause"
msgstr "&შეჩერება"
#: app/stateChange.cpp:92
msgid "&Play"
msgstr "&დაკვრა"
#: app/stateChange.cpp:171
msgid "No media loaded"
msgstr "მედია ჩატვირთული არაა"
#: app/stateChange.cpp:174
msgid "Paused"
msgstr "შეჩერებულია"
#: app/theStream.cpp:108
msgid "Metadata"
msgstr "მეტამონაცემები"
#: app/theStream.cpp:110
msgid "Title"
msgstr "სათაური"
#: app/theStream.cpp:111
msgid "Comment"
msgstr "კომენტარი"
#: app/theStream.cpp:112
msgid "Artist"
msgstr "შემსრულებელი"
#: app/theStream.cpp:113
msgid "Genre"
msgstr "ჟანრი"
#: app/theStream.cpp:114
msgid "Album"
msgstr "ალბომი"
#: app/theStream.cpp:115
msgid "Year"
msgstr "წელი"
#: app/theStream.cpp:117
msgid "Audio Properties"
msgstr "აუდიო თვისებები"
#: app/theStream.cpp:119
msgid "Bitrate"
msgstr "სიჩქარე"
#: app/theStream.cpp:119
msgid "%1 bps"
msgstr "%1 ბ/წმ"
#: app/theStream.cpp:120
msgid "Sample-rate"
msgstr "სემპლის-სიხშირე"
#: app/theStream.cpp:120
msgid "%1 Hz"
msgstr "%1 ჰც"
#: app/theStream.cpp:122
msgid "Technical Information"
msgstr "ტექნიკური ინფორმაცია"
#: app/theStream.cpp:124
msgid "Video Codec"
msgstr "ვიდეო კოდეკი"
#: app/theStream.cpp:125
msgid "Audio Codec"
msgstr "აუდიო კოდეკი"
#: app/theStream.cpp:126
msgid "System Layer"
msgstr "სისტემის ფენა"
#: app/theStream.cpp:127
msgid "Input Plugin"
msgstr "შეყვანის დამატება"
#: app/theStream.cpp:128
msgid "CDINDEX_DISCID"
msgstr "CDINDEX_DISCID"
#: app/videoSettings.cpp:92
msgid "Video Settings"
msgstr "ვიდეოს პარამეტრები"
#: app/videoWindow.cpp:136
msgid "Pause"
msgstr "შეჩერება"
#: app/volumeAction.cpp:32
msgid "Toggle Mute"
msgstr ""
#: app/volumeAction.cpp:62 part/part.cpp:39
msgid "Mute"
msgstr "დადუმება"
#: app/volumeAction.cpp:87
msgid "Volume"
msgstr "ხმა"
#: app/volumeAction.cpp:127
#, c-format
msgid "Volume %1"
msgstr "ხმა %1"
#: app/xineConfig.cpp:46
msgid "Configure xine"
msgstr "Xine-ის მორგება"
#: app/xineConfig.cpp:68
msgid ""
"Xine's defaults are usually sensible and should not require modification. "
"However, full configurability is provided for your pleasure ;-)"
msgstr ""
"Xine-ის ნაგულისხმევ მნიშვნელობებს ჩვეულებრივ შეცვლა არ სჭირდება. მაგრამ, "
"თქვენი სიამოვნებისთვის, ჩვენ სრული მორგებადობა ჩავდეთ ;-)"
#: app/xineEngine.cpp:147 part/xineEngine.cpp:50
msgid "xine was unable to initialize any video-drivers."
msgstr "xine-ის შეცდომა ვიდეოდრაივერბის ინიციალიზაციისას."
#: app/xineEngine.cpp:149 part/xineEngine.cpp:48
msgid "xine was unable to initialize any audio-drivers."
msgstr "xine-ის შეცდომა აუდიოდრაივერების ინიციალიზაციისას."
#: app/xineEngine.cpp:254
#, c-format
msgid "Loading media: %1"
msgstr "იტვირთება მედია: %1"
#: app/xineEngine.cpp:360
#, c-format
msgid "Recording to: %1"
msgstr "ჩაწერა ფაილში: %1"
#: app/xineEngine.cpp:393
msgid "Playback paused"
msgstr "დაკვრა შეჩერებულია"
#: app/xineEngine.cpp:398
msgid "Playback resumed"
msgstr "დაკვრა გაგრძელდა"
#: app/xineEngine.cpp:411
#, c-format
msgid "There is no input plugin that can read: %1."
msgstr "არ არსებობს შეყვანის დამატება, რომელსაც შეუძლია, წაიკითხოს: %1."
#: app/xineEngine.cpp:414
#, c-format
msgid "There is no demux plugin available for %1."
msgstr "Demux დამატება ხელმიუწვდომელია %1-სთვის."
#: app/xineEngine.cpp:417
#, c-format
msgid "Demuxing failed for %1."
msgstr "Demux ჩავარდა ფაილისთვის %1."
#: app/xineEngine.cpp:422
#, c-format
msgid "Internal error while attempting to play %1."
msgstr "შიდა შეცდომა %1-ის დაკვრის მცდელობისას."
#: app/xineEngine.cpp:748 app/xineEngine.cpp:756
#, c-format
msgid "Channel %1"
msgstr "არხი %1"
#: app/xineEngine.cpp:855 part/xineEngine.cpp:289
msgid "The source is encrypted and can not be decrypted."
msgstr "წყარო დაშიფრულია და მისი გაშიფვრა შეუძლებელია."
#: app/xineEngine.cpp:857 part/xineEngine.cpp:291
msgid "The host is unknown for the URL: <i>%1</i>"
msgstr "ჰოსტის სახელი უცნობია URL-სთვის <i>%1</i>"
#: app/xineEngine.cpp:859 part/xineEngine.cpp:293
msgid "The device name you specified seems invalid."
msgstr "თქვენს მიერ მითითებული მოწყობილობის სახელი არასწორია."
#: app/xineEngine.cpp:861 part/xineEngine.cpp:295
msgid "The network appears unreachable."
msgstr "როგორც ჩანს, ქსელი ხელმიუწვდომელია."
#: app/xineEngine.cpp:863 part/xineEngine.cpp:297
msgid "Audio output unavailable; the device is busy."
msgstr "აუდიოს გამოტანა ხელმიუწვდომელია, რადგან მოწყობილობა დაკავებულია."
#: app/xineEngine.cpp:865 part/xineEngine.cpp:299
msgid "The connection was refused for the URL: <i>%1</i>"
msgstr "მიერთება უარყოფილია URL-სთვის: <i>%1</i>"
#: app/xineEngine.cpp:867 part/xineEngine.cpp:301
msgid "xine could not find the URL: <i>%1</i>"
msgstr "xine-მა ვერ იპოვა URL: <i>%1</i>"
#: app/xineEngine.cpp:869 part/xineEngine.cpp:303
msgid "Access was denied for the URL: <i>%1</i>"
msgstr "წვდომა მისამართზე აკრძალულია: <i>%1</i>"
#: app/xineEngine.cpp:871 part/xineEngine.cpp:305
msgid "The source cannot be read for the URL: <i>%1</i>"
msgstr "წყარო URL-თვის ვერ იქნა წაკითხული: <i>%1</i>"
#: app/xineEngine.cpp:873 part/xineEngine.cpp:307
msgid "A problem occurred while loading a library or decoder."
msgstr "პრობლემა ბიბლიოთეკის ან დეკოდერის ჩატვირთვისას."
#: app/xineEngine.cpp:900 part/xineEngine.cpp:334
msgid "Sorry, no additional information is available."
msgstr "ბოდიში, დამატებითი ინფორმაცია არაა ხელმისაწვდომი."
#: part/xineEngine.cpp:166
msgid "The Codeine video player could not find an input plugin for '%1'."
msgstr "ვიდეოდამკვრელმა Codeine ვერ იპოვა შეყვანის დამატება ფაილისთვის '%1'."
#: part/xineEngine.cpp:169
msgid "The Codeine video player could not find a demux plugin for '%1'."
msgstr "ვიდეოდამკვრელმა Codeine ვერ იპოვა demux დამატება ფაილისთვის '%1'."
#: part/xineEngine.cpp:172
msgid ""
"The Codeine video player failed to demux '%1'; please check your xine "
"installation."
msgstr ""
"ვიდეოდამკვრელის Codeine demux-ის შეცდომა '%1'-სთვის. შეამოწმეთ xine-ის "
"ფაილები."
#: part/xineEngine.cpp:177
msgid ""
"The Codeine video player reports an internal error; please check your xine "
"installation."
msgstr ""
"ვიდეოდამკვრელმა Codeine შიდა შეცდომა დააბრუნა. შეამოწმეთ xine-ის ფაილები."

@ -1,507 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Heimen Stoffels <vistausss@fastmail.com>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2025-05-11 18:19+0000\n"
"PO-Revision-Date: 2025-05-12 18:44+0000\n"
"Last-Translator: Heimen Stoffels <vistausss@fastmail.com>\n"
"Language-Team: Dutch <https://mirror.git.trinitydesktop.org/weblate/projects/"
"applications/codeine/nl/>\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.17\n"
#. Instead of a literal translation, add your name to the end of the list (separated by a comma).
msgid ""
"_: NAME OF TRANSLATORS\n"
"Your names"
msgstr "Heimen Stoffels"
#. Instead of a literal translation, add your email to the end of the list (separated by a comma).
msgid ""
"_: EMAIL OF TRANSLATORS\n"
"Your emails"
msgstr "vistausss@fastmail.com"
#: app/actions.cpp:15 part/part.cpp:38
msgid "Play"
msgstr "Afspelen"
#: app/adjustSizeButton.cpp:31
msgid "Preferred Scale"
msgstr "Voorkeursgrootte"
#: app/adjustSizeButton.cpp:35
#, c-format
msgid "Scale 100%"
msgstr "100%"
#: app/adjustSizeButton.cpp:41
msgid "<b>Adjust video scale?"
msgstr "<b>Wilt u de videogrootte aanpassen?"
#: app/audioView.cpp:48 app/mainWindow.cpp:332
msgid "Show Analyzer"
msgstr "Analyse tonen"
#: app/captureFrame.cpp:92
#, c-format
msgid "Capture - %1"
msgstr "Opname - %1"
#: app/captureFrame.cpp:108
msgid ""
"*.png|PNG Format\n"
"*.jpeg|JPEG Format"
msgstr ""
"*.png|png-formaat\n"
"*.jpeg|jpeg-formaat"
#: app/captureFrame.cpp:110
msgid "Save Frame"
msgstr "Frame opslaan"
#: app/captureFrame.cpp:121
msgid "%1 saved successfully"
msgstr "%1 is opgeslagen"
#: app/captureFrame.cpp:123
#, c-format
msgid "Sorry, could not save %1"
msgstr "%1 kan niet worden opgeslagen"
#: app/fullScreenAction.cpp:31
msgid "Exit F&ull Screen Mode"
msgstr "Schermv&ullende weergave sluiten"
#: app/fullScreenAction.cpp:37
msgid "F&ull Screen Mode"
msgstr "Schermv&ullende weergave"
#: app/insertAspectRatioMenuItems.cpp:16
msgid "Determine &Automatically"
msgstr "&Automatisch vaststellen"
#: app/insertAspectRatioMenuItems.cpp:17
msgid "&Square (1:1)"
msgstr "&Vierkant (1:1)"
#: app/insertAspectRatioMenuItems.cpp:18
msgid "&4:3"
msgstr "&4:3"
#: app/insertAspectRatioMenuItems.cpp:19
msgid "Ana&morphic (16:9)"
msgstr "Ana&morfisch (16:9)"
#: app/insertAspectRatioMenuItems.cpp:20
msgid "&DVB (2.11:1)"
msgstr "&DVB (2.11:1)"
#: app/main.cpp:14
msgid "A video player that has a usability focus"
msgstr "Een zeer gebruiksvriendelijke videospeler"
#: app/main.cpp:15
msgid "Copyright 2006, Max Howell"
msgstr "Copyright 2006, Max Howell"
#: app/main.cpp:20
msgid "Play 'URL'"
msgstr "Url afspelen"
#: app/main.cpp:21
msgid "Play DVD Video"
msgstr "Dvd-video afspelen"
#: app/main.cpp:31
msgid "Handbook"
msgstr "Handleiding"
#: app/main.cpp:32
msgid "Great reference code"
msgstr "Goede referentiecode"
#: app/main.cpp:33
msgid "The video for \"Call on Me\" encouraged plenty of debugging! ;)"
msgstr ""
"De videoclip van Call on Me stimuleerde me om veel fouten op te sporen! ;)"
#: app/main.cpp:34
msgid "The current Codeine icon"
msgstr "Het huidige Codeine-pictogram"
#: app/main.cpp:35
msgid "Patches, advice and moral support"
msgstr "Patches, advies en morele ondersteuning"
#: app/mainWindow.cpp:143
msgid "Aspect Ratio"
msgstr "Beeldverhouding"
#: app/mainWindow.cpp:149
msgid "Audio Channels"
msgstr "Aantal audiokanalen"
#: app/mainWindow.cpp:155
msgid "Subtitles"
msgstr "Ondertiteling"
#: app/mainWindow.cpp:277
msgid "Play &Media..."
msgstr "&Media afspelen…"
#: app/mainWindow.cpp:283
msgid "Record"
msgstr "Opnemen"
#: app/mainWindow.cpp:285
msgid "Reset Video Scale"
msgstr "Standaard videogrootte"
#: app/mainWindow.cpp:286 app/mainWindow.cpp:650
msgid "Media Information"
msgstr "Media-informatie"
#: app/mainWindow.cpp:287
msgid "Menu Toggle"
msgstr "Menu tonen/verbergen"
#: app/mainWindow.cpp:288
msgid "&Capture Frame"
msgstr "Frame &vastleggen"
#: app/mainWindow.cpp:290
msgid "Video Settings..."
msgstr "Video-instellingen…"
#: app/mainWindow.cpp:291
msgid "Configure xine..."
msgstr "Xine instellen…"
#: app/mainWindow.cpp:293
msgid "Position Slider"
msgstr "Positieschuif"
#: app/mainWindow.cpp:295
msgid "A&udio Channels"
msgstr "A&udiokanalen"
#: app/mainWindow.cpp:298
msgid "&Subtitles"
msgstr "Onder&titeling"
#: app/mainWindow.cpp:301
msgid "Aspect &Ratio"
msgstr "Beeldve&rhouding"
#: app/mainWindow.cpp:425
msgid "Codeine was asked to open an empty URL; it cannot."
msgstr "Codeine kan geen inhoudsloze url's openen."
#: app/mainWindow.cpp:487
msgid "Supported Media Formats"
msgstr "Ondersteunde mediaformaten"
#: app/mainWindow.cpp:487
msgid "All Files"
msgstr "Alle bestanden"
#: app/mainWindow.cpp:488
msgid "Select A File To Play"
msgstr "Kies een af te spelen bestand"
#: app/mainWindow.cpp:714
msgid "Sorry, no media was found in the drop"
msgstr "Er is geen media aangetroffen in het bestand"
#: app/playDialog.cpp:28
msgid "Play Media"
msgstr "Media afspelen"
#: app/playDialog.cpp:34
msgid "What media would you like to play?"
msgstr "Wat voor soort media wilt u afspelen?"
#: app/playDialog.cpp:39
msgid "Play File..."
msgstr "Bestand afspelen…"
#: app/playDialog.cpp:43
msgid "Play VCD"
msgstr "Vcd afspelen"
#: app/playDialog.cpp:47
msgid "Play DVD"
msgstr "Dvd afspelen"
#: app/playDialog.cpp:75
msgid "Recently Played Media"
msgstr "Onlangs afgespeelde media"
#: app/playlistFile.cpp:32
msgid "The file is not a playlist"
msgstr "Dit bestand is geen afspeellijst"
#: app/playlistFile.cpp:39
#, c-format
msgid "Codeine could not download the remote playlist: %1"
msgstr "De externe afspeellijst kan niet worden opgehaald: %1"
#: app/playlistFile.cpp:54
msgid ""
"<qt>The playlist, <i>'%1'</i>, could not be interpreted. Perhaps it is empty?"
msgstr ""
"<qt>De afspeellijst, <i>%1</i>, kan niet worden verwerkt. Is de lijst blanco?"
#: app/playlistFile.cpp:58
#, c-format
msgid "Codeine could not open the file: %1"
msgstr "Het bestand kan niet worden geopend: %1"
#: app/stateChange.cpp:92
msgid "&Pause"
msgstr "&Pauzeren"
#: app/stateChange.cpp:92
msgid "&Play"
msgstr "Afs&pelen"
#: app/stateChange.cpp:171
msgid "No media loaded"
msgstr "Er is geen media geladen"
#: app/stateChange.cpp:174
msgid "Paused"
msgstr "Gepauzeerd"
#: app/theStream.cpp:108
msgid "Metadata"
msgstr "Metagegevens"
#: app/theStream.cpp:110
msgid "Title"
msgstr "Titel"
#: app/theStream.cpp:111
msgid "Comment"
msgstr "Opmerking"
#: app/theStream.cpp:112
msgid "Artist"
msgstr "Artiest"
#: app/theStream.cpp:113
msgid "Genre"
msgstr "Genre"
#: app/theStream.cpp:114
msgid "Album"
msgstr "Album"
#: app/theStream.cpp:115
msgid "Year"
msgstr "Jaar"
#: app/theStream.cpp:117
msgid "Audio Properties"
msgstr "Audio-informatie"
#: app/theStream.cpp:119
msgid "Bitrate"
msgstr "Bitsnelheid"
#: app/theStream.cpp:119
msgid "%1 bps"
msgstr "%1 bps"
#: app/theStream.cpp:120
msgid "Sample-rate"
msgstr "Samplesnelheid"
#: app/theStream.cpp:120
msgid "%1 Hz"
msgstr "%1 Hz"
#: app/theStream.cpp:122
msgid "Technical Information"
msgstr "Technische informatie"
#: app/theStream.cpp:124
msgid "Video Codec"
msgstr "Videocodec"
#: app/theStream.cpp:125
msgid "Audio Codec"
msgstr "Audiocodec"
#: app/theStream.cpp:126
msgid "System Layer"
msgstr "Systeemlaag"
#: app/theStream.cpp:127
msgid "Input Plugin"
msgstr "Invoerplug-in"
#: app/theStream.cpp:128
msgid "CDINDEX_DISCID"
msgstr "CDINDEX_DISCID"
#: app/videoSettings.cpp:92
msgid "Video Settings"
msgstr "Video-instellingen"
#: app/videoWindow.cpp:136
msgid "Pause"
msgstr "Pauzeren"
#: app/volumeAction.cpp:32
msgid "Toggle Mute"
msgstr "Dempen aan/uit"
#: app/volumeAction.cpp:62 part/part.cpp:39
msgid "Mute"
msgstr "Dempen"
#: app/volumeAction.cpp:87
msgid "Volume"
msgstr "Volumeniveau"
#: app/volumeAction.cpp:127
#, c-format
msgid "Volume %1"
msgstr "Volumeniveau: %"
#: app/xineConfig.cpp:46
msgid "Configure xine"
msgstr "Xine instellen"
#: app/xineConfig.cpp:68
msgid ""
"Xine's defaults are usually sensible and should not require modification. "
"However, full configurability is provided for your pleasure ;-)"
msgstr ""
"Xine's standaardinstellingen zijn goed doordacht en hoeven niet bewerkt te "
"worden. Mocht u van mening verschillen, dan staat het u vrij dat alsnog te "
"doen. ;-)"
#: app/xineEngine.cpp:147 part/xineEngine.cpp:50
msgid "xine was unable to initialize any video-drivers."
msgstr "Xine kan de videostuuprogramma's niet starten."
#: app/xineEngine.cpp:149 part/xineEngine.cpp:48
msgid "xine was unable to initialize any audio-drivers."
msgstr "Xine kan de audiostuurprogramma's niet starten."
#: app/xineEngine.cpp:254
#, c-format
msgid "Loading media: %1"
msgstr "Media openen: %1"
#: app/xineEngine.cpp:360
#, c-format
msgid "Recording to: %1"
msgstr "Opname opslaan in: %1"
#: app/xineEngine.cpp:393
msgid "Playback paused"
msgstr "Afspelen gepauzeerd"
#: app/xineEngine.cpp:398
msgid "Playback resumed"
msgstr "Afspelen hervat"
#: app/xineEngine.cpp:411
#, c-format
msgid "There is no input plugin that can read: %1."
msgstr "Er is geen invoerplug-in die %1 kan uitlezen."
#: app/xineEngine.cpp:414
#, c-format
msgid "There is no demux plugin available for %1."
msgstr "Er is geen demuxplug-in beschikbaar voor %1."
#: app/xineEngine.cpp:417
#, c-format
msgid "Demuxing failed for %1."
msgstr "Het demuxen van %1 is mislukt."
#: app/xineEngine.cpp:422
#, c-format
msgid "Internal error while attempting to play %1."
msgstr "Er is een interne fout opgetreden tijdens het starten van %1."
#: app/xineEngine.cpp:748 app/xineEngine.cpp:756
#, c-format
msgid "Channel %1"
msgstr "Kanaal %1"
#: app/xineEngine.cpp:855 part/xineEngine.cpp:289
msgid "The source is encrypted and can not be decrypted."
msgstr "De bron is beveiligd en kan niet worden ontsleuteld."
#: app/xineEngine.cpp:857 part/xineEngine.cpp:291
msgid "The host is unknown for the URL: <i>%1</i>"
msgstr "Er is geen host bekend van de url: <i>%1</i>"
#: app/xineEngine.cpp:859 part/xineEngine.cpp:293
msgid "The device name you specified seems invalid."
msgstr "De apparaatnaam lijkt ongeldig te zijn."
#: app/xineEngine.cpp:861 part/xineEngine.cpp:295
msgid "The network appears unreachable."
msgstr "Er lijkt geen internetverbinding te zijn."
#: app/xineEngine.cpp:863 part/xineEngine.cpp:297
msgid "Audio output unavailable; the device is busy."
msgstr "De audio-uitvoer is niet beschikbaar, omdat het apparaat bezig is."
#: app/xineEngine.cpp:865 part/xineEngine.cpp:299
msgid "The connection was refused for the URL: <i>%1</i>"
msgstr "De verbinding met <i>%1</i> is geweigerd."
#: app/xineEngine.cpp:867 part/xineEngine.cpp:301
msgid "xine could not find the URL: <i>%1</i>"
msgstr "Xine kan deze url niet openen: <i>%1</i>"
#: app/xineEngine.cpp:869 part/xineEngine.cpp:303
msgid "Access was denied for the URL: <i>%1</i>"
msgstr "De toegang tot <i>%1</i> is geweigerd."
#: app/xineEngine.cpp:871 part/xineEngine.cpp:305
msgid "The source cannot be read for the URL: <i>%1</i>"
msgstr "De bron van <i>%1</i> kan niet worden uitgelezen."
#: app/xineEngine.cpp:873 part/xineEngine.cpp:307
msgid "A problem occurred while loading a library or decoder."
msgstr ""
"Er is een probleem opgetreden tijdens het laden van een bibliotheek of "
"decodeerplug-in."
#: app/xineEngine.cpp:900 part/xineEngine.cpp:334
msgid "Sorry, no additional information is available."
msgstr "Er is geen aanvullende informatie beschikbaar."
#: part/xineEngine.cpp:166
msgid "The Codeine video player could not find an input plugin for '%1'."
msgstr "Er is geen invoerplug-in gevonden voor %1."
#: part/xineEngine.cpp:169
msgid "The Codeine video player could not find a demux plugin for '%1'."
msgstr "Er is geen demuxplug-in gevonden voor %1."
#: part/xineEngine.cpp:172
msgid ""
"The Codeine video player failed to demux '%1'; please check your xine "
"installation."
msgstr "%1 kan niet worden gedemuxet - controleer uw Xine-installatie."
#: part/xineEngine.cpp:177
msgid ""
"The Codeine video player reports an internal error; please check your xine "
"installation."
msgstr "Er is een interne fout opgetreden - controleer uw Xine-installatie."

@ -1,500 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Toad114514 <xiaolan2332021@163.com>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2025-05-11 18:19+0000\n"
"PO-Revision-Date: 2025-04-21 05:15+0000\n"
"Last-Translator: Toad114514 <xiaolan2332021@163.com>\n"
"Language-Team: Chinese (Simplified) <https://mirror.git.trinitydesktop.org/"
"weblate/projects/applications/codeine/zh_Hans/>\n"
"Language: zh_Hans\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.17\n"
#. Instead of a literal translation, add your name to the end of the list (separated by a comma).
msgid ""
"_: NAME OF TRANSLATORS\n"
"Your names"
msgstr "Toad114514"
#. Instead of a literal translation, add your email to the end of the list (separated by a comma).
msgid ""
"_: EMAIL OF TRANSLATORS\n"
"Your emails"
msgstr "xiaolan2332021@163.com"
#: app/actions.cpp:15 part/part.cpp:38
msgid "Play"
msgstr "播放"
#: app/adjustSizeButton.cpp:31
msgid "Preferred Scale"
msgstr "首选缩放"
#: app/adjustSizeButton.cpp:35
#, c-format
msgid "Scale 100%"
msgstr "100% 比例"
#: app/adjustSizeButton.cpp:41
msgid "<b>Adjust video scale?"
msgstr "<b>调整视频比例?"
#: app/audioView.cpp:48 app/mainWindow.cpp:332
msgid "Show Analyzer"
msgstr "显示音频分析器"
#: app/captureFrame.cpp:92
#, c-format
msgid "Capture - %1"
msgstr "截图 - %1"
#: app/captureFrame.cpp:108
msgid ""
"*.png|PNG Format\n"
"*.jpeg|JPEG Format"
msgstr ""
"*.png|PNG图像格式\n"
"*.jpeg|JPEG图像格式"
#: app/captureFrame.cpp:110
msgid "Save Frame"
msgstr "保存一帧"
#: app/captureFrame.cpp:121
msgid "%1 saved successfully"
msgstr "%1 已保存"
#: app/captureFrame.cpp:123
#, c-format
msgid "Sorry, could not save %1"
msgstr "抱歉,无法保存 %1"
#: app/fullScreenAction.cpp:31
msgid "Exit F&ull Screen Mode"
msgstr "退出全屏模式"
#: app/fullScreenAction.cpp:37
msgid "F&ull Screen Mode"
msgstr "全屏模式(&F)"
#: app/insertAspectRatioMenuItems.cpp:16
msgid "Determine &Automatically"
msgstr "自动确认(&A)"
#: app/insertAspectRatioMenuItems.cpp:17
msgid "&Square (1:1)"
msgstr "方形 (1:1) (&S)"
#: app/insertAspectRatioMenuItems.cpp:18
msgid "&4:3"
msgstr "4:3(&4)"
#: app/insertAspectRatioMenuItems.cpp:19
msgid "Ana&morphic (16:9)"
msgstr "变形 (16:9) (&m)"
#: app/insertAspectRatioMenuItems.cpp:20
msgid "&DVB (2.11:1)"
msgstr "DVB (2.11:1) (&D)"
#: app/main.cpp:14
msgid "A video player that has a usability focus"
msgstr "注重可用性的视频播放器"
#: app/main.cpp:15
msgid "Copyright 2006, Max Howell"
msgstr "版权所有 2006, Max Howell"
#: app/main.cpp:20
msgid "Play 'URL'"
msgstr "播放 '链接'"
#: app/main.cpp:21
msgid "Play DVD Video"
msgstr "播放 DVD 视频"
#: app/main.cpp:31
msgid "Handbook"
msgstr "手册"
#: app/main.cpp:32
msgid "Great reference code"
msgstr "很好的参考代码"
#: app/main.cpp:33
msgid "The video for \"Call on Me\" encouraged plenty of debugging! ;)"
msgstr "这些视频在“叫我”要大量调试 ;)"
#: app/main.cpp:34
msgid "The current Codeine icon"
msgstr "当前的 Codeine 图标"
#: app/main.cpp:35
msgid "Patches, advice and moral support"
msgstr "bug 修补, 想法提供和支持"
#: app/mainWindow.cpp:143
msgid "Aspect Ratio"
msgstr "纵横比"
#: app/mainWindow.cpp:149
msgid "Audio Channels"
msgstr "音频轨道"
#: app/mainWindow.cpp:155
msgid "Subtitles"
msgstr "字幕"
#: app/mainWindow.cpp:277
msgid "Play &Media..."
msgstr "播放媒体(&M) ..."
#: app/mainWindow.cpp:283
msgid "Record"
msgstr "录制"
#: app/mainWindow.cpp:285
msgid "Reset Video Scale"
msgstr "重置视频比例"
#: app/mainWindow.cpp:286 app/mainWindow.cpp:650
msgid "Media Information"
msgstr "媒体信息"
#: app/mainWindow.cpp:287
msgid "Menu Toggle"
msgstr "切换菜单"
#: app/mainWindow.cpp:288
msgid "&Capture Frame"
msgstr "截图一帧(&C)"
#: app/mainWindow.cpp:290
msgid "Video Settings..."
msgstr "视频设置 ..."
#: app/mainWindow.cpp:291
msgid "Configure xine..."
msgstr "xine 引擎配置 ..."
#: app/mainWindow.cpp:293
msgid "Position Slider"
msgstr "滑块位置"
#: app/mainWindow.cpp:295
msgid "A&udio Channels"
msgstr "音频轨道(&u)"
#: app/mainWindow.cpp:298
msgid "&Subtitles"
msgstr "字幕(&S)"
#: app/mainWindow.cpp:301
msgid "Aspect &Ratio"
msgstr "宽高比(&R)"
#: app/mainWindow.cpp:425
msgid "Codeine was asked to open an empty URL; it cannot."
msgstr "Codeine 被要求打开一个空的 URL但实际上它做不到。"
#: app/mainWindow.cpp:487
msgid "Supported Media Formats"
msgstr "支持的媒体格式"
#: app/mainWindow.cpp:487
msgid "All Files"
msgstr "所有文件"
#: app/mainWindow.cpp:488
msgid "Select A File To Play"
msgstr "选择一个文件以播放"
#: app/mainWindow.cpp:714
msgid "Sorry, no media was found in the drop"
msgstr "抱歉,拖到窗口的媒体疑似不是媒体"
#: app/playDialog.cpp:28
msgid "Play Media"
msgstr "播放媒体"
#: app/playDialog.cpp:34
msgid "What media would you like to play?"
msgstr "你想要播放什么媒体?"
#: app/playDialog.cpp:39
msgid "Play File..."
msgstr "一些文件..."
#: app/playDialog.cpp:43
msgid "Play VCD"
msgstr "播放 VCD"
#: app/playDialog.cpp:47
msgid "Play DVD"
msgstr "播放 DVD"
#: app/playDialog.cpp:75
msgid "Recently Played Media"
msgstr "最近播放媒体"
#: app/playlistFile.cpp:32
msgid "The file is not a playlist"
msgstr "该文件不是一个播放列表"
#: app/playlistFile.cpp:39
#, c-format
msgid "Codeine could not download the remote playlist: %1"
msgstr "Codeine 播放器无法下载远程播放列表: %1"
#: app/playlistFile.cpp:54
msgid ""
"<qt>The playlist, <i>'%1'</i>, could not be interpreted. Perhaps it is empty?"
msgstr "<qt>播放列表 <i>'%1'</i> 无法解析。也许它是空的?"
#: app/playlistFile.cpp:58
#, c-format
msgid "Codeine could not open the file: %1"
msgstr "Codeine 无法打开该文件: %1"
#: app/stateChange.cpp:92
msgid "&Pause"
msgstr "暂停(&P)"
#: app/stateChange.cpp:92
msgid "&Play"
msgstr "播放(&P)"
#: app/stateChange.cpp:171
msgid "No media loaded"
msgstr "没有加载媒体文件"
#: app/stateChange.cpp:174
msgid "Paused"
msgstr "已暂停"
#: app/theStream.cpp:108
msgid "Metadata"
msgstr "元数据"
#: app/theStream.cpp:110
msgid "Title"
msgstr "标题"
#: app/theStream.cpp:111
msgid "Comment"
msgstr "注释"
#: app/theStream.cpp:112
msgid "Artist"
msgstr "艺术家"
#: app/theStream.cpp:113
msgid "Genre"
msgstr "分类"
#: app/theStream.cpp:114
msgid "Album"
msgstr "专辑"
#: app/theStream.cpp:115
msgid "Year"
msgstr "年份"
#: app/theStream.cpp:117
msgid "Audio Properties"
msgstr "音频属性"
#: app/theStream.cpp:119
msgid "Bitrate"
msgstr "比特率"
#: app/theStream.cpp:119
msgid "%1 bps"
msgstr "%1 BPS"
#: app/theStream.cpp:120
msgid "Sample-rate"
msgstr "采样率"
#: app/theStream.cpp:120
msgid "%1 Hz"
msgstr "%1 Hz"
#: app/theStream.cpp:122
msgid "Technical Information"
msgstr "技术信息"
#: app/theStream.cpp:124
msgid "Video Codec"
msgstr "视频编解码器"
#: app/theStream.cpp:125
msgid "Audio Codec"
msgstr "音频编解码器"
#: app/theStream.cpp:126
msgid "System Layer"
msgstr "系统布局"
#: app/theStream.cpp:127
msgid "Input Plugin"
msgstr "输入插件"
#: app/theStream.cpp:128
msgid "CDINDEX_DISCID"
msgstr "CDINDEX_DISCID"
#: app/videoSettings.cpp:92
msgid "Video Settings"
msgstr "视频设置"
#: app/videoWindow.cpp:136
msgid "Pause"
msgstr "暂停"
#: app/volumeAction.cpp:32
msgid "Toggle Mute"
msgstr ""
#: app/volumeAction.cpp:62 part/part.cpp:39
msgid "Mute"
msgstr "静音"
#: app/volumeAction.cpp:87
msgid "Volume"
msgstr "音量"
#: app/volumeAction.cpp:127
#, c-format
msgid "Volume %1"
msgstr "音量 %1"
#: app/xineConfig.cpp:46
msgid "Configure xine"
msgstr "xine 引擎设置"
#: app/xineConfig.cpp:68
msgid ""
"Xine's defaults are usually sensible and should not require modification. "
"However, full configurability is provided for your pleasure ;-)"
msgstr "Xine 的默认配置通常是合理的。但我们还是给你提供配置的可能性 ;-)"
#: app/xineEngine.cpp:147 part/xineEngine.cpp:50
msgid "xine was unable to initialize any video-drivers."
msgstr "xine 无法初始化任何视频驱动。"
#: app/xineEngine.cpp:149 part/xineEngine.cpp:48
msgid "xine was unable to initialize any audio-drivers."
msgstr "xine 无法初始化任何音频驱动。"
#: app/xineEngine.cpp:254
#, c-format
msgid "Loading media: %1"
msgstr "加载媒体: %1"
#: app/xineEngine.cpp:360
#, c-format
msgid "Recording to: %1"
msgstr "重新编码到: %1"
#: app/xineEngine.cpp:393
msgid "Playback paused"
msgstr "回放已暂停"
#: app/xineEngine.cpp:398
msgid "Playback resumed"
msgstr "回放继续"
#: app/xineEngine.cpp:411
#, c-format
msgid "There is no input plugin that can read: %1."
msgstr "这里没有可读取的输入插件: %1 。"
#: app/xineEngine.cpp:414
#, c-format
msgid "There is no demux plugin available for %1."
msgstr "这里没有可用于 %1 的解复用器插件。"
#: app/xineEngine.cpp:417
#, c-format
msgid "Demuxing failed for %1."
msgstr "解复用失败: %1。"
#: app/xineEngine.cpp:422
#, c-format
msgid "Internal error while attempting to play %1."
msgstr "尝试播放时发生内部错误 %1。"
#: app/xineEngine.cpp:748 app/xineEngine.cpp:756
#, c-format
msgid "Channel %1"
msgstr "轨道 %1"
#: app/xineEngine.cpp:855 part/xineEngine.cpp:289
msgid "The source is encrypted and can not be decrypted."
msgstr "播放原已经被加密且无法解密。"
#: app/xineEngine.cpp:857 part/xineEngine.cpp:291
msgid "The host is unknown for the URL: <i>%1</i>"
msgstr "未知的 URL 主机:<i>%1</i>"
#: app/xineEngine.cpp:859 part/xineEngine.cpp:293
msgid "The device name you specified seems invalid."
msgstr "您指定的设备名称无效。"
#: app/xineEngine.cpp:861 part/xineEngine.cpp:295
msgid "The network appears unreachable."
msgstr "网络似乎无法访问。"
#: app/xineEngine.cpp:863 part/xineEngine.cpp:297
msgid "Audio output unavailable; the device is busy."
msgstr "音频输出不可用; 设备正在忙碌中。"
#: app/xineEngine.cpp:865 part/xineEngine.cpp:299
msgid "The connection was refused for the URL: <i>%1</i>"
msgstr "URL 连接被重置: <i>%1</i>"
#: app/xineEngine.cpp:867 part/xineEngine.cpp:301
msgid "xine could not find the URL: <i>%1</i>"
msgstr "xine 无法找到该 URL: <i>%1</i>"
#: app/xineEngine.cpp:869 part/xineEngine.cpp:303
msgid "Access was denied for the URL: <i>%1</i>"
msgstr "URL 访问被拒绝: <i>%1</i>"
#: app/xineEngine.cpp:871 part/xineEngine.cpp:305
msgid "The source cannot be read for the URL: <i>%1</i>"
msgstr "URL 对应源无法读取: <i>%1</i>"
#: app/xineEngine.cpp:873 part/xineEngine.cpp:307
msgid "A problem occurred while loading a library or decoder."
msgstr "加载库或解码器时出现问题。"
#: app/xineEngine.cpp:900 part/xineEngine.cpp:334
msgid "Sorry, no additional information is available."
msgstr "抱歉,没有信息可用。"
#: part/xineEngine.cpp:166
msgid "The Codeine video player could not find an input plugin for '%1'."
msgstr "Codeine 视频播放器找不到 '%1' 对应的输入插件。"
#: part/xineEngine.cpp:169
msgid "The Codeine video player could not find a demux plugin for '%1'."
msgstr "Codeine 视频播放器无法找不到 '%1' 对应的解复用器插件。"
#: part/xineEngine.cpp:172
msgid ""
"The Codeine video player failed to demux '%1'; please check your xine "
"installation."
msgstr "Codeine 视频播放起无法复用 '%1'; 请检查 xine 安装。"
#: part/xineEngine.cpp:177
msgid ""
"The Codeine video player reports an internal error; please check your xine "
"installation."
msgstr "Codeine 视频播放器出现了内部错误; 请检查 xine 安装。"
Loading…
Cancel
Save