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@"
// 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
significant byte first (like Motorola and SPARC, unlike Intel). */

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

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

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

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

@ -4,107 +4,18 @@
#include "analyzer.h"
#include "../codeine.h"
#include "../debug.h"
#include <cmath> //interpolate()
#include <tdeglobalsettings.h>
#include <math.h> //interpolate()
#include <tqevent.h> //event()
#include "xineEngine.h"
#include "fht.cpp"
template<class W>
Analyzer::Base<W>::Base( TQWidget *parent, uint timeout, uint scopeSize )
Analyzer::Base<W>::Base( TQWidget *parent, uint timeout )
: W( parent, "Analyzer" )
, 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
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 )
: Base<TQWidget>( parent, timeout, scopeSize )
Analyzer::Base2D::Base2D( TQWidget *parent, uint timeout )
: Base<TQWidget>( parent, timeout )
{
setWFlags( TQt::WNoAutoErase ); //no flicker
connect( &m_timer, TQ_SIGNAL(timeout()), TQ_SLOT(draw()) );
}
void
Analyzer::Base2D::resizeEvent( TQResizeEvent *e)
{
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)
Analyzer::Base2D::draw()
{
// -1 is padding, no drawing takes place there
setMinimumSize(MIN_COLUMNS * (WIDTH + 1) - 1, MIN_ROWS * (HEIGHT + 1) - 1);
setMaximumWidth(MAX_COLUMNS * (WIDTH + 1) - 1);
for (auto &m_fadeBar : m_fadeBars)
switch( Codeine::engine()->state() ) {
case Engine::Playing:
{
m_fadeBar.resize(1, 1);
}
}
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() );
const Engine::Scope &thescope = Codeine::engine()->scope();
static Analyzer::Scope scope( Analyzer::SCOPE_SIZE );
m_fht->spectrum( front );
m_fht->scale( front, 1.0 / 20 );
for( int x = 0; x < Analyzer::SCOPE_SIZE; ++x )
scope[x] = double(thescope[x]) / (1<<15);
//the second half is pretty dull, so only show it if the user has a large analyzer
//by setting to m_scope.size() if large we prevent interpolation of large analyzers, this is good!
s.resize( m_scope.size() <= MAX_COLUMNS/2 ? MAX_COLUMNS/2 : m_scope.size() );
}
transform( scope );
analyze( scope );
scope.resize( Analyzer::SCOPE_SIZE );
void
Analyzer::Block::analyze( const Analyzer::Scope &s )
{
// 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));
bitBlt( this, 0, 0, canvas() );
break;
}
case Engine::Paused:
break;
for (unsigned x = 0; x < m_store.size(); ++x)
{
bitBlt(canvas(), x * (WIDTH + 1), int(m_store[x]) * (HEIGHT + 1) + m_y, &m_topBarPixmap);
default:
erase();
}
}
static void adjustToLimits(const int &b, int &f, unsigned &amount)
void
Analyzer::Base2D::resizeEvent( TQResizeEvent* )
{
// with a range of 0-255 and maximum adjustment of amount,
// maximise the difference between f and b
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;
}
}
m_canvas.resize( size() );
m_canvas.fill( colorGroup().background() );
}
/**
* 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);
// 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;
// Author: Max Howell <max.howell@methylblue.com>, (C) 2003
// Copyright: See COPYING file that comes with this distribution
#undef amount
// #undef STAMP
}
#include <tqpainter.h>
void Analyzer::Block::paletteChange(const TQPalette&)
Analyzer::Block::Block( TQWidget *parent )
: Analyzer::Base2D( parent, 20 )
{
const TQColor bg = palette().active().background();
const TQColor fg = ensureContrast(bg, TDEGlobalSettings::activeTitleColor());
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);
setMinimumWidth( 64 ); //-1 is padding, no drawing takes place there
setMaximumWidth( 128 );
TQPainter p(bar());
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();
//TODO yes, do height for width
}
void Analyzer::Block::resizeEvent(TQResizeEvent *e)
void
Analyzer::Block::transform( Analyzer::Scope &scope ) //pure virtual
{
TQWidget::resizeEvent(e);
canvas()->resize(size());
background()->resize(size());
const uint oldRows = m_rows;
static FHT fht( Analyzer::SCOPE_SIZE_EXP );
// all is explained in analyze()..
// +1 to counter -1 in maxSizes, trust me we need this!
m_columns = kMax(uint(double(width() + 1) / (WIDTH + 1)), (uint)MAX_COLUMNS);
m_rows = uint(double(height() + 1) / (HEIGHT + 1));
for( uint x = 0; x < scope.size(); ++x )
scope[x] *= 2;
// this is the y-offset for drawing from the top of the widget
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();
}
float *front = static_cast<float*>( &scope.front() );
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();
const TQColor bgdark = bg.dark(112);
canvas()->fill( colorGroup().foreground().light() );
background()->fill(bg);
TQPainter p( canvas() );
p.setPen( colorGroup().background() );
TQPainter p(background());
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);
}
}
const double F = double(height()) / (log10( 256 ) * 1.1 /*<- max. amplitude*/);
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;
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;
}
return w / 2;
}
#include "analyzer.moc"

@ -8,7 +8,6 @@
#include <sys/types.h>
#endif
#include "fht.h"
#include <tqpixmap.h> //stack allocated and convenience
#include <tqtimer.h> //stack allocated
#include <tqwidget.h> //baseclass
@ -24,13 +23,10 @@ namespace Analyzer
uint timeout() const { return m_timeout; }
protected:
Base( TQWidget*, uint, uint = 7 );
~Base() { delete m_fht; }
Base( TQWidget*, uint );
void drawFrame();
virtual void transform( Scope& ) = 0;
virtual void analyze( const Scope& ) = 0;
virtual void demo();
private:
virtual bool event( TQEvent* );
@ -38,91 +34,42 @@ namespace Analyzer
protected:
TQTimer m_timer;
uint m_timeout;
FHT *m_fht;
};
class Base2D : public Base<TQWidget>
{
TQ_OBJECT
public:
const TQPixmap *background() const { return &m_background; }
const TQPixmap *canvas() const { return &m_canvas; }
private slots:
void draw() { drawFrame(); bitBlt(this, 0, 0, canvas()); }
void draw();
protected:
Base2D( TQWidget*, uint timeout, uint scopeSize = 7 );
Base2D( TQWidget*, uint timeout );
TQPixmap *background() { return &m_background; }
TQPixmap *canvas() { return &m_canvas; }
void eraseCanvas()
{
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;
void paintEvent( TQPaintEvent* ) { if( !m_canvas.isNull() ) bitBlt( this, 0, 0, canvas() ); }
void resizeEvent( TQResizeEvent* );
private:
TQPixmap m_background;
TQPixmap m_canvas;
};
class Block : public Analyzer::Base2D
{
public:
explicit 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;
Block( TQWidget* );
protected:
virtual void transform( 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.
Scope m_scope;
TQPixmap m_barPixmap;
TQPixmap m_topBarPixmap;
virtual int heightForWidth( int ) const;
// Current bar heights
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;
virtual void show() {} //TODO temporary as the scope plugin causes freezes
};
void interpolate(const Scope&, Scope&);
}
#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 <kstatusbar.h>
#include <kstdguiitem.h>
#include <tqapplication.h>
#include <tqdialog.h>
#include <tqhbox.h>
#include <tqlabel.h>
@ -70,16 +69,7 @@ public:
, m_title( TheStream::prettyTitle() )
{
(new TQVBoxLayout( this ))->setAutoAdd( true );
// 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 );
}
(new TQLabel( this ))->setPixmap( frame );
TQHBox *box = new TQHBox( this );
KPushButton *o = new KPushButton( KStdGuiItem::save(), box );
@ -251,34 +241,28 @@ VideoWindow::captureFrame() const
DEBUG_BLOCK
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();
int yuv_size = ((w + 8) * (h + 1)) * 2;
uint8_t *yuv = new(std::nothrow) uint8_t[yuv_size];
if (yuv == nullptr) {
uint8_t *yuv = new uint8_t[((w+8) * (h+1) * 2)];
if( yuv == 0 ) {
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
uint8_t *y = nullptr;
uint8_t *u = nullptr;
uint8_t *v = nullptr;
uint8_t *y = 0, *u = 0, *v = 0;
switch( format )
{
case XINE_IMGFMT_YUY2: {
uint8_t *yuy2 = yuv;
yuv = new(std::nothrow) uint8_t[(w * h * 2)];
if (yuv == nullptr) {
yuv = new uint8_t[(w * h * 2)];
if( yuv == 0 ) {
Debug::error() << "Not enough memory to make screenframe!\n";
delete [] yuy2;
return TQImage();
}
return TQImage(); }
y = yuv;
u = yuv + w * h;
@ -303,7 +287,7 @@ VideoWindow::captureFrame() const
// convert to rgb
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;
return frame;

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

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

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

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

@ -11,14 +11,11 @@ class KURL;
class TQLabel;
class TQPopupMenu;
class TQSlider;
class TQWidgetStack;
class VolumeAction;
namespace Codeine
{
class AudioView;
class MainWindow : public TDEMainWindow
{
TQ_OBJECT
@ -43,10 +40,9 @@ namespace Codeine
void engineStateChanged( Engine::State );
void init();
void showTime( int = -1 );
void setChannels( const TQStringList& );
void aboutToShowMenu();
void fullScreenToggled( bool );
void setAudioChannels(const TQStringList&) const;
void setSubtitleChannels(const TQStringList&) const;
void toggleAnalyzer();
private:
void setupActions();
@ -54,9 +50,8 @@ namespace Codeine
bool load( 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 dragEnterEvent( TQDragEnterEvent* );
virtual void dropEvent( TQDropEvent* );
@ -71,14 +66,8 @@ namespace Codeine
TQLabel *m_timeLabel;
TQLabel *m_titleLabel;
TQWidget *m_analyzer;
AudioView *m_audioView;
TQWidgetStack *m_widgetStack;
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
MainWindow( const MainWindow& );
MainWindow &operator=( const MainWindow& );

@ -25,7 +25,7 @@ namespace Codeine {
PlayDialog::PlayDialog( TQWidget *parent, bool be_welcome_dialog )
: TQDialog( parent )
{
setCaption( tdeApp->makeStdCaption( i18n("Play Media") ) );
setCaption( kapp->makeStdCaption( i18n("Play Media") ) );
TQSignalMapper *mapper = new TQSignalMapper( 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 ) {
TQWidget *w = new KPushButton( KStdGuiItem::quit(), this );
hbox->addWidget( w );
connect( w, TQ_SIGNAL(clicked()), tdeApp, TQ_SLOT(quit()) );
connect( w, TQ_SIGNAL(clicked()), kapp, TQ_SLOT(quit()) );
}
hbox->addWidget( closeButton );
@ -93,7 +93,7 @@ PlayDialog::createRecentFileWidget( TQBoxLayout *layout )
for( KURL::List::ConstIterator it = urls.begin(), end = urls.end(); it != end; ++it ) {
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() ) {

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

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

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

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

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

@ -24,7 +24,7 @@
TQString i18n(const char *text);
KDialogBase *XineConfigDialog::s_instance = nullptr;
KDialogBase *XineConfigDialog::s_instance = 0;
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
XineConfigDialog::XineConfigDialog( xine_t *xine, TQWidget *parent )
@ -52,26 +68,32 @@ XineConfigDialog::XineConfigDialog( xine_t *xine, TQWidget *parent )
DEBUG_BLOCK
s_instance = this;
const int METRIC = fontMetrics().width( 'x' );
const int METRIC_3B2 = (3*METRIC)/2;
TQWidget *page = new TQWidget(this);
setMainWidget(page);
TQVBoxLayout *topLayout = new TQVBoxLayout(page, 0, spacingHint());
TQVBox *box = new TQVBox( this );
box->setSpacing( METRIC );
setMainWidget( box );
{
TQHBoxLayout *infoLayout = new TQHBoxLayout(topLayout, spacingHint());
TQPixmap info = tdeApp->iconLoader()->loadIcon("messagebox_info", TDEIcon::NoGroup, TDEIcon::SizeMedium, TDEIcon::DefaultState, nullptr, true);
TQLabel *label = new TQLabel(page);
label->setPixmap(info);
label->setSizePolicy(TQSizePolicy::Maximum, TQSizePolicy::Maximum);
infoLayout->addWidget(label);
label = new TQLabel(i18n(
"Xine's defaults are usually sensible and should not require modification. "
"However, full configurability is provided for your pleasure ;-)"), page);
label->setAlignment(TQLabel::WordBreak | TQLabel::AlignVCenter);
infoLayout->addWidget(label);
TQHBox *hbox = new TQHBox( box );
hbox->setSpacing( METRIC_3B2 );
hbox->setMargin( METRIC_3B2 );
TQPixmap info = kapp->iconLoader()->loadIcon( "messagebox_info", TDEIcon::NoGroup, TDEIcon::SizeMedium, TDEIcon::DefaultState, 0, true );
TQLabel *label = new TQLabel( hbox );
label->setPixmap( info );
label->setSizePolicy( TQSizePolicy::Maximum, TQSizePolicy::Maximum );
label = new TQLabel( i18n(
"xine's defaults are usually sensible and should not require modification. "
"However, full configurability is provided for your pleasure ;-)." ), hbox );
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 {
xine_t *m_xine;
@ -80,54 +102,56 @@ XineConfigDialog::XineConfigDialog( xine_t *xine, TQWidget *parent )
public:
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 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;
}
if (pageName != currentPageName) {
currentPageName = pageName;
TQString tabTitle = pageName;
tabTitle[0] = tabTitle[0].upper();
view = new TQScrollView(page);
view->setHScrollBarMode(TQScrollView::ScrollBarMode::AlwaysOff);
// TODO: It would be nice to leave VScrollBarMode on Auto, but
// there seems to be an issue when calculating the layout size.
// https://mirror.git.trinitydesktop.org/gitea/TDE/codeine/pulls/18
view->setVScrollBarMode(TQScrollView::ScrollBarMode::AlwaysOn);
view->setResizePolicy(TQScrollView::AutoOneFit);
view->setFrameShape(TQFrame::NoFrame);
tabs->addTab(view, tabTitle);
scrollWidget = new TQWidget(view->viewport());
view->addChild(scrollWidget);
grid = new TQGridLayout(scrollWidget, 0, 2, marginHint(), spacingHint());
grid->setColStretch(0, 3);
grid->setColStretch(1, 2);
grid->setAlignment(TQt::AlignTop | TQt::AlignAuto);
if( pageName != currentPage ) {
if( view )
//NOTE won't be executed for last tab
view->viewport()->setMinimumWidth( grid->sizeHint().width() ); // seems necessary
TQString pageTitle = pageName;
pageTitle[0] = pageTitle[0].upper();
tabs->addTab( view = new TQScrollView, pageTitle );
view->setResizePolicy( TQScrollView::AutoOneFit );
view->setHScrollBarMode( TQScrollView::AlwaysOff );
view->setFrameShape( TQFrame::NoFrame );
view->addChild( parent = new TQWidget( view->viewport() ) );
TQBoxLayout *layout = new TQVBoxLayout( parent, /*margin*/METRIC_3B2, /*spacing*/0 );
parent = new TQFrame( parent );
static_cast<TQFrame*>(parent)->setFrameStyle( TQFrame::Panel | TQFrame::Raised );
static_cast<TQFrame*>(parent)->setLineWidth( 2 );
grid = new TQGridLayout( parent, /*rows*/0, /*cols*/2, /*margin*/20, /*spacing*/int(METRIC*2.5) );
grid->setColStretch( 0, 3 );
grid->setColStretch( 1, 2 );
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
m_entrys.setAutoDelete(true);
topLayout->addWidget(tabs, 1);
//finishing touches
m_entrys.setAutoDelete( true );
enableButton( Ok, false );
enableButton( User1, false );
@ -147,7 +171,7 @@ XineConfigDialog::slotHelp()
void
XineConfigDialog::slotUser1()
{
for (TQPtrListIterator<XineConfigEntry> it(m_entrys); *it != nullptr; ++it)
for( TQPtrListIterator<XineConfigEntry> it( m_entrys ); *it != 0; ++it )
(*it)->reset();
slotHelp();
@ -156,8 +180,8 @@ XineConfigDialog::slotUser1()
bool
XineConfigDialog::isUnsavedSettings() const
{
for (TQPtrListIterator<XineConfigEntry> it(m_entrys); *it != nullptr; ++it)
if ((*it)->isChanged())
for( TQPtrListIterator<XineConfigEntry> it( m_entrys ); *it != 0; ++it )
if( (*it)->isChanged() )
return true;
return false;
@ -178,13 +202,13 @@ XineConfigDialog::saveSettings()
///@class XineConfigEntry
XineConfigEntry::XineConfigEntry( TQWidget *parent, TQGridLayout *grid, xine_cfg_entry_t *entry )
: m_widget( nullptr )
: m_widget( 0 )
, m_key( entry->key )
, m_string( entry->str_value )
, m_number( entry->num_value )
{
TQWidget *&w = m_widget;
const char *signal = nullptr;
const char *signal = 0;
const int row = grid->numRows();
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( description, tip );
grid->addWidget( description, row, 0, TQt::AlignVCenter );
// grid->addWidget( description, row, 0, TQt::AlignVCenter );
grid->addWidget( w, row, 1, TQt::AlignTop );
}

@ -25,20 +25,19 @@
namespace Codeine {
VideoWindow *VideoWindow::s_instance = nullptr;
VideoWindow *VideoWindow::s_instance = 0;
bool VideoWindow::s_logarithmicVolume = false;
VideoWindow::VideoWindow( TQWidget *parent )
: TQWidget( parent, "VideoWindow" )
, m_osd( nullptr )
, m_stream( nullptr )
, m_eventQueue( nullptr )
, m_videoPort( nullptr )
, m_audioPort( nullptr )
, m_post( nullptr )
, m_xine( nullptr )
, m_scope( Analyzer::SCOPE_SIZE * 2 ) // Multiply by two to account for interleaved PCM.
, m_osd( 0 )
, m_stream( 0 )
, m_eventQueue( 0 )
, m_videoPort( 0 )
, m_audioPort( 0 )
, m_scope( 0 )
, m_xine( 0 )
, m_current_vpts( 0 )
{
DEBUG_BLOCK
@ -52,6 +51,10 @@ VideoWindow::VideoWindow( TQWidget *parent )
setPaletteBackgroundColor( TQt::black );
setFocusPolicy( ClickFocus );
//TODO sucks
//TODO namespace this?
myList->next = myList; //init the buffer list
// 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 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_audioPort ) xine_close_audio_driver( m_xine, m_audioPort );
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 );
cleanUpVideo();
@ -116,7 +119,7 @@ VideoWindow::init()
if( !m_xine )
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";
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() );
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";
m_stream = xine_stream_new( m_xine, m_audioPort, m_videoPort );
@ -158,9 +161,9 @@ VideoWindow::init()
debug() << "scope_plugin_new()\n";
#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)
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
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
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
// 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_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 );
}
@ -370,8 +373,6 @@ VideoWindow::stop()
{
xine_stop( m_stream );
std::fill(m_scope.begin(), m_scope.end(), 0);
announceStateChange();
}
@ -455,12 +456,6 @@ VideoWindow::posTimeLength( PosTimeLength type ) const
return 0; //--warning
}
bool
VideoWindow::isMuted() const
{
return xine_get_param(m_stream, XINE_PARAM_AUDIO_AMP_MUTE);
}
uint
VideoWindow::volume() const
{
@ -523,6 +518,12 @@ VideoWindow::seek( uint pos )
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
//NOTE doesn't work! I can't tell why..
Slider::instance()->TQSlider::setValue( pos );
@ -578,18 +579,18 @@ VideoWindow::setStreamParameter( int value )
parameter = XINE_PARAM_VO_CONTRAST;
else if( sender == "brightness" )
parameter = XINE_PARAM_VO_BRIGHTNESS;
else if( sender == "subtitle_channels_select" )
else if( sender == "subtitle_channels_menu" )
parameter = XINE_PARAM_SPU_CHANNEL,
value -= 2;
else if( sender == "audio_channels_select" )
else if( sender == "audio_channels_menu" )
parameter = XINE_PARAM_AUDIO_CHANNEL_LOGICAL,
value -= 2;
else if( sender == "aspect_ratio_select" )
else if( sender == "aspect_ratio_menu" )
parameter = XINE_PARAM_VO_ASPECT_RATIO;
else if( sender == "volume" )
{
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)
{
value = makeVolumeLogarithmic(value);
@ -601,38 +602,23 @@ VideoWindow::setStreamParameter( int 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&
VideoWindow::scope()
{
using Analyzer::SCOPE_SIZE;
if (!m_post || !m_stream || xine_get_status(m_stream) != XINE_STATUS_PLAY)
{
return m_scope;
}
static Engine::Scope scope( SCOPE_SIZE );
MyNode *const myList = scope_plugin_list(m_post);
const int64_t pts_per_smpls = scope_plugin_pts_per_smpls(m_post);
const int channels = scope_plugin_channels(m_post);
int scopeIdx = 0;
if (channels > 2)
{
return m_scope;
}
if( xine_get_status( m_stream ) != XINE_STATUS_PLAY )
return scope;
//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 )
if( node->vpts <= m_current_vpts && (!best_node || node->vpts > best_node->vpts) )
@ -651,10 +637,10 @@ VideoWindow::scope()
data16 = best_node->mem;
data16 += diff;
diff += diff % channels; // important correction to ensure we don't overflow the buffer.
diff /= channels; // use units of frames, not samples.
diff += diff % channels; //important correction to ensure we don't overflow the buffer
diff /= channels;
// calculate the number of available samples in this buffer.
int
n = best_node->num_frames;
n -= diff;
n += frame; //clipping for # of frames we need
@ -664,52 +650,33 @@ VideoWindow::scope()
for( int a, c; frame < n; ++frame, data16 += channels ) {
for( a = c = 0; c < channels; ++c )
{
// now we give interleaved PCM to the scope.
m_scope[scopeIdx++] = data16[c];
if (channels == 1)
{
// Duplicate mono samples.
m_scope[scopeIdx++] = data16[c];
}
}
a += data16[c];
a /= channels;
scope[frame] = a;
}
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
}
return m_scope;
return scope;
}
void
VideoWindow::timerEvent( TQTimerEvent* )
{
if (!m_stream)
{
return;
}
/// here we prune the buffer list regularly
MyNode *myList = scope_plugin_list(m_post);
if (!myList)
{
return;
}
MyNode * const first_node = myList->next;
MyNode const * const list_end = myList;
// 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)
? xine_get_current_vpts( m_stream )
: 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
if( node->vpts_end < m_current_vpts ) {
prev->next = node->next;
@ -742,19 +709,19 @@ VideoWindow::customEvent( TQCustomEvent *e )
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 );
for( int j = 0; j < channels; j++ )
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 );
for( int j = 0; j < channels; j++ )
languages += xine_get_audio_lang( m_stream, j, s ) ? s : i18n("Channel %1").arg( j+1 );
emit audioChannelsChanged(languages);
emit channelsChanged( languages );
}
break;
}
@ -913,7 +880,7 @@ VideoWindow::toggleDVDMenu()
{
xine_event_t e;
e.type = XINE_EVENT_INPUT_MENU1;
e.data = nullptr;
e.data = NULL;
e.data_length = 0;
xine_event_send( m_stream, &e );
@ -935,37 +902,13 @@ VideoWindow::fileFilter() const
{
char *supportedExtensions = xine_get_file_extensions( m_xine );
TQString filter("*.");
filter.append(supportedExtensions);
// Remove protocols
filter.remove(" dvb://");
filter.remove(" dvbc://");
filter.remove(" dvbs://");
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);
TQString filter( "*." );
filter.append( supportedExtensions );
filter.remove( "txt" );
filter.remove( "png" );
filter.replace( ' ', " *." );
std::free( supportedExtensions );
return filter;
}

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

@ -4,38 +4,16 @@
/* need access to port_ticket */
#define XINE_ENGINE_INTERNAL
#define LOG_MODULE "codine-scope"
#define LOG_LEVEL LOG_LEVEL_DEBUG
// #define LOG
#include "xineScope.h"
#include <xine/post.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)
{
scope_plugin_t *self = post;
return self->channels;
}
static MyNode theList;
static int myChannels = 0;
static int64_t pts_per_smpls;
MyNode *scope_plugin_list(void *post)
{
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;
}
MyNode* const myList = &theList;
/*************************
* post plugin functions *
@ -44,10 +22,7 @@ int64_t scope_plugin_pts_per_smpls(void *post)
static int
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;
scope_plugin_t *self = (scope_plugin_t *)port->post;
_x_post_rewire( (post_plugin_t*)port->post );
_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->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 );
#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)
self->pts_per_smpls = ((uint32_t)90000 * (uint32_t)32768) / rate;
pts_per_smpls = ((uint32_t)90000 * (uint32_t)32768) / rate;
#else
self->pts_per_smpls = stream->metronom->pts_per_smpls;
pts_per_smpls = stream->metronom->pts_per_smpls;
#endif
return ret;
}
@ -72,17 +47,7 @@ scope_port_open( xine_audio_port_t *port_gen, xine_stream_t *stream, uint32_t bi
static void
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;
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->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 )
{
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 */
/* 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; }
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) );
#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
K = self->pts_per_smpls; /*smpls = 1<<16 samples*/
K = pts_per_smpls; /*smpls = 1<<16 samples*/
K *= num_samples;
K /= (1<<16);
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
* NOTE this is thread-safe due to the way we handle the list in the GUI thread */
new_node->next = self->list->next;
self->list->next = new_node;
new_node->next = myList->next;
myList->next = new_node;
}
static void
scope_dispose( post_plugin_t *this )
{
MyNode *list = ((scope_plugin_t *)this)->list;
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);
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 )
return NULL;
scope_plugin_t *scope_plugin = calloc(1, sizeof(scope_plugin_t));
post_plugin_t *post_plugin = (post_plugin_t *)scope_plugin;
post_plugin_t *post_plugin = calloc( 1, sizeof(post_plugin_t) );
{
post_plugin_t *this = post_plugin;
post_in_t *input;
post_out_t *output;
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) || \
(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.put_buffer = scope_port_put_buffer;
post_plugin->xine_post.audio_input[0] = &port->new_port;
post_plugin->xine_post.type = PLUGIN_POST;
this->xine_post.audio_input[0] = &port->new_port;
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) || \
@ -204,12 +153,6 @@ xine_post_t* scope_plugin_new( xine_t *xine, xine_audio_port_t *audio_target )
post_plugin->xine = xine;
#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) || \
(XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION == 2 && XINE_SUB_VERSION >= 10)
return post_plugin;
@ -218,6 +161,11 @@ xine_post_t* scope_plugin_new( xine_t *xine, xine_audio_port_t *audio_target )
#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) || \
(XINE_MAJOR_VERSION == 1 && XINE_MINOR_VERSION == 2 && XINE_SUB_VERSION >= 10)
static void *scope_init_plugin(xine_t *xine, const void *data)

@ -33,23 +33,18 @@ struct my_node_s
int64_t vpts_end;
};
extern MyNode* const myList;
#ifdef __cplusplus
extern "C"
{
#endif
#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)
extern const plugin_info_t scope_plugin_info[];
#else
xine_post_t* scope_plugin_new( xine_t*, xine_audio_port_t* );
#endif
int scope_plugin_channels(void *);
MyNode *scope_plugin_list(void *);
int64_t scope_plugin_pts_per_smpls(void *);
#ifdef __cplusplus
int64_t scope_plugin_pts_per_smpls( void* );
}
#endif

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

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

@ -37,7 +37,7 @@ VideoWindow::init()
m_videoPort = xine_open_video_driver( m_xine, "auto", XINE_VISUAL_TYPE_X11, x11Visual() );
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";
m_stream = xine_stream_new( m_xine, m_audioPort, m_videoPort );

@ -1,14 +1,13 @@
# SOME DESCRIPTIVE TITLE.
# This file is put in the public domain.
# Eduardo Herrera <edhu21@gmail.com>, 2023.
# Juan M Ayala <linux.zero@yahoo.com>, 2025.
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: 2025-01-20 18:16+0000\n"
"Last-Translator: Juan M Ayala <linux.zero@yahoo.com>\n"
"PO-Revision-Date: 2023-03-21 23:14+0000\n"
"Last-Translator: Eduardo Herrera <edhu21@gmail.com>\n"
"Language-Team: Spanish <https://mirror.git.trinitydesktop.org/weblate/"
"projects/applications/codeine-desktop-files/es/>\n"
"Language: es\n"
@ -16,12 +15,12 @@ msgstr ""
"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"
"X-Generator: Weblate 4.16.1\n"
#. Name
#: codeine.desktop:3 codeine_part.desktop:3
msgid "Codeine"
msgstr "Codeine"
msgstr ""
#. GenericName
#: codeine.desktop:5
@ -37,7 +36,7 @@ msgstr ""
#. Comment
#: codeine_part.desktop:5
msgid "Embeddable Video Player"
msgstr "Reproductor de Vídeo Integrable"
msgstr ""
#. Name
#: 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.
# This file is put in the public domain.
# Toad114514 <xiaolan2332021@163.com>, 2025.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
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: 2025-01-28 07:12+0000\n"
"Last-Translator: Toad114514 <xiaolan2332021@163.com>\n"
"Language-Team: Chinese (Simplified) <https://mirror.git.trinitydesktop.org/"
"weblate/projects/applications/codeine-desktop-files/zh_Hans/>\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: zh_CN\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"
#. Name
#: codeine.desktop:3 codeine_part.desktop:3
msgid "Codeine"
msgstr "Codeine"
msgstr ""
#. GenericName
#: codeine.desktop:5
@ -30,12 +29,12 @@ msgstr "媒体播放器"
#. Comment
#: codeine.desktop:7
msgid "Video player for TDE designed to be as simple as possible"
msgstr "尽可能设计得简单的 TDE 视频播放器"
msgstr ""
#. Comment
#: codeine_part.desktop:5
msgid "Embeddable Video Player"
msgstr "内嵌视频播放器"
msgstr ""
#. Name
#: codeine_play_dvd.desktop:8

@ -5,7 +5,7 @@
msgid ""
msgstr ""
"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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -44,30 +44,26 @@ msgstr ""
msgid "<b>Adjust video scale?"
msgstr ""
#: app/audioView.cpp:48 app/mainWindow.cpp:332
msgid "Show Analyzer"
msgstr ""
#: app/captureFrame.cpp:92
#: app/captureFrame.cpp:82
#, c-format
msgid "Capture - %1"
msgstr ""
#: app/captureFrame.cpp:108
#: app/captureFrame.cpp:98
msgid ""
"*.png|PNG Format\n"
"*.jpeg|JPEG Format"
msgstr ""
#: app/captureFrame.cpp:110
#: app/captureFrame.cpp:100
msgid "Save Frame"
msgstr ""
#: app/captureFrame.cpp:121
#: app/captureFrame.cpp:111
msgid "%1 saved successfully"
msgstr ""
#: app/captureFrame.cpp:123
#: app/captureFrame.cpp:113
#, c-format
msgid "Sorry, could not save %1"
msgstr ""
@ -84,19 +80,19 @@ msgstr ""
msgid "Determine &Automatically"
msgstr ""
#: app/insertAspectRatioMenuItems.cpp:17
#: app/insertAspectRatioMenuItems.cpp:18
msgid "&Square (1:1)"
msgstr ""
#: app/insertAspectRatioMenuItems.cpp:18
#: app/insertAspectRatioMenuItems.cpp:19
msgid "&4:3"
msgstr ""
#: app/insertAspectRatioMenuItems.cpp:19
#: app/insertAspectRatioMenuItems.cpp:20
msgid "Ana&morphic (16:9)"
msgstr ""
#: app/insertAspectRatioMenuItems.cpp:20
#: app/insertAspectRatioMenuItems.cpp:21
msgid "&DVB (2.11:1)"
msgstr ""
@ -136,83 +132,79 @@ msgstr ""
msgid "Patches, advice and moral support"
msgstr ""
#: app/mainWindow.cpp:143
msgid "Aspect Ratio"
#: app/mainWindow.cpp:131
msgid "&Subtitles"
msgstr ""
#: app/mainWindow.cpp:149
msgid "Audio Channels"
#: app/mainWindow.cpp:132
msgid "A&udio Channels"
msgstr ""
#: app/mainWindow.cpp:155
msgid "Subtitles"
#: app/mainWindow.cpp:133
msgid "Aspect &Ratio"
msgstr ""
#: app/mainWindow.cpp:277
#: app/mainWindow.cpp:250
msgid "Play &Media..."
msgstr ""
#: app/mainWindow.cpp:283
#: app/mainWindow.cpp:256
msgid "Record"
msgstr ""
#: app/mainWindow.cpp:285
#: app/mainWindow.cpp:258
msgid "Reset Video Scale"
msgstr ""
#: app/mainWindow.cpp:286 app/mainWindow.cpp:650
#: app/mainWindow.cpp:259 app/mainWindow.cpp:592
msgid "Media Information"
msgstr ""
#: app/mainWindow.cpp:287
#: app/mainWindow.cpp:260
msgid "Menu Toggle"
msgstr ""
#: app/mainWindow.cpp:288
#: app/mainWindow.cpp:261
msgid "&Capture Frame"
msgstr ""
#: app/mainWindow.cpp:290
#: app/mainWindow.cpp:263
msgid "Video Settings..."
msgstr ""
#: app/mainWindow.cpp:291
#: app/mainWindow.cpp:264
msgid "Configure xine..."
msgstr ""
#: app/mainWindow.cpp:293
#: app/mainWindow.cpp:266
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
#: app/mainWindow.cpp:364
msgid "Codeine was asked to open an empty URL; it cannot."
msgstr ""
#: app/mainWindow.cpp:487
#: app/mainWindow.cpp:426
msgid "Supported Media Formats"
msgstr ""
#: app/mainWindow.cpp:487
#: app/mainWindow.cpp:426
msgid "All Files"
msgstr ""
#: app/mainWindow.cpp:488
#: app/mainWindow.cpp:427
msgid "Select A File To Play"
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"
msgstr ""
@ -259,19 +251,19 @@ msgstr ""
msgid "Codeine could not open the file: %1"
msgstr ""
#: app/stateChange.cpp:92
#: app/stateChange.cpp:89
msgid "&Pause"
msgstr ""
#: app/stateChange.cpp:92
#: app/stateChange.cpp:89
msgid "&Play"
msgstr ""
#: app/stateChange.cpp:171
#: app/stateChange.cpp:153
msgid "No media loaded"
msgstr ""
#: app/stateChange.cpp:174
#: app/stateChange.cpp:156
msgid "Paused"
msgstr ""
@ -355,128 +347,128 @@ msgstr ""
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
#: app/volumeAction.cpp:51
msgid "Volume"
msgstr ""
#: app/volumeAction.cpp:127
#: app/volumeAction.cpp:81 app/volumeAction.cpp:95
#, c-format
msgid "Volume %1"
msgid "Volume: %1"
msgstr ""
#: app/xineConfig.cpp:46
#: app/xineConfig.cpp:62
msgid "Configure xine"
msgstr ""
#: app/xineConfig.cpp:68
#: app/xineConfig.cpp:87
msgid ""
"Xine's defaults are usually sensible and should not require modification. "
"However, full configurability is provided for your pleasure ;-)"
"xine's defaults are usually sensible and should not require modification. "
"However, full configurability is provided for your pleasure ;-)."
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."
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."
msgstr ""
#: app/xineEngine.cpp:254
#: app/xineEngine.cpp:257
#, c-format
msgid "Loading media: %1"
msgstr ""
#: app/xineEngine.cpp:360
#: app/xineEngine.cpp:363
#, c-format
msgid "Recording to: %1"
msgstr ""
#: app/xineEngine.cpp:393
#: app/xineEngine.cpp:394
msgid "Playback paused"
msgstr ""
#: app/xineEngine.cpp:398
#: app/xineEngine.cpp:399
msgid "Playback resumed"
msgstr ""
#: app/xineEngine.cpp:411
#: app/xineEngine.cpp:412
#, c-format
msgid "There is no input plugin that can read: %1."
msgstr ""
#: app/xineEngine.cpp:414
#: app/xineEngine.cpp:415
#, c-format
msgid "There is no demux plugin available for %1."
msgstr ""
#: app/xineEngine.cpp:417
#: app/xineEngine.cpp:418
#, c-format
msgid "Demuxing failed for %1."
msgstr ""
#: app/xineEngine.cpp:422
#: app/xineEngine.cpp:423
#, c-format
msgid "Internal error while attempting to play %1."
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
msgid "Channel %1"
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."
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>"
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."
msgstr ""
#: app/xineEngine.cpp:861 part/xineEngine.cpp:295
#: app/xineEngine.cpp:828 part/xineEngine.cpp:295
msgid "The network appears unreachable."
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."
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>"
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>"
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>"
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>"
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."
msgstr ""
#: app/xineEngine.cpp:900 part/xineEngine.cpp:334
#: app/xineEngine.cpp:867 part/xineEngine.cpp:334
msgid "Sorry, no additional information is available."
msgstr ""
#: part/part.cpp:39
msgid "Mute"
msgstr ""
#: part/xineEngine.cpp:166
msgid "The Codeine video player could not find an input plugin for '%1'."
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